File: builtin-assumed-addrspace.ll

package info (click to toggle)
llvm-toolchain-20 1%3A20.1.6-1~exp1
  • links: PTS, VCS
  • area: main
  • in suites: experimental
  • size: 2,111,304 kB
  • sloc: cpp: 7,438,677; ansic: 1,393,822; asm: 1,012,926; python: 241,650; f90: 86,635; objc: 75,479; lisp: 42,144; pascal: 17,286; sh: 10,027; ml: 5,082; perl: 4,730; awk: 3,523; makefile: 3,349; javascript: 2,251; xml: 892; fortran: 672
file content (134 lines) | stat: -rw-r--r-- 6,485 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5
; RUN: opt -S -mtriple=amdgcn-amd-amdhsa -passes=infer-address-spaces -o - %s | FileCheck %s

define float @f0(ptr %p) {
; CHECK-LABEL: define float @f0(
; CHECK-SAME: ptr [[P:%.*]]) {
; CHECK-NEXT:  [[ENTRY:.*:]]
; CHECK-NEXT:    [[IS_SHARED:%.*]] = call i1 @llvm.amdgcn.is.shared(ptr [[P]])
; CHECK-NEXT:    tail call void @llvm.assume(i1 [[IS_SHARED]])
; CHECK-NEXT:    [[WORKITEM_ID_X:%.*]] = tail call i32 @llvm.amdgcn.workitem.id.x()
; CHECK-NEXT:    [[IDXPROM:%.*]] = zext i32 [[WORKITEM_ID_X]] to i64
; CHECK-NEXT:    [[TMP0:%.*]] = addrspacecast ptr [[P]] to ptr addrspace(3)
; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr addrspace(3) [[TMP0]], i64 [[IDXPROM]]
; CHECK-NEXT:    [[LOAD:%.*]] = load float, ptr addrspace(3) [[ARRAYIDX]], align 4
; CHECK-NEXT:    ret float [[LOAD]]
;
entry:
  %is.shared = call i1 @llvm.amdgcn.is.shared(ptr %p)
  tail call void @llvm.assume(i1 %is.shared)
  %workitem.id.x = tail call i32 @llvm.amdgcn.workitem.id.x()
  %idxprom = zext i32 %workitem.id.x to i64
  %arrayidx = getelementptr inbounds float, ptr %p, i64 %idxprom
  %load = load float, ptr %arrayidx, align 4
  ret float %load
}

define float @f1(ptr %p) {
; CHECK-LABEL: define float @f1(
; CHECK-SAME: ptr [[P:%.*]]) {
; CHECK-NEXT:  [[ENTRY:.*:]]
; CHECK-NEXT:    [[IS_PRIVATE:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[P]])
; CHECK-NEXT:    tail call void @llvm.assume(i1 [[IS_PRIVATE]])
; CHECK-NEXT:    [[WORKITEM_ID_X:%.*]] = tail call i32 @llvm.amdgcn.workitem.id.x()
; CHECK-NEXT:    [[IDXPROM:%.*]] = zext i32 [[WORKITEM_ID_X]] to i64
; CHECK-NEXT:    [[TMP0:%.*]] = addrspacecast ptr [[P]] to ptr addrspace(5)
; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr addrspace(5) [[TMP0]], i64 [[IDXPROM]]
; CHECK-NEXT:    [[LOAD:%.*]] = load float, ptr addrspace(5) [[ARRAYIDX]], align 4
; CHECK-NEXT:    ret float [[LOAD]]
;
entry:
  %is.private = call i1 @llvm.amdgcn.is.private(ptr %p)
  tail call void @llvm.assume(i1 %is.private)
  %workitem.id.x = tail call i32 @llvm.amdgcn.workitem.id.x()
  %idxprom = zext i32 %workitem.id.x to i64
  %arrayidx = getelementptr inbounds float, ptr %p, i64 %idxprom
  %load = load float, ptr %arrayidx, align 4
  ret float %load
}

define float @f2(ptr %p) {
; CHECK-LABEL: define float @f2(
; CHECK-SAME: ptr [[P:%.*]]) {
; CHECK-NEXT:  [[ENTRY:.*:]]
; CHECK-NEXT:    [[IS_PRIVATE:%.*]] = call i1 @llvm.amdgcn.is.private(ptr [[P]])
; CHECK-NEXT:    [[NOT_PRIVATE:%.*]] = xor i1 [[IS_PRIVATE]], true
; CHECK-NEXT:    [[IS_SHARED:%.*]] = call i1 @llvm.amdgcn.is.shared(ptr [[P]])
; CHECK-NEXT:    [[NOT_SHARED:%.*]] = xor i1 [[IS_SHARED]], true
; CHECK-NEXT:    [[NOT_PRIVATE_AND_NOT_SHARED:%.*]] = and i1 [[NOT_PRIVATE]], [[NOT_SHARED]]
; CHECK-NEXT:    tail call void @llvm.assume(i1 [[NOT_PRIVATE_AND_NOT_SHARED]])
; CHECK-NEXT:    [[WORKITEM_ID_X:%.*]] = tail call i32 @llvm.amdgcn.workitem.id.x()
; CHECK-NEXT:    [[IDXPROM:%.*]] = zext i32 [[WORKITEM_ID_X]] to i64
; CHECK-NEXT:    [[TMP0:%.*]] = addrspacecast ptr [[P]] to ptr addrspace(1)
; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr addrspace(1) [[TMP0]], i64 [[IDXPROM]]
; CHECK-NEXT:    [[LOAD:%.*]] = load float, ptr addrspace(1) [[ARRAYIDX]], align 4
; CHECK-NEXT:    ret float [[LOAD]]
;
entry:
  %is.private = call i1 @llvm.amdgcn.is.private(ptr %p)
  %not.private = xor i1 %is.private, true
  %is.shared = call i1 @llvm.amdgcn.is.shared(ptr %p)
  %not.shared = xor i1 %is.shared, true
  %not.private.and.not.shared = and i1 %not.private, %not.shared
  tail call void @llvm.assume(i1 %not.private.and.not.shared)
  %workitem.id.x = tail call i32 @llvm.amdgcn.workitem.id.x()
  %idxprom = zext i32 %workitem.id.x to i64
  %arrayidx = getelementptr inbounds float, ptr %p, i64 %idxprom
  %load = load float, ptr %arrayidx, align 4
  ret float %load
}

define float @g0(i32 %c, ptr %p) {
; CHECK-LABEL: define float @g0(
; CHECK-SAME: i32 [[C:%.*]], ptr [[P:%.*]]) {
; CHECK-NEXT:  [[ENTRY:.*]]:
; CHECK-NEXT:    [[TOBOOL_NOT:%.*]] = icmp eq i32 [[C]], 0
; CHECK-NEXT:    br i1 [[TOBOOL_NOT]], label %[[IF_END:.*]], label %[[IF_THEN:.*]]
; CHECK:       [[IF_THEN]]:
; CHECK-NEXT:    [[IS_SHARED:%.*]] = call i1 @llvm.amdgcn.is.shared(ptr [[P]])
; CHECK-NEXT:    tail call void @llvm.assume(i1 [[IS_SHARED]])
; CHECK-NEXT:    [[WORKITEM_ID_X_0:%.*]] = tail call i32 @llvm.amdgcn.workitem.id.x()
; CHECK-NEXT:    [[IDXPROM:%.*]] = zext i32 [[WORKITEM_ID_X_0]] to i64
; CHECK-NEXT:    [[TMP0:%.*]] = addrspacecast ptr [[P]] to ptr addrspace(3)
; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds float, ptr addrspace(3) [[TMP0]], i64 [[IDXPROM]]
; CHECK-NEXT:    [[LOAD0:%.*]] = load float, ptr addrspace(3) [[ARRAYIDX]], align 4
; CHECK-NEXT:    [[ADD:%.*]] = fadd float [[LOAD0]], 0.000000e+00
; CHECK-NEXT:    br label %[[IF_END]]
; CHECK:       [[IF_END]]:
; CHECK-NEXT:    [[S:%.*]] = phi float [ [[ADD]], %[[IF_THEN]] ], [ 0.000000e+00, %[[ENTRY]] ]
; CHECK-NEXT:    [[WORKITEM_ID_X_1:%.*]] = tail call i32 @llvm.amdgcn.workitem.id.y()
; CHECK-NEXT:    [[IDXPROM2:%.*]] = zext i32 [[WORKITEM_ID_X_1]] to i64
; CHECK-NEXT:    [[ARRAYIDX2:%.*]] = getelementptr inbounds float, ptr [[P]], i64 [[IDXPROM2]]
; CHECK-NEXT:    [[LOAD1:%.*]] = load float, ptr [[ARRAYIDX2]], align 4
; CHECK-NEXT:    [[ADD2:%.*]] = fadd float [[S]], [[LOAD1]]
; CHECK-NEXT:    ret float [[ADD2]]
;
entry:
  %tobool.not = icmp eq i32 %c, 0
  br i1 %tobool.not, label %if.end, label %if.then

if.then:
  %is.shared = call i1 @llvm.amdgcn.is.shared(ptr %p)
  tail call void @llvm.assume(i1 %is.shared)
  %workitem.id.x.0 = tail call i32 @llvm.amdgcn.workitem.id.x()
  %idxprom = zext i32 %workitem.id.x.0 to i64
  %arrayidx = getelementptr inbounds float, ptr %p, i64 %idxprom
  %load0 = load float, ptr %arrayidx, align 4
  %add = fadd float %load0, 0.0
  br label %if.end

if.end:
  %s = phi float [ %add, %if.then ], [ 0.0, %entry ]
  %workitem.id.x.1 = tail call i32 @llvm.amdgcn.workitem.id.y()
  %idxprom2 = zext i32 %workitem.id.x.1 to i64
  %arrayidx2 = getelementptr inbounds float, ptr %p, i64 %idxprom2
  %load1 = load float, ptr %arrayidx2, align 4
  %add2 = fadd float %s, %load1
  ret float %add2
}

declare void @llvm.assume(i1)
declare i1 @llvm.amdgcn.is.shared(ptr nocapture)
declare i1 @llvm.amdgcn.is.private(ptr nocapture)
declare i32 @llvm.amdgcn.workitem.id.x()
declare i32 @llvm.amdgcn.workitem.id.y()