xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/cgp-addressing-modes.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -codegenprepare -mtriple=amdgcn-unknown-unknown -mcpu=tahiti < %s | FileCheck -check-prefix=OPT -check-prefix=OPT-SI %s
2*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -codegenprepare -mtriple=amdgcn-unknown-unknown -mcpu=bonaire < %s | FileCheck -check-prefix=OPT -check-prefix=OPT-CI %s
3*9880d681SAndroid Build Coastguard Worker; RUN: opt -S -codegenprepare -mtriple=amdgcn-unknown-unknown -mcpu=tonga < %s | FileCheck -check-prefix=OPT -check-prefix=OPT-VI %s
4*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tahiti -mattr=-promote-alloca -amdgpu-sroa=0 < %s | FileCheck -check-prefix=GCN -check-prefix=SI %s
5*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=bonaire -mattr=-promote-alloca -amdgpu-sroa=0 < %s | FileCheck -check-prefix=GCN -check-prefix=CI %s
6*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -mattr=-promote-alloca -amdgpu-sroa=0 < %s | FileCheck -check-prefix=GCN -check-prefix=VI %s
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker; OPT-LABEL: @test_sink_global_small_offset_i32(
9*9880d681SAndroid Build Coastguard Worker; OPT-CI-NOT: getelementptr i32, i32 addrspace(1)* %in
10*9880d681SAndroid Build Coastguard Worker; OPT-VI: getelementptr i32, i32 addrspace(1)* %in
11*9880d681SAndroid Build Coastguard Worker; OPT: br i1
12*9880d681SAndroid Build Coastguard Worker; OPT-CI: ptrtoint
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_sink_global_small_offset_i32:
15*9880d681SAndroid Build Coastguard Worker; GCN: {{^}}BB0_2:
16*9880d681SAndroid Build Coastguard Workerdefine void @test_sink_global_small_offset_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in) {
17*9880d681SAndroid Build Coastguard Workerentry:
18*9880d681SAndroid Build Coastguard Worker  %out.gep = getelementptr i32, i32 addrspace(1)* %out, i64 999999
19*9880d681SAndroid Build Coastguard Worker  %in.gep = getelementptr i32, i32 addrspace(1)* %in, i64 7
20*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #0
21*9880d681SAndroid Build Coastguard Worker  %tmp0 = icmp eq i32 %tid, 0
22*9880d681SAndroid Build Coastguard Worker  br i1 %tmp0, label %endif, label %if
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Workerif:
25*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32 addrspace(1)* %in.gep
26*9880d681SAndroid Build Coastguard Worker  br label %endif
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerendif:
29*9880d681SAndroid Build Coastguard Worker  %x = phi i32 [ %tmp1, %if ], [ 0, %entry ]
30*9880d681SAndroid Build Coastguard Worker  store i32 %x, i32 addrspace(1)* %out.gep
31*9880d681SAndroid Build Coastguard Worker  br label %done
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Workerdone:
34*9880d681SAndroid Build Coastguard Worker  ret void
35*9880d681SAndroid Build Coastguard Worker}
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker; OPT-LABEL: @test_sink_global_small_max_i32_ds_offset(
38*9880d681SAndroid Build Coastguard Worker; OPT: %in.gep = getelementptr i8, i8 addrspace(1)* %in, i64 65535
39*9880d681SAndroid Build Coastguard Worker; OPT: br i1
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_sink_global_small_max_i32_ds_offset:
42*9880d681SAndroid Build Coastguard Worker; GCN: s_and_saveexec_b64
43*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_sbyte {{v[0-9]+}}, off, {{s\[[0-9]+:[0-9]+\]}}, s{{[0-9]+$}}
44*9880d681SAndroid Build Coastguard Worker; GCN: {{^}}BB1_2:
45*9880d681SAndroid Build Coastguard Worker; GCN: s_or_b64 exec
46*9880d681SAndroid Build Coastguard Workerdefine void @test_sink_global_small_max_i32_ds_offset(i32 addrspace(1)* %out, i8 addrspace(1)* %in) {
47*9880d681SAndroid Build Coastguard Workerentry:
48*9880d681SAndroid Build Coastguard Worker  %out.gep = getelementptr i32, i32 addrspace(1)* %out, i64 99999
49*9880d681SAndroid Build Coastguard Worker  %in.gep = getelementptr i8, i8 addrspace(1)* %in, i64 65535
50*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #0
51*9880d681SAndroid Build Coastguard Worker  %tmp0 = icmp eq i32 %tid, 0
52*9880d681SAndroid Build Coastguard Worker  br i1 %tmp0, label %endif, label %if
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Workerif:
55*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i8, i8 addrspace(1)* %in.gep
56*9880d681SAndroid Build Coastguard Worker  %tmp2 = sext i8 %tmp1 to i32
57*9880d681SAndroid Build Coastguard Worker  br label %endif
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerendif:
60*9880d681SAndroid Build Coastguard Worker  %x = phi i32 [ %tmp2, %if ], [ 0, %entry ]
61*9880d681SAndroid Build Coastguard Worker  store i32 %x, i32 addrspace(1)* %out.gep
62*9880d681SAndroid Build Coastguard Worker  br label %done
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Workerdone:
65*9880d681SAndroid Build Coastguard Worker  ret void
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_sink_global_small_max_mubuf_offset:
69*9880d681SAndroid Build Coastguard Worker; GCN: s_and_saveexec_b64
70*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_sbyte {{v[0-9]+}}, off, {{s\[[0-9]+:[0-9]+\]}}, 0 offset:4095{{$}}
71*9880d681SAndroid Build Coastguard Worker; GCN: {{^}}BB2_2:
72*9880d681SAndroid Build Coastguard Worker; GCN: s_or_b64 exec
73*9880d681SAndroid Build Coastguard Workerdefine void @test_sink_global_small_max_mubuf_offset(i32 addrspace(1)* %out, i8 addrspace(1)* %in) {
74*9880d681SAndroid Build Coastguard Workerentry:
75*9880d681SAndroid Build Coastguard Worker  %out.gep = getelementptr i32, i32 addrspace(1)* %out, i32 1024
76*9880d681SAndroid Build Coastguard Worker  %in.gep = getelementptr i8, i8 addrspace(1)* %in, i64 4095
77*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #0
78*9880d681SAndroid Build Coastguard Worker  %tmp0 = icmp eq i32 %tid, 0
79*9880d681SAndroid Build Coastguard Worker  br i1 %tmp0, label %endif, label %if
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Workerif:
82*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i8, i8 addrspace(1)* %in.gep
83*9880d681SAndroid Build Coastguard Worker  %tmp2 = sext i8 %tmp1 to i32
84*9880d681SAndroid Build Coastguard Worker  br label %endif
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Workerendif:
87*9880d681SAndroid Build Coastguard Worker  %x = phi i32 [ %tmp2, %if ], [ 0, %entry ]
88*9880d681SAndroid Build Coastguard Worker  store i32 %x, i32 addrspace(1)* %out.gep
89*9880d681SAndroid Build Coastguard Worker  br label %done
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerdone:
92*9880d681SAndroid Build Coastguard Worker  ret void
93*9880d681SAndroid Build Coastguard Worker}
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_sink_global_small_max_plus_1_mubuf_offset:
96*9880d681SAndroid Build Coastguard Worker; GCN: s_and_saveexec_b64
97*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_sbyte {{v[0-9]+}}, off, {{s\[[0-9]+:[0-9]+\]}}, s{{[0-9]+$}}
98*9880d681SAndroid Build Coastguard Worker; GCN: {{^}}BB3_2:
99*9880d681SAndroid Build Coastguard Worker; GCN: s_or_b64 exec
100*9880d681SAndroid Build Coastguard Workerdefine void @test_sink_global_small_max_plus_1_mubuf_offset(i32 addrspace(1)* %out, i8 addrspace(1)* %in) {
101*9880d681SAndroid Build Coastguard Workerentry:
102*9880d681SAndroid Build Coastguard Worker  %out.gep = getelementptr i32, i32 addrspace(1)* %out, i64 99999
103*9880d681SAndroid Build Coastguard Worker  %in.gep = getelementptr i8, i8 addrspace(1)* %in, i64 4096
104*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #0
105*9880d681SAndroid Build Coastguard Worker  %tmp0 = icmp eq i32 %tid, 0
106*9880d681SAndroid Build Coastguard Worker  br i1 %tmp0, label %endif, label %if
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Workerif:
109*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i8, i8 addrspace(1)* %in.gep
110*9880d681SAndroid Build Coastguard Worker  %tmp2 = sext i8 %tmp1 to i32
111*9880d681SAndroid Build Coastguard Worker  br label %endif
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Workerendif:
114*9880d681SAndroid Build Coastguard Worker  %x = phi i32 [ %tmp2, %if ], [ 0, %entry ]
115*9880d681SAndroid Build Coastguard Worker  store i32 %x, i32 addrspace(1)* %out.gep
116*9880d681SAndroid Build Coastguard Worker  br label %done
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Workerdone:
119*9880d681SAndroid Build Coastguard Worker  ret void
120*9880d681SAndroid Build Coastguard Worker}
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker; OPT-LABEL: @test_sink_scratch_small_offset_i32(
123*9880d681SAndroid Build Coastguard Worker; OPT-NOT:  getelementptr [512 x i32]
124*9880d681SAndroid Build Coastguard Worker; OPT: br i1
125*9880d681SAndroid Build Coastguard Worker; OPT: ptrtoint
126*9880d681SAndroid Build Coastguard Worker
127*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_sink_scratch_small_offset_i32:
128*9880d681SAndroid Build Coastguard Worker; GCN: s_and_saveexec_b64
129*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword {{v[0-9]+}}, {{v[0-9]+}}, {{s\[[0-9]+:[0-9]+\]}}, {{s[0-9]+}} offen offset:4092{{$}}
130*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword {{v[0-9]+}}, {{v[0-9]+}}, {{s\[[0-9]+:[0-9]+\]}}, {{s[0-9]+}} offen offset:4092{{$}}
131*9880d681SAndroid Build Coastguard Worker; GCN: {{^}}BB4_2:
132*9880d681SAndroid Build Coastguard Workerdefine void @test_sink_scratch_small_offset_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in, i32 %arg) {
133*9880d681SAndroid Build Coastguard Workerentry:
134*9880d681SAndroid Build Coastguard Worker  %alloca = alloca [512 x i32], align 4
135*9880d681SAndroid Build Coastguard Worker  %out.gep.0 = getelementptr i32, i32 addrspace(1)* %out, i64 999998
136*9880d681SAndroid Build Coastguard Worker  %out.gep.1 = getelementptr i32, i32 addrspace(1)* %out, i64 999999
137*9880d681SAndroid Build Coastguard Worker  %add.arg = add i32 %arg, 8
138*9880d681SAndroid Build Coastguard Worker  %alloca.gep = getelementptr [512 x i32], [512 x i32]* %alloca, i32 0, i32 1023
139*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #0
140*9880d681SAndroid Build Coastguard Worker  %tmp0 = icmp eq i32 %tid, 0
141*9880d681SAndroid Build Coastguard Worker  br i1 %tmp0, label %endif, label %if
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Workerif:
144*9880d681SAndroid Build Coastguard Worker  store volatile i32 123, i32* %alloca.gep
145*9880d681SAndroid Build Coastguard Worker  %tmp1 = load volatile i32, i32* %alloca.gep
146*9880d681SAndroid Build Coastguard Worker  br label %endif
147*9880d681SAndroid Build Coastguard Worker
148*9880d681SAndroid Build Coastguard Workerendif:
149*9880d681SAndroid Build Coastguard Worker  %x = phi i32 [ %tmp1, %if ], [ 0, %entry ]
150*9880d681SAndroid Build Coastguard Worker  store i32 %x, i32 addrspace(1)* %out.gep.0
151*9880d681SAndroid Build Coastguard Worker  %load = load volatile i32, i32* %alloca.gep
152*9880d681SAndroid Build Coastguard Worker  store i32 %load, i32 addrspace(1)* %out.gep.1
153*9880d681SAndroid Build Coastguard Worker  br label %done
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Workerdone:
156*9880d681SAndroid Build Coastguard Worker  ret void
157*9880d681SAndroid Build Coastguard Worker}
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Worker; OPT-LABEL: @test_no_sink_scratch_large_offset_i32(
160*9880d681SAndroid Build Coastguard Worker; OPT: %alloca.gep = getelementptr [512 x i32], [512 x i32]* %alloca, i32 0, i32 1024
161*9880d681SAndroid Build Coastguard Worker; OPT: br i1
162*9880d681SAndroid Build Coastguard Worker; OPT-NOT: ptrtoint
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_no_sink_scratch_large_offset_i32:
165*9880d681SAndroid Build Coastguard Worker; GCN: s_and_saveexec_b64
166*9880d681SAndroid Build Coastguard Worker; GCN: buffer_store_dword {{v[0-9]+}}, {{v[0-9]+}}, {{s\[[0-9]+:[0-9]+\]}}, {{s[0-9]+}} offen{{$}}
167*9880d681SAndroid Build Coastguard Worker; GCN: buffer_load_dword {{v[0-9]+}}, {{v[0-9]+}}, {{s\[[0-9]+:[0-9]+\]}}, {{s[0-9]+}} offen{{$}}
168*9880d681SAndroid Build Coastguard Worker; GCN: {{^}}BB5_2:
169*9880d681SAndroid Build Coastguard Workerdefine void @test_no_sink_scratch_large_offset_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in, i32 %arg) {
170*9880d681SAndroid Build Coastguard Workerentry:
171*9880d681SAndroid Build Coastguard Worker  %alloca = alloca [512 x i32], align 4
172*9880d681SAndroid Build Coastguard Worker  %out.gep.0 = getelementptr i32, i32 addrspace(1)* %out, i64 999998
173*9880d681SAndroid Build Coastguard Worker  %out.gep.1 = getelementptr i32, i32 addrspace(1)* %out, i64 999999
174*9880d681SAndroid Build Coastguard Worker  %add.arg = add i32 %arg, 8
175*9880d681SAndroid Build Coastguard Worker  %alloca.gep = getelementptr [512 x i32], [512 x i32]* %alloca, i32 0, i32 1024
176*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #0
177*9880d681SAndroid Build Coastguard Worker  %tmp0 = icmp eq i32 %tid, 0
178*9880d681SAndroid Build Coastguard Worker  br i1 %tmp0, label %endif, label %if
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Workerif:
181*9880d681SAndroid Build Coastguard Worker  store volatile i32 123, i32* %alloca.gep
182*9880d681SAndroid Build Coastguard Worker  %tmp1 = load volatile i32, i32* %alloca.gep
183*9880d681SAndroid Build Coastguard Worker  br label %endif
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Workerendif:
186*9880d681SAndroid Build Coastguard Worker  %x = phi i32 [ %tmp1, %if ], [ 0, %entry ]
187*9880d681SAndroid Build Coastguard Worker  store i32 %x, i32 addrspace(1)* %out.gep.0
188*9880d681SAndroid Build Coastguard Worker  %load = load volatile i32, i32* %alloca.gep
189*9880d681SAndroid Build Coastguard Worker  store i32 %load, i32 addrspace(1)* %out.gep.1
190*9880d681SAndroid Build Coastguard Worker  br label %done
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Workerdone:
193*9880d681SAndroid Build Coastguard Worker  ret void
194*9880d681SAndroid Build Coastguard Worker}
195*9880d681SAndroid Build Coastguard Worker
196*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_sink_global_vreg_sreg_i32:
197*9880d681SAndroid Build Coastguard Worker; GCN: s_and_saveexec_b64
198*9880d681SAndroid Build Coastguard Worker; CI: buffer_load_dword {{v[0-9]+}}, {{v\[[0-9]+:[0-9]+\]}}, {{s\[[0-9]+:[0-9]+\]}}, 0 addr64{{$}}
199*9880d681SAndroid Build Coastguard Worker; VI: flat_load_dword v{{[0-9]+}}, v[{{[0-9]+:[0-9]+}}]
200*9880d681SAndroid Build Coastguard Worker; GCN: {{^}}BB6_2:
201*9880d681SAndroid Build Coastguard Workerdefine void @test_sink_global_vreg_sreg_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %in, i32 %offset) {
202*9880d681SAndroid Build Coastguard Workerentry:
203*9880d681SAndroid Build Coastguard Worker  %offset.ext = zext i32 %offset to i64
204*9880d681SAndroid Build Coastguard Worker  %out.gep = getelementptr i32, i32 addrspace(1)* %out, i64 999999
205*9880d681SAndroid Build Coastguard Worker  %in.gep = getelementptr i32, i32 addrspace(1)* %in, i64 %offset.ext
206*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #0
207*9880d681SAndroid Build Coastguard Worker  %tmp0 = icmp eq i32 %tid, 0
208*9880d681SAndroid Build Coastguard Worker  br i1 %tmp0, label %endif, label %if
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Workerif:
211*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32 addrspace(1)* %in.gep
212*9880d681SAndroid Build Coastguard Worker  br label %endif
213*9880d681SAndroid Build Coastguard Worker
214*9880d681SAndroid Build Coastguard Workerendif:
215*9880d681SAndroid Build Coastguard Worker  %x = phi i32 [ %tmp1, %if ], [ 0, %entry ]
216*9880d681SAndroid Build Coastguard Worker  store i32 %x, i32 addrspace(1)* %out.gep
217*9880d681SAndroid Build Coastguard Worker  br label %done
218*9880d681SAndroid Build Coastguard Worker
219*9880d681SAndroid Build Coastguard Workerdone:
220*9880d681SAndroid Build Coastguard Worker  ret void
221*9880d681SAndroid Build Coastguard Worker}
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind readnone }
224*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind }
225*9880d681SAndroid Build Coastguard Worker
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Worker
228*9880d681SAndroid Build Coastguard Worker; OPT-LABEL: @test_sink_constant_small_offset_i32
229*9880d681SAndroid Build Coastguard Worker; OPT-NOT:  getelementptr i32, i32 addrspace(2)*
230*9880d681SAndroid Build Coastguard Worker; OPT: br i1
231*9880d681SAndroid Build Coastguard Worker
232*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_sink_constant_small_offset_i32:
233*9880d681SAndroid Build Coastguard Worker; GCN: s_and_saveexec_b64
234*9880d681SAndroid Build Coastguard Worker; SI: s_load_dword s{{[0-9]+}}, {{s\[[0-9]+:[0-9]+\]}}, 0x7{{$}}
235*9880d681SAndroid Build Coastguard Worker; GCN: s_or_b64 exec, exec
236*9880d681SAndroid Build Coastguard Workerdefine void @test_sink_constant_small_offset_i32(i32 addrspace(1)* %out, i32 addrspace(2)* %in) {
237*9880d681SAndroid Build Coastguard Workerentry:
238*9880d681SAndroid Build Coastguard Worker  %out.gep = getelementptr i32, i32 addrspace(1)* %out, i64 999999
239*9880d681SAndroid Build Coastguard Worker  %in.gep = getelementptr i32, i32 addrspace(2)* %in, i64 7
240*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #0
241*9880d681SAndroid Build Coastguard Worker  %tmp0 = icmp eq i32 %tid, 0
242*9880d681SAndroid Build Coastguard Worker  br i1 %tmp0, label %endif, label %if
243*9880d681SAndroid Build Coastguard Worker
244*9880d681SAndroid Build Coastguard Workerif:
245*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32 addrspace(2)* %in.gep
246*9880d681SAndroid Build Coastguard Worker  br label %endif
247*9880d681SAndroid Build Coastguard Worker
248*9880d681SAndroid Build Coastguard Workerendif:
249*9880d681SAndroid Build Coastguard Worker  %x = phi i32 [ %tmp1, %if ], [ 0, %entry ]
250*9880d681SAndroid Build Coastguard Worker  store i32 %x, i32 addrspace(1)* %out.gep
251*9880d681SAndroid Build Coastguard Worker  br label %done
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Workerdone:
254*9880d681SAndroid Build Coastguard Worker  ret void
255*9880d681SAndroid Build Coastguard Worker}
256*9880d681SAndroid Build Coastguard Worker
257*9880d681SAndroid Build Coastguard Worker; OPT-LABEL: @test_sink_constant_max_8_bit_offset_i32
258*9880d681SAndroid Build Coastguard Worker; OPT-NOT:  getelementptr i32, i32 addrspace(2)*
259*9880d681SAndroid Build Coastguard Worker; OPT: br i1
260*9880d681SAndroid Build Coastguard Worker
261*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_sink_constant_max_8_bit_offset_i32:
262*9880d681SAndroid Build Coastguard Worker; GCN: s_and_saveexec_b64
263*9880d681SAndroid Build Coastguard Worker; SI: s_load_dword s{{[0-9]+}}, {{s\[[0-9]+:[0-9]+\]}}, 0xff{{$}}
264*9880d681SAndroid Build Coastguard Worker; GCN: s_or_b64 exec, exec
265*9880d681SAndroid Build Coastguard Workerdefine void @test_sink_constant_max_8_bit_offset_i32(i32 addrspace(1)* %out, i32 addrspace(2)* %in) {
266*9880d681SAndroid Build Coastguard Workerentry:
267*9880d681SAndroid Build Coastguard Worker  %out.gep = getelementptr i32, i32 addrspace(1)* %out, i64 999999
268*9880d681SAndroid Build Coastguard Worker  %in.gep = getelementptr i32, i32 addrspace(2)* %in, i64 255
269*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #0
270*9880d681SAndroid Build Coastguard Worker  %tmp0 = icmp eq i32 %tid, 0
271*9880d681SAndroid Build Coastguard Worker  br i1 %tmp0, label %endif, label %if
272*9880d681SAndroid Build Coastguard Worker
273*9880d681SAndroid Build Coastguard Workerif:
274*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32 addrspace(2)* %in.gep
275*9880d681SAndroid Build Coastguard Worker  br label %endif
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Workerendif:
278*9880d681SAndroid Build Coastguard Worker  %x = phi i32 [ %tmp1, %if ], [ 0, %entry ]
279*9880d681SAndroid Build Coastguard Worker  store i32 %x, i32 addrspace(1)* %out.gep
280*9880d681SAndroid Build Coastguard Worker  br label %done
281*9880d681SAndroid Build Coastguard Worker
282*9880d681SAndroid Build Coastguard Workerdone:
283*9880d681SAndroid Build Coastguard Worker  ret void
284*9880d681SAndroid Build Coastguard Worker}
285*9880d681SAndroid Build Coastguard Worker
286*9880d681SAndroid Build Coastguard Worker; OPT-LABEL: @test_sink_constant_max_8_bit_offset_p1_i32
287*9880d681SAndroid Build Coastguard Worker; OPT-SI:  getelementptr i32, i32 addrspace(2)*
288*9880d681SAndroid Build Coastguard Worker; OPT-CI-NOT:  getelementptr i32, i32 addrspace(2)*
289*9880d681SAndroid Build Coastguard Worker; OPT-VI-NOT:  getelementptr i32, i32 addrspace(2)*
290*9880d681SAndroid Build Coastguard Worker; OPT: br i1
291*9880d681SAndroid Build Coastguard Worker
292*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_sink_constant_max_8_bit_offset_p1_i32:
293*9880d681SAndroid Build Coastguard Worker; GCN: s_and_saveexec_b64
294*9880d681SAndroid Build Coastguard Worker; SI: s_movk_i32 [[OFFSET:s[0-9]+]], 0x400
295*9880d681SAndroid Build Coastguard Worker
296*9880d681SAndroid Build Coastguard Worker; SI: s_load_dword s{{[0-9]+}}, {{s\[[0-9]+:[0-9]+\]}}, [[OFFSET]]{{$}}
297*9880d681SAndroid Build Coastguard Worker; GCN: s_or_b64 exec, exec
298*9880d681SAndroid Build Coastguard Workerdefine void @test_sink_constant_max_8_bit_offset_p1_i32(i32 addrspace(1)* %out, i32 addrspace(2)* %in) {
299*9880d681SAndroid Build Coastguard Workerentry:
300*9880d681SAndroid Build Coastguard Worker  %out.gep = getelementptr i32, i32 addrspace(1)* %out, i64 999999
301*9880d681SAndroid Build Coastguard Worker  %in.gep = getelementptr i32, i32 addrspace(2)* %in, i64 256
302*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #0
303*9880d681SAndroid Build Coastguard Worker  %tmp0 = icmp eq i32 %tid, 0
304*9880d681SAndroid Build Coastguard Worker  br i1 %tmp0, label %endif, label %if
305*9880d681SAndroid Build Coastguard Worker
306*9880d681SAndroid Build Coastguard Workerif:
307*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32 addrspace(2)* %in.gep
308*9880d681SAndroid Build Coastguard Worker  br label %endif
309*9880d681SAndroid Build Coastguard Worker
310*9880d681SAndroid Build Coastguard Workerendif:
311*9880d681SAndroid Build Coastguard Worker  %x = phi i32 [ %tmp1, %if ], [ 0, %entry ]
312*9880d681SAndroid Build Coastguard Worker  store i32 %x, i32 addrspace(1)* %out.gep
313*9880d681SAndroid Build Coastguard Worker  br label %done
314*9880d681SAndroid Build Coastguard Worker
315*9880d681SAndroid Build Coastguard Workerdone:
316*9880d681SAndroid Build Coastguard Worker  ret void
317*9880d681SAndroid Build Coastguard Worker}
318*9880d681SAndroid Build Coastguard Worker
319*9880d681SAndroid Build Coastguard Worker; OPT-LABEL: @test_sink_constant_max_32_bit_offset_i32
320*9880d681SAndroid Build Coastguard Worker; OPT-SI: getelementptr i32, i32 addrspace(2)*
321*9880d681SAndroid Build Coastguard Worker; OPT-CI-NOT: getelementptr i32, i32 addrspace(2)*
322*9880d681SAndroid Build Coastguard Worker; OPT: br i1
323*9880d681SAndroid Build Coastguard Worker
324*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_sink_constant_max_32_bit_offset_i32:
325*9880d681SAndroid Build Coastguard Worker; GCN: s_and_saveexec_b64
326*9880d681SAndroid Build Coastguard Worker; GCN: s_add_u32 s{{[0-9]+}}, s{{[0-9]+}}, -4{{$}}
327*9880d681SAndroid Build Coastguard Worker; GCN: s_addc_u32 s{{[0-9]+}}, s{{[0-9]+}}, 3{{$}}
328*9880d681SAndroid Build Coastguard Worker; SI: s_load_dword s{{[0-9]+}}, {{s\[[0-9]+:[0-9]+\]}}, 0x0{{$}}
329*9880d681SAndroid Build Coastguard Worker; GCN: s_or_b64 exec, exec
330*9880d681SAndroid Build Coastguard Workerdefine void @test_sink_constant_max_32_bit_offset_i32(i32 addrspace(1)* %out, i32 addrspace(2)* %in) {
331*9880d681SAndroid Build Coastguard Workerentry:
332*9880d681SAndroid Build Coastguard Worker  %out.gep = getelementptr i32, i32 addrspace(1)* %out, i64 999999
333*9880d681SAndroid Build Coastguard Worker  %in.gep = getelementptr i32, i32 addrspace(2)* %in, i64 4294967295
334*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #0
335*9880d681SAndroid Build Coastguard Worker  %tmp0 = icmp eq i32 %tid, 0
336*9880d681SAndroid Build Coastguard Worker  br i1 %tmp0, label %endif, label %if
337*9880d681SAndroid Build Coastguard Worker
338*9880d681SAndroid Build Coastguard Workerif:
339*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32 addrspace(2)* %in.gep
340*9880d681SAndroid Build Coastguard Worker  br label %endif
341*9880d681SAndroid Build Coastguard Worker
342*9880d681SAndroid Build Coastguard Workerendif:
343*9880d681SAndroid Build Coastguard Worker  %x = phi i32 [ %tmp1, %if ], [ 0, %entry ]
344*9880d681SAndroid Build Coastguard Worker  store i32 %x, i32 addrspace(1)* %out.gep
345*9880d681SAndroid Build Coastguard Worker  br label %done
346*9880d681SAndroid Build Coastguard Worker
347*9880d681SAndroid Build Coastguard Workerdone:
348*9880d681SAndroid Build Coastguard Worker  ret void
349*9880d681SAndroid Build Coastguard Worker}
350*9880d681SAndroid Build Coastguard Worker
351*9880d681SAndroid Build Coastguard Worker; OPT-LABEL: @test_sink_constant_max_32_bit_offset_p1_i32
352*9880d681SAndroid Build Coastguard Worker; OPT: getelementptr i32, i32 addrspace(2)*
353*9880d681SAndroid Build Coastguard Worker; OPT: br i1
354*9880d681SAndroid Build Coastguard Worker
355*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_sink_constant_max_32_bit_offset_p1_i32:
356*9880d681SAndroid Build Coastguard Worker; GCN: s_and_saveexec_b64
357*9880d681SAndroid Build Coastguard Worker; GCN: s_add_u32
358*9880d681SAndroid Build Coastguard Worker; GCN: s_addc_u32
359*9880d681SAndroid Build Coastguard Worker; SI: s_load_dword s{{[0-9]+}}, {{s\[[0-9]+:[0-9]+\]}}, 0x0{{$}}
360*9880d681SAndroid Build Coastguard Worker; GCN: s_or_b64 exec, exec
361*9880d681SAndroid Build Coastguard Workerdefine void @test_sink_constant_max_32_bit_offset_p1_i32(i32 addrspace(1)* %out, i32 addrspace(2)* %in) {
362*9880d681SAndroid Build Coastguard Workerentry:
363*9880d681SAndroid Build Coastguard Worker  %out.gep = getelementptr i32, i32 addrspace(1)* %out, i64 999999
364*9880d681SAndroid Build Coastguard Worker  %in.gep = getelementptr i32, i32 addrspace(2)* %in, i64 17179869181
365*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #0
366*9880d681SAndroid Build Coastguard Worker  %tmp0 = icmp eq i32 %tid, 0
367*9880d681SAndroid Build Coastguard Worker  br i1 %tmp0, label %endif, label %if
368*9880d681SAndroid Build Coastguard Worker
369*9880d681SAndroid Build Coastguard Workerif:
370*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32 addrspace(2)* %in.gep
371*9880d681SAndroid Build Coastguard Worker  br label %endif
372*9880d681SAndroid Build Coastguard Worker
373*9880d681SAndroid Build Coastguard Workerendif:
374*9880d681SAndroid Build Coastguard Worker  %x = phi i32 [ %tmp1, %if ], [ 0, %entry ]
375*9880d681SAndroid Build Coastguard Worker  store i32 %x, i32 addrspace(1)* %out.gep
376*9880d681SAndroid Build Coastguard Worker  br label %done
377*9880d681SAndroid Build Coastguard Worker
378*9880d681SAndroid Build Coastguard Workerdone:
379*9880d681SAndroid Build Coastguard Worker  ret void
380*9880d681SAndroid Build Coastguard Worker}
381*9880d681SAndroid Build Coastguard Worker
382*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_sink_constant_max_20_bit_byte_offset_i32:
383*9880d681SAndroid Build Coastguard Worker; GCN: s_and_saveexec_b64
384*9880d681SAndroid Build Coastguard Worker; SI: s_mov_b32 [[OFFSET:s[0-9]+]], 0xffffc{{$}}
385*9880d681SAndroid Build Coastguard Worker; SI: s_load_dword s{{[0-9]+}}, {{s\[[0-9]+:[0-9]+\]}}, [[OFFSET]]{{$}}
386*9880d681SAndroid Build Coastguard Worker
387*9880d681SAndroid Build Coastguard Worker; CI: s_load_dword s{{[0-9]+}}, {{s\[[0-9]+:[0-9]+\]}}, 0x3ffff{{$}}
388*9880d681SAndroid Build Coastguard Worker; VI: s_load_dword s{{[0-9]+}}, {{s\[[0-9]+:[0-9]+\]}}, 0xffffc{{$}}
389*9880d681SAndroid Build Coastguard Worker
390*9880d681SAndroid Build Coastguard Worker; GCN: s_or_b64 exec, exec
391*9880d681SAndroid Build Coastguard Workerdefine void @test_sink_constant_max_20_bit_byte_offset_i32(i32 addrspace(1)* %out, i32 addrspace(2)* %in) {
392*9880d681SAndroid Build Coastguard Workerentry:
393*9880d681SAndroid Build Coastguard Worker  %out.gep = getelementptr i32, i32 addrspace(1)* %out, i64 999999
394*9880d681SAndroid Build Coastguard Worker  %in.gep = getelementptr i32, i32 addrspace(2)* %in, i64 262143
395*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #0
396*9880d681SAndroid Build Coastguard Worker  %tmp0 = icmp eq i32 %tid, 0
397*9880d681SAndroid Build Coastguard Worker  br i1 %tmp0, label %endif, label %if
398*9880d681SAndroid Build Coastguard Worker
399*9880d681SAndroid Build Coastguard Workerif:
400*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32 addrspace(2)* %in.gep
401*9880d681SAndroid Build Coastguard Worker  br label %endif
402*9880d681SAndroid Build Coastguard Worker
403*9880d681SAndroid Build Coastguard Workerendif:
404*9880d681SAndroid Build Coastguard Worker  %x = phi i32 [ %tmp1, %if ], [ 0, %entry ]
405*9880d681SAndroid Build Coastguard Worker  store i32 %x, i32 addrspace(1)* %out.gep
406*9880d681SAndroid Build Coastguard Worker  br label %done
407*9880d681SAndroid Build Coastguard Worker
408*9880d681SAndroid Build Coastguard Workerdone:
409*9880d681SAndroid Build Coastguard Worker  ret void
410*9880d681SAndroid Build Coastguard Worker}
411*9880d681SAndroid Build Coastguard Worker
412*9880d681SAndroid Build Coastguard Worker; OPT-LABEL: @test_sink_constant_max_20_bit_byte_offset_p1_i32
413*9880d681SAndroid Build Coastguard Worker; OPT-SI: getelementptr i32, i32 addrspace(2)*
414*9880d681SAndroid Build Coastguard Worker; OPT-CI-NOT: getelementptr i32, i32 addrspace(2)*
415*9880d681SAndroid Build Coastguard Worker; OPT-VI: getelementptr i32, i32 addrspace(2)*
416*9880d681SAndroid Build Coastguard Worker; OPT: br i1
417*9880d681SAndroid Build Coastguard Worker
418*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}test_sink_constant_max_20_bit_byte_offset_p1_i32:
419*9880d681SAndroid Build Coastguard Worker; GCN: s_and_saveexec_b64
420*9880d681SAndroid Build Coastguard Worker; SI: s_mov_b32 [[OFFSET:s[0-9]+]], 0x100000{{$}}
421*9880d681SAndroid Build Coastguard Worker; SI: s_load_dword s{{[0-9]+}}, {{s\[[0-9]+:[0-9]+\]}}, [[OFFSET]]{{$}}
422*9880d681SAndroid Build Coastguard Worker
423*9880d681SAndroid Build Coastguard Worker; CI: s_load_dword s{{[0-9]+}}, {{s\[[0-9]+:[0-9]+\]}}, 0x40000{{$}}
424*9880d681SAndroid Build Coastguard Worker
425*9880d681SAndroid Build Coastguard Worker; VI: s_mov_b32 [[OFFSET:s[0-9]+]], 0x100000{{$}}
426*9880d681SAndroid Build Coastguard Worker; VI: s_load_dword s{{[0-9]+}}, {{s\[[0-9]+:[0-9]+\]}}, [[OFFSET]]{{$}}
427*9880d681SAndroid Build Coastguard Worker
428*9880d681SAndroid Build Coastguard Worker; GCN: s_or_b64 exec, exec
429*9880d681SAndroid Build Coastguard Workerdefine void @test_sink_constant_max_20_bit_byte_offset_p1_i32(i32 addrspace(1)* %out, i32 addrspace(2)* %in) {
430*9880d681SAndroid Build Coastguard Workerentry:
431*9880d681SAndroid Build Coastguard Worker  %out.gep = getelementptr i32, i32 addrspace(1)* %out, i64 999999
432*9880d681SAndroid Build Coastguard Worker  %in.gep = getelementptr i32, i32 addrspace(2)* %in, i64 262144
433*9880d681SAndroid Build Coastguard Worker  %tid = call i32 @llvm.amdgcn.mbcnt.lo(i32 -1, i32 0) #0
434*9880d681SAndroid Build Coastguard Worker  %tmp0 = icmp eq i32 %tid, 0
435*9880d681SAndroid Build Coastguard Worker  br i1 %tmp0, label %endif, label %if
436*9880d681SAndroid Build Coastguard Worker
437*9880d681SAndroid Build Coastguard Workerif:
438*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32 addrspace(2)* %in.gep
439*9880d681SAndroid Build Coastguard Worker  br label %endif
440*9880d681SAndroid Build Coastguard Worker
441*9880d681SAndroid Build Coastguard Workerendif:
442*9880d681SAndroid Build Coastguard Worker  %x = phi i32 [ %tmp1, %if ], [ 0, %entry ]
443*9880d681SAndroid Build Coastguard Worker  store i32 %x, i32 addrspace(1)* %out.gep
444*9880d681SAndroid Build Coastguard Worker  br label %done
445*9880d681SAndroid Build Coastguard Worker
446*9880d681SAndroid Build Coastguard Workerdone:
447*9880d681SAndroid Build Coastguard Worker  ret void
448*9880d681SAndroid Build Coastguard Worker}
449*9880d681SAndroid Build Coastguard Worker
450*9880d681SAndroid Build Coastguard Worker%struct.foo = type { [3 x float], [3 x float] }
451*9880d681SAndroid Build Coastguard Worker
452*9880d681SAndroid Build Coastguard Worker; OPT-LABEL: @sink_ds_address(
453*9880d681SAndroid Build Coastguard Worker; OPT: ptrtoint %struct.foo addrspace(3)* %ptr to i64
454*9880d681SAndroid Build Coastguard Worker
455*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}sink_ds_address:
456*9880d681SAndroid Build Coastguard Worker; GCN: s_load_dword [[SREG1:s[0-9]+]],
457*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[VREG1:v[0-9]+]], [[SREG1]]
458*9880d681SAndroid Build Coastguard Worker; GCN-DAG: ds_read2_b32 v[{{[0-9+:[0-9]+}}], [[VREG1]] offset0:3 offset1:5
459*9880d681SAndroid Build Coastguard Workerdefine void @sink_ds_address(%struct.foo addrspace(3)* nocapture %ptr) nounwind {
460*9880d681SAndroid Build Coastguard Workerentry:
461*9880d681SAndroid Build Coastguard Worker  %x = getelementptr inbounds %struct.foo, %struct.foo addrspace(3)* %ptr, i32 0, i32 1, i32 0
462*9880d681SAndroid Build Coastguard Worker  %y = getelementptr inbounds %struct.foo, %struct.foo addrspace(3)* %ptr, i32 0, i32 1, i32 2
463*9880d681SAndroid Build Coastguard Worker  br label %bb32
464*9880d681SAndroid Build Coastguard Worker
465*9880d681SAndroid Build Coastguard Workerbb32:
466*9880d681SAndroid Build Coastguard Worker  %a = load float, float addrspace(3)* %x, align 4
467*9880d681SAndroid Build Coastguard Worker  %b = load float, float addrspace(3)* %y, align 4
468*9880d681SAndroid Build Coastguard Worker  %cmp = fcmp one float %a, %b
469*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %bb34, label %bb33
470*9880d681SAndroid Build Coastguard Worker
471*9880d681SAndroid Build Coastguard Workerbb33:
472*9880d681SAndroid Build Coastguard Worker  unreachable
473*9880d681SAndroid Build Coastguard Worker
474*9880d681SAndroid Build Coastguard Workerbb34:
475*9880d681SAndroid Build Coastguard Worker  unreachable
476*9880d681SAndroid Build Coastguard Worker}
477*9880d681SAndroid Build Coastguard Worker
478*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.mbcnt.lo(i32, i32) #0
479*9880d681SAndroid Build Coastguard Worker
480*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind readnone }
481