xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/indirect-addressing-si.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; Tests for indirect addressing on SI, which is implemented using dynamic
5*9880d681SAndroid Build Coastguard Worker; indexing of vectors.
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}extract_w_offset:
8*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, 4.0
9*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, 0x40400000
10*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, 2.0
11*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, 1.0
12*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0
13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movrels_b32_e32
14*9880d681SAndroid Build Coastguard Workerdefine void @extract_w_offset(float addrspace(1)* %out, i32 %in) {
15*9880d681SAndroid Build Coastguard Workerentry:
16*9880d681SAndroid Build Coastguard Worker  %idx = add i32 %in, 1
17*9880d681SAndroid Build Coastguard Worker  %elt = extractelement <4 x float> <float 1.0, float 2.0, float 3.0, float 4.0>, i32 %idx
18*9880d681SAndroid Build Coastguard Worker  store float %elt, float addrspace(1)* %out
19*9880d681SAndroid Build Coastguard Worker  ret void
20*9880d681SAndroid Build Coastguard Worker}
21*9880d681SAndroid Build Coastguard Worker
22*9880d681SAndroid Build Coastguard Worker; XXX: Could do v_or_b32 directly
23*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}extract_w_offset_salu_use_vector:
24*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: s_or_b32
25*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: s_or_b32
26*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: s_or_b32
27*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: s_or_b32
28*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, s{{[0-9]+}}
29*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, s{{[0-9]+}}
30*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, s{{[0-9]+}}
31*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, s{{[0-9]+}}
32*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0
33*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movrels_b32_e32
34*9880d681SAndroid Build Coastguard Workerdefine void @extract_w_offset_salu_use_vector(i32 addrspace(1)* %out, i32 %in, <4 x i32> %or.val) {
35*9880d681SAndroid Build Coastguard Workerentry:
36*9880d681SAndroid Build Coastguard Worker  %idx = add i32 %in, 1
37*9880d681SAndroid Build Coastguard Worker  %vec = or <4 x i32> %or.val, <i32 1, i32 2, i32 3, i32 4>
38*9880d681SAndroid Build Coastguard Worker  %elt = extractelement <4 x i32> %vec, i32 %idx
39*9880d681SAndroid Build Coastguard Worker  store i32 %elt, i32 addrspace(1)* %out
40*9880d681SAndroid Build Coastguard Worker  ret void
41*9880d681SAndroid Build Coastguard Worker}
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}extract_wo_offset:
44*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, 4.0
45*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, 0x40400000
46*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, 2.0
47*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v{{[0-9]+}}, 1.0
48*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0
49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movrels_b32_e32
50*9880d681SAndroid Build Coastguard Workerdefine void @extract_wo_offset(float addrspace(1)* %out, i32 %in) {
51*9880d681SAndroid Build Coastguard Workerentry:
52*9880d681SAndroid Build Coastguard Worker  %elt = extractelement <4 x float> <float 1.0, float 2.0, float 3.0, float 4.0>, i32 %in
53*9880d681SAndroid Build Coastguard Worker  store float %elt, float addrspace(1)* %out
54*9880d681SAndroid Build Coastguard Worker  ret void
55*9880d681SAndroid Build Coastguard Worker}
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}extract_neg_offset_sgpr:
58*9880d681SAndroid Build Coastguard Worker; The offset depends on the register that holds the first element of the vector.
59*9880d681SAndroid Build Coastguard Worker; CHECK: s_add_i32 m0, s{{[0-9]+}}, 0xfffffe{{[0-9a-z]+}}
60*9880d681SAndroid Build Coastguard Worker; CHECK: v_movrels_b32_e32 v{{[0-9]}}, v0
61*9880d681SAndroid Build Coastguard Workerdefine void @extract_neg_offset_sgpr(i32 addrspace(1)* %out, i32 %offset) {
62*9880d681SAndroid Build Coastguard Workerentry:
63*9880d681SAndroid Build Coastguard Worker  %index = add i32 %offset, -512
64*9880d681SAndroid Build Coastguard Worker  %value = extractelement <4 x i32> <i32 0, i32 1, i32 2, i32 3>, i32 %index
65*9880d681SAndroid Build Coastguard Worker  store i32 %value, i32 addrspace(1)* %out
66*9880d681SAndroid Build Coastguard Worker  ret void
67*9880d681SAndroid Build Coastguard Worker}
68*9880d681SAndroid Build Coastguard Worker
69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}extract_neg_offset_sgpr_loaded:
70*9880d681SAndroid Build Coastguard Worker; The offset depends on the register that holds the first element of the vector.
71*9880d681SAndroid Build Coastguard Worker; CHECK: s_add_i32 m0, s{{[0-9]+}}, 0xfffffe{{[0-9a-z]+}}
72*9880d681SAndroid Build Coastguard Worker; CHECK: v_movrels_b32_e32 v{{[0-9]}}, v0
73*9880d681SAndroid Build Coastguard Workerdefine void @extract_neg_offset_sgpr_loaded(i32 addrspace(1)* %out, <4 x i32> %vec0, <4 x i32> %vec1, i32 %offset) {
74*9880d681SAndroid Build Coastguard Workerentry:
75*9880d681SAndroid Build Coastguard Worker  %index = add i32 %offset, -512
76*9880d681SAndroid Build Coastguard Worker  %or = or <4 x i32> %vec0, %vec1
77*9880d681SAndroid Build Coastguard Worker  %value = extractelement <4 x i32> %or, i32 %index
78*9880d681SAndroid Build Coastguard Worker  store i32 %value, i32 addrspace(1)* %out
79*9880d681SAndroid Build Coastguard Worker  ret void
80*9880d681SAndroid Build Coastguard Worker}
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}extract_neg_offset_vgpr:
83*9880d681SAndroid Build Coastguard Worker; The offset depends on the register that holds the first element of the vector.
84*9880d681SAndroid Build Coastguard Worker; CHECK: v_readfirstlane_b32
85*9880d681SAndroid Build Coastguard Worker; CHECK: s_add_i32 m0, m0, 0xfffffe{{[0-9a-z]+}}
86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movrels_b32_e32 v{{[0-9]}}, v0
87*9880d681SAndroid Build Coastguard Worker; CHECK: s_cbranch_execnz
88*9880d681SAndroid Build Coastguard Workerdefine void @extract_neg_offset_vgpr(i32 addrspace(1)* %out) {
89*9880d681SAndroid Build Coastguard Workerentry:
90*9880d681SAndroid Build Coastguard Worker  %id = call i32 @llvm.amdgcn.workitem.id.x() #1
91*9880d681SAndroid Build Coastguard Worker  %index = add i32 %id, -512
92*9880d681SAndroid Build Coastguard Worker  %value = extractelement <4 x i32> <i32 0, i32 1, i32 2, i32 3>, i32 %index
93*9880d681SAndroid Build Coastguard Worker  store i32 %value, i32 addrspace(1)* %out
94*9880d681SAndroid Build Coastguard Worker  ret void
95*9880d681SAndroid Build Coastguard Worker}
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}extract_undef_offset_sgpr:
98*9880d681SAndroid Build Coastguard Workerdefine void @extract_undef_offset_sgpr(i32 addrspace(1)* %out, <4 x i32> addrspace(1)* %in) {
99*9880d681SAndroid Build Coastguard Workerentry:
100*9880d681SAndroid Build Coastguard Worker  %ld = load volatile <4 x i32>, <4  x i32> addrspace(1)* %in
101*9880d681SAndroid Build Coastguard Worker  %value = extractelement <4 x i32> %ld, i32 undef
102*9880d681SAndroid Build Coastguard Worker  store i32 %value, i32 addrspace(1)* %out
103*9880d681SAndroid Build Coastguard Worker  ret void
104*9880d681SAndroid Build Coastguard Worker}
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}insert_undef_offset_sgpr_vector_src:
107*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_load_dwordx4
108*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0,
109*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movreld_b32
110*9880d681SAndroid Build Coastguard Workerdefine void @insert_undef_offset_sgpr_vector_src(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %in) {
111*9880d681SAndroid Build Coastguard Workerentry:
112*9880d681SAndroid Build Coastguard Worker  %ld = load <4 x i32>, <4  x i32> addrspace(1)* %in
113*9880d681SAndroid Build Coastguard Worker  %value = insertelement <4 x i32> %ld, i32 5, i32 undef
114*9880d681SAndroid Build Coastguard Worker  store <4 x i32> %value, <4 x i32> addrspace(1)* %out
115*9880d681SAndroid Build Coastguard Worker  ret void
116*9880d681SAndroid Build Coastguard Worker}
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}insert_w_offset:
119*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0
120*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movreld_b32_e32
121*9880d681SAndroid Build Coastguard Workerdefine void @insert_w_offset(float addrspace(1)* %out, i32 %in) {
122*9880d681SAndroid Build Coastguard Workerentry:
123*9880d681SAndroid Build Coastguard Worker  %0 = add i32 %in, 1
124*9880d681SAndroid Build Coastguard Worker  %1 = insertelement <4 x float> <float 1.0, float 2.0, float 3.0, float 4.0>, float 5.0, i32 %0
125*9880d681SAndroid Build Coastguard Worker  %2 = extractelement <4 x float> %1, i32 2
126*9880d681SAndroid Build Coastguard Worker  store float %2, float addrspace(1)* %out
127*9880d681SAndroid Build Coastguard Worker  ret void
128*9880d681SAndroid Build Coastguard Worker}
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}insert_wo_offset:
131*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0
132*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movreld_b32_e32
133*9880d681SAndroid Build Coastguard Workerdefine void @insert_wo_offset(float addrspace(1)* %out, i32 %in) {
134*9880d681SAndroid Build Coastguard Workerentry:
135*9880d681SAndroid Build Coastguard Worker  %0 = insertelement <4 x float> <float 1.0, float 2.0, float 3.0, float 4.0>, float 5.0, i32 %in
136*9880d681SAndroid Build Coastguard Worker  %1 = extractelement <4 x float> %0, i32 2
137*9880d681SAndroid Build Coastguard Worker  store float %1, float addrspace(1)* %out
138*9880d681SAndroid Build Coastguard Worker  ret void
139*9880d681SAndroid Build Coastguard Worker}
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}insert_neg_offset_sgpr:
142*9880d681SAndroid Build Coastguard Worker; The offset depends on the register that holds the first element of the vector.
143*9880d681SAndroid Build Coastguard Worker; CHECK: s_add_i32 m0, s{{[0-9]+}}, 0xfffffe{{[0-9a-z]+}}
144*9880d681SAndroid Build Coastguard Worker; CHECK: v_movreld_b32_e32 v0, v{{[0-9]}}
145*9880d681SAndroid Build Coastguard Workerdefine void @insert_neg_offset_sgpr(i32 addrspace(1)* %in, <4 x i32> addrspace(1)* %out, i32 %offset) {
146*9880d681SAndroid Build Coastguard Workerentry:
147*9880d681SAndroid Build Coastguard Worker  %index = add i32 %offset, -512
148*9880d681SAndroid Build Coastguard Worker  %value = insertelement <4 x i32> <i32 0, i32 1, i32 2, i32 3>, i32 5, i32 %index
149*9880d681SAndroid Build Coastguard Worker  store <4 x i32> %value, <4 x i32> addrspace(1)* %out
150*9880d681SAndroid Build Coastguard Worker  ret void
151*9880d681SAndroid Build Coastguard Worker}
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Worker; The vector indexed into is originally loaded into an SGPR rather
154*9880d681SAndroid Build Coastguard Worker; than built with a reg_sequence
155*9880d681SAndroid Build Coastguard Worker
156*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}insert_neg_offset_sgpr_loadreg:
157*9880d681SAndroid Build Coastguard Worker; The offset depends on the register that holds the first element of the vector.
158*9880d681SAndroid Build Coastguard Worker; CHECK: s_add_i32 m0, s{{[0-9]+}}, 0xfffffe{{[0-9a-z]+}}
159*9880d681SAndroid Build Coastguard Worker; CHECK: v_movreld_b32_e32 v0, v{{[0-9]}}
160*9880d681SAndroid Build Coastguard Workerdefine void @insert_neg_offset_sgpr_loadreg(i32 addrspace(1)* %in, <4 x i32> addrspace(1)* %out, <4 x i32> %vec, i32 %offset) {
161*9880d681SAndroid Build Coastguard Workerentry:
162*9880d681SAndroid Build Coastguard Worker  %index = add i32 %offset, -512
163*9880d681SAndroid Build Coastguard Worker  %value = insertelement <4 x i32> %vec, i32 5, i32 %index
164*9880d681SAndroid Build Coastguard Worker  store <4 x i32> %value, <4 x i32> addrspace(1)* %out
165*9880d681SAndroid Build Coastguard Worker  ret void
166*9880d681SAndroid Build Coastguard Worker}
167*9880d681SAndroid Build Coastguard Worker
168*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}insert_neg_offset_vgpr:
169*9880d681SAndroid Build Coastguard Worker; The offset depends on the register that holds the first element of the vector.
170*9880d681SAndroid Build Coastguard Worker; CHECK: v_readfirstlane_b32
171*9880d681SAndroid Build Coastguard Worker; CHECK: s_add_i32 m0, m0, 0xfffffe{{[0-9a-z]+}}
172*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movreld_b32_e32 v0, v{{[0-9]}}
173*9880d681SAndroid Build Coastguard Worker; CHECK: s_cbranch_execnz
174*9880d681SAndroid Build Coastguard Workerdefine void @insert_neg_offset_vgpr(i32 addrspace(1)* %in, <4 x i32> addrspace(1)* %out) {
175*9880d681SAndroid Build Coastguard Workerentry:
176*9880d681SAndroid Build Coastguard Worker  %id = call i32 @llvm.amdgcn.workitem.id.x() #1
177*9880d681SAndroid Build Coastguard Worker  %index = add i32 %id, -512
178*9880d681SAndroid Build Coastguard Worker  %value = insertelement <4 x i32> <i32 0, i32 1, i32 2, i32 3>, i32 5, i32 %index
179*9880d681SAndroid Build Coastguard Worker  store <4 x i32> %value, <4 x i32> addrspace(1)* %out
180*9880d681SAndroid Build Coastguard Worker  ret void
181*9880d681SAndroid Build Coastguard Worker}
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}insert_neg_inline_offset_vgpr:
184*9880d681SAndroid Build Coastguard Worker; The offset depends on the register that holds the first element of the vector.
185*9880d681SAndroid Build Coastguard Worker; CHECK: v_readfirstlane_b32
186*9880d681SAndroid Build Coastguard Worker; CHECK: s_add_i32 m0, m0, -{{[0-9]+}}
187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movreld_b32_e32 v0, v{{[0-9]}}
188*9880d681SAndroid Build Coastguard Worker; CHECK: s_cbranch_execnz
189*9880d681SAndroid Build Coastguard Workerdefine void @insert_neg_inline_offset_vgpr(i32 addrspace(1)* %in, <4 x i32> addrspace(1)* %out) {
190*9880d681SAndroid Build Coastguard Workerentry:
191*9880d681SAndroid Build Coastguard Worker  %id = call i32 @llvm.amdgcn.workitem.id.x() #1
192*9880d681SAndroid Build Coastguard Worker  %index = add i32 %id, -16
193*9880d681SAndroid Build Coastguard Worker  %value = insertelement <4 x i32> <i32 0, i32 1, i32 2, i32 3>, i32 5, i32 %index
194*9880d681SAndroid Build Coastguard Worker  store <4 x i32> %value, <4 x i32> addrspace(1)* %out
195*9880d681SAndroid Build Coastguard Worker  ret void
196*9880d681SAndroid Build Coastguard Worker}
197*9880d681SAndroid Build Coastguard Worker
198*9880d681SAndroid Build Coastguard Worker; When the block is split to insert the loop, make sure any other
199*9880d681SAndroid Build Coastguard Worker; places that need to be expanded in the same block are also handled.
200*9880d681SAndroid Build Coastguard Worker
201*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}extract_vgpr_offset_multiple_in_block:
202*9880d681SAndroid Build Coastguard Worker
203*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: {{buffer|flat}}_load_dword [[IDX0:v[0-9]+]]
204*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: s_mov_b32 [[S_ELT0:s[0-9]+]], 7
205*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: s_mov_b32 [[S_ELT1:s[0-9]+]], 9
206*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 [[VEC_ELT0:v[0-9]+]], [[S_ELT0]]
207*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 [[VEC_ELT1:v[0-9]+]], [[S_ELT1]]
208*9880d681SAndroid Build Coastguard Worker; CHECK: s_waitcnt vmcnt(0)
209*9880d681SAndroid Build Coastguard Worker
210*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b64 [[MASK:s\[[0-9]+:[0-9]+\]]], exec
211*9880d681SAndroid Build Coastguard Worker
212*9880d681SAndroid Build Coastguard Worker; CHECK: [[LOOP0:BB[0-9]+_[0-9]+]]:
213*9880d681SAndroid Build Coastguard Worker; CHECK: v_readfirstlane_b32 vcc_lo, [[IDX0]]
214*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0, vcc_lo
215*9880d681SAndroid Build Coastguard Worker; CHECK: v_cmp_eq_u32_e32 vcc, m0, [[IDX0]]
216*9880d681SAndroid Build Coastguard Worker; CHECK: s_and_saveexec_b64 vcc, vcc
217*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movrels_b32_e32 [[MOVREL0:v[0-9]+]], [[VEC_ELT0]]
218*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_xor_b64 exec, exec, vcc
219*9880d681SAndroid Build Coastguard Worker; CHECK: s_cbranch_execnz [[LOOP0]]
220*9880d681SAndroid Build Coastguard Worker
221*9880d681SAndroid Build Coastguard Worker; FIXME: Redundant copy
222*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b64 exec, [[MASK]]
223*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b64 [[MASK2:s\[[0-9]+:[0-9]+\]]], exec
224*9880d681SAndroid Build Coastguard Worker
225*9880d681SAndroid Build Coastguard Worker; CHECK: [[LOOP1:BB[0-9]+_[0-9]+]]:
226*9880d681SAndroid Build Coastguard Worker; CHECK: v_readfirstlane_b32 vcc_lo, [[IDX0]]
227*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0, vcc_lo
228*9880d681SAndroid Build Coastguard Worker; CHECK: v_cmp_eq_u32_e32 vcc, m0, [[IDX0]]
229*9880d681SAndroid Build Coastguard Worker; CHECK: s_and_saveexec_b64 vcc, vcc
230*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movrels_b32_e32 [[MOVREL1:v[0-9]+]], [[VEC_ELT1]]
231*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_xor_b64 exec, exec, vcc
232*9880d681SAndroid Build Coastguard Worker; CHECK: s_cbranch_execnz [[LOOP1]]
233*9880d681SAndroid Build Coastguard Worker
234*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_dword [[MOVREL0]]
235*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_dword [[MOVREL1]]
236*9880d681SAndroid Build Coastguard Workerdefine void @extract_vgpr_offset_multiple_in_block(i32 addrspace(1)* %out0, i32 addrspace(1)* %out1, i32 addrspace(1)* %in) #0 {
237*9880d681SAndroid Build Coastguard Workerentry:
238*9880d681SAndroid Build Coastguard Worker  %id = call i32 @llvm.amdgcn.workitem.id.x() #1
239*9880d681SAndroid Build Coastguard Worker  %id.ext = zext i32 %id to i64
240*9880d681SAndroid Build Coastguard Worker  %gep = getelementptr inbounds i32, i32 addrspace(1)* %in, i64 %id.ext
241*9880d681SAndroid Build Coastguard Worker  %idx0 = load volatile i32, i32 addrspace(1)* %gep
242*9880d681SAndroid Build Coastguard Worker  %idx1 = add i32 %idx0, 1
243*9880d681SAndroid Build Coastguard Worker  %val0 = extractelement <4 x i32> <i32 7, i32 9, i32 11, i32 13>, i32 %idx0
244*9880d681SAndroid Build Coastguard Worker  %live.out.reg = call i32 asm sideeffect "s_mov_b32 $0, 17", "={SGPR4}" ()
245*9880d681SAndroid Build Coastguard Worker  %val1 = extractelement <4 x i32> <i32 7, i32 9, i32 11, i32 13>, i32 %idx1
246*9880d681SAndroid Build Coastguard Worker  store volatile i32 %val0, i32 addrspace(1)* %out0
247*9880d681SAndroid Build Coastguard Worker  store volatile i32 %val1, i32 addrspace(1)* %out0
248*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %id, 0
249*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %bb1, label %bb2
250*9880d681SAndroid Build Coastguard Worker
251*9880d681SAndroid Build Coastguard Workerbb1:
252*9880d681SAndroid Build Coastguard Worker  store volatile i32 %live.out.reg, i32 addrspace(1)* undef
253*9880d681SAndroid Build Coastguard Worker  br label %bb2
254*9880d681SAndroid Build Coastguard Worker
255*9880d681SAndroid Build Coastguard Workerbb2:
256*9880d681SAndroid Build Coastguard Worker  ret void
257*9880d681SAndroid Build Coastguard Worker}
258*9880d681SAndroid Build Coastguard Worker
259*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}insert_vgpr_offset_multiple_in_block:
260*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: s_load_dwordx4 s{{\[}}[[S_ELT0:[0-9]+]]:[[S_ELT3:[0-9]+]]{{\]}}
261*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: {{buffer|flat}}_load_dword [[IDX0:v[0-9]+]]
262*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 [[VEC_ELT0:v[0-9]+]], s[[S_ELT0]]
263*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32 [[INS0:v[0-9]+]], 62
264*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: s_waitcnt vmcnt(0)
265*9880d681SAndroid Build Coastguard Worker
266*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b64 [[MASK:s\[[0-9]+:[0-9]+\]]], exec
267*9880d681SAndroid Build Coastguard Worker
268*9880d681SAndroid Build Coastguard Worker; CHECK: [[LOOP0:BB[0-9]+_[0-9]+]]:
269*9880d681SAndroid Build Coastguard Worker; CHECK: v_readfirstlane_b32 vcc_lo, [[IDX0]]
270*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0, vcc_lo
271*9880d681SAndroid Build Coastguard Worker; CHECK: v_cmp_eq_u32_e32 vcc, m0, [[IDX0]]
272*9880d681SAndroid Build Coastguard Worker; CHECK: s_and_saveexec_b64 vcc, vcc
273*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movreld_b32_e32 v[[MOVREL0:[0-9]+]], [[INS0]]
274*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_xor_b64 exec, exec, vcc
275*9880d681SAndroid Build Coastguard Worker; CHECK: s_cbranch_execnz [[LOOP0]]
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Worker; FIXME: Redundant copy
278*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b64 exec, [[MASK]]
279*9880d681SAndroid Build Coastguard Worker; CHECK: v_mov_b32_e32 [[INS1:v[0-9]+]], 63
280*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b64 [[MASK]], exec
281*9880d681SAndroid Build Coastguard Worker
282*9880d681SAndroid Build Coastguard Worker; CHECK: [[LOOP1:BB[0-9]+_[0-9]+]]:
283*9880d681SAndroid Build Coastguard Worker; CHECK: v_readfirstlane_b32 vcc_lo, [[IDX0]]
284*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0, vcc_lo
285*9880d681SAndroid Build Coastguard Worker; CHECK: v_cmp_eq_u32_e32 vcc, m0, [[IDX0]]
286*9880d681SAndroid Build Coastguard Worker; CHECK: s_and_saveexec_b64 vcc, vcc
287*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movreld_b32_e32 v[[MOVREL1:[0-9]+]], [[INS1]]
288*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: s_xor_b64 exec, exec, vcc
289*9880d681SAndroid Build Coastguard Worker; CHECK: s_cbranch_execnz [[LOOP1]]
290*9880d681SAndroid Build Coastguard Worker
291*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_dwordx4 v{{\[}}[[MOVREL0]]:
292*9880d681SAndroid Build Coastguard Worker
293*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_dword [[INS0]]
294*9880d681SAndroid Build Coastguard Workerdefine void @insert_vgpr_offset_multiple_in_block(<4 x i32> addrspace(1)* %out0, <4 x i32> addrspace(1)* %out1, i32 addrspace(1)* %in, <4 x i32> %vec0) #0 {
295*9880d681SAndroid Build Coastguard Workerentry:
296*9880d681SAndroid Build Coastguard Worker  %id = call i32 @llvm.amdgcn.workitem.id.x() #1
297*9880d681SAndroid Build Coastguard Worker  %id.ext = zext i32 %id to i64
298*9880d681SAndroid Build Coastguard Worker  %gep = getelementptr inbounds i32, i32 addrspace(1)* %in, i64 %id.ext
299*9880d681SAndroid Build Coastguard Worker  %idx0 = load volatile i32, i32 addrspace(1)* %gep
300*9880d681SAndroid Build Coastguard Worker  %idx1 = add i32 %idx0, 1
301*9880d681SAndroid Build Coastguard Worker  %live.out.val = call i32 asm sideeffect "v_mov_b32 $0, 62", "=v"()
302*9880d681SAndroid Build Coastguard Worker  %vec1 = insertelement <4 x i32> %vec0, i32 %live.out.val, i32 %idx0
303*9880d681SAndroid Build Coastguard Worker  %vec2 = insertelement <4 x i32> %vec1, i32 63, i32 %idx1
304*9880d681SAndroid Build Coastguard Worker  store volatile <4 x i32> %vec2, <4 x i32> addrspace(1)* %out0
305*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %id, 0
306*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %bb1, label %bb2
307*9880d681SAndroid Build Coastguard Worker
308*9880d681SAndroid Build Coastguard Workerbb1:
309*9880d681SAndroid Build Coastguard Worker  store volatile i32 %live.out.val, i32 addrspace(1)* undef
310*9880d681SAndroid Build Coastguard Worker  br label %bb2
311*9880d681SAndroid Build Coastguard Worker
312*9880d681SAndroid Build Coastguard Workerbb2:
313*9880d681SAndroid Build Coastguard Worker  ret void
314*9880d681SAndroid Build Coastguard Worker}
315*9880d681SAndroid Build Coastguard Worker
316*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}extract_adjacent_blocks:
317*9880d681SAndroid Build Coastguard Worker; CHECK: s_load_dword [[ARG:s[0-9]+]]
318*9880d681SAndroid Build Coastguard Worker; CHECK: s_cmp_lg_i32
319*9880d681SAndroid Build Coastguard Worker; CHECK: s_cbranch_scc0 [[BB4:BB[0-9]+_[0-9]+]]
320*9880d681SAndroid Build Coastguard Worker
321*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_load_dwordx4
322*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0,
323*9880d681SAndroid Build Coastguard Worker; CHECK: v_movrels_b32_e32
324*9880d681SAndroid Build Coastguard Worker; CHECK: s_branch [[ENDBB:BB[0-9]+_[0-9]+]]
325*9880d681SAndroid Build Coastguard Worker
326*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB4]]:
327*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_load_dwordx4
328*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0,
329*9880d681SAndroid Build Coastguard Worker; CHECK: v_movrels_b32_e32
330*9880d681SAndroid Build Coastguard Worker
331*9880d681SAndroid Build Coastguard Worker; CHECK: [[ENDBB]]:
332*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_dword
333*9880d681SAndroid Build Coastguard Worker; CHECK: s_endpgm
334*9880d681SAndroid Build Coastguard Workerdefine void @extract_adjacent_blocks(i32 %arg) #0 {
335*9880d681SAndroid Build Coastguard Workerbb:
336*9880d681SAndroid Build Coastguard Worker  %tmp = icmp eq i32 %arg, 0
337*9880d681SAndroid Build Coastguard Worker  br i1 %tmp, label %bb1, label %bb4
338*9880d681SAndroid Build Coastguard Worker
339*9880d681SAndroid Build Coastguard Workerbb1:
340*9880d681SAndroid Build Coastguard Worker  %tmp2 = load volatile <4 x float>, <4 x float> addrspace(1)* undef
341*9880d681SAndroid Build Coastguard Worker  %tmp3 = extractelement <4 x float> %tmp2, i32 undef
342*9880d681SAndroid Build Coastguard Worker  br label %bb7
343*9880d681SAndroid Build Coastguard Worker
344*9880d681SAndroid Build Coastguard Workerbb4:
345*9880d681SAndroid Build Coastguard Worker  %tmp5 = load volatile <4 x float>, <4 x float> addrspace(1)* undef
346*9880d681SAndroid Build Coastguard Worker  %tmp6 = extractelement <4 x float> %tmp5, i32 undef
347*9880d681SAndroid Build Coastguard Worker  br label %bb7
348*9880d681SAndroid Build Coastguard Worker
349*9880d681SAndroid Build Coastguard Workerbb7:
350*9880d681SAndroid Build Coastguard Worker  %tmp8 = phi float [ %tmp3, %bb1 ], [ %tmp6, %bb4 ]
351*9880d681SAndroid Build Coastguard Worker  store volatile float %tmp8, float addrspace(1)* undef
352*9880d681SAndroid Build Coastguard Worker  ret void
353*9880d681SAndroid Build Coastguard Worker}
354*9880d681SAndroid Build Coastguard Worker
355*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}insert_adjacent_blocks:
356*9880d681SAndroid Build Coastguard Worker; CHECK: s_load_dword [[ARG:s[0-9]+]]
357*9880d681SAndroid Build Coastguard Worker; CHECK: s_cmp_lg_i32
358*9880d681SAndroid Build Coastguard Worker; CHECK: s_cbranch_scc0 [[BB4:BB[0-9]+_[0-9]+]]
359*9880d681SAndroid Build Coastguard Worker
360*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_load_dwordx4
361*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0,
362*9880d681SAndroid Build Coastguard Worker; CHECK: v_movreld_b32_e32
363*9880d681SAndroid Build Coastguard Worker; CHECK: s_branch [[ENDBB:BB[0-9]+_[0-9]+]]
364*9880d681SAndroid Build Coastguard Worker
365*9880d681SAndroid Build Coastguard Worker; CHECK: [[BB4]]:
366*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_load_dwordx4
367*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0,
368*9880d681SAndroid Build Coastguard Worker; CHECK: v_movreld_b32_e32
369*9880d681SAndroid Build Coastguard Worker
370*9880d681SAndroid Build Coastguard Worker; CHECK: [[ENDBB]]:
371*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_dword
372*9880d681SAndroid Build Coastguard Worker; CHECK: s_endpgm
373*9880d681SAndroid Build Coastguard Workerdefine void @insert_adjacent_blocks(i32 %arg, float %val0) #0 {
374*9880d681SAndroid Build Coastguard Workerbb:
375*9880d681SAndroid Build Coastguard Worker  %tmp = icmp eq i32 %arg, 0
376*9880d681SAndroid Build Coastguard Worker  br i1 %tmp, label %bb1, label %bb4
377*9880d681SAndroid Build Coastguard Worker
378*9880d681SAndroid Build Coastguard Workerbb1:                                              ; preds = %bb
379*9880d681SAndroid Build Coastguard Worker  %tmp2 = load volatile <4 x float>, <4 x float> addrspace(1)* undef
380*9880d681SAndroid Build Coastguard Worker  %tmp3 = insertelement <4 x float> %tmp2, float %val0, i32 undef
381*9880d681SAndroid Build Coastguard Worker  br label %bb7
382*9880d681SAndroid Build Coastguard Worker
383*9880d681SAndroid Build Coastguard Workerbb4:                                              ; preds = %bb
384*9880d681SAndroid Build Coastguard Worker  %tmp5 = load volatile <4 x float>, <4 x float> addrspace(1)* undef
385*9880d681SAndroid Build Coastguard Worker  %tmp6 = insertelement <4 x float> %tmp5, float %val0, i32 undef
386*9880d681SAndroid Build Coastguard Worker  br label %bb7
387*9880d681SAndroid Build Coastguard Worker
388*9880d681SAndroid Build Coastguard Workerbb7:                                              ; preds = %bb4, %bb1
389*9880d681SAndroid Build Coastguard Worker  %tmp8 = phi <4 x float> [ %tmp3, %bb1 ], [ %tmp6, %bb4 ]
390*9880d681SAndroid Build Coastguard Worker  store volatile <4 x float> %tmp8, <4 x float> addrspace(1)* undef
391*9880d681SAndroid Build Coastguard Worker  ret void
392*9880d681SAndroid Build Coastguard Worker}
393*9880d681SAndroid Build Coastguard Worker
394*9880d681SAndroid Build Coastguard Worker; FIXME: Should be able to fold zero input to movreld to inline imm?
395*9880d681SAndroid Build Coastguard Worker
396*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}multi_same_block:
397*9880d681SAndroid Build Coastguard Worker; CHECK: s_load_dword [[ARG:s[0-9]+]]
398*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 [[ZERO:v[0-9]+]], 0{{$}}
399*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: s_add_i32 m0, [[ARG]], -16
400*9880d681SAndroid Build Coastguard Worker; CHECK: v_movreld_b32_e32 v{{[0-9]+}}, [[ZERO]]
401*9880d681SAndroid Build Coastguard Worker
402*9880d681SAndroid Build Coastguard Worker; CHECK: s_add_i32 m0, [[ARG]], -14
403*9880d681SAndroid Build Coastguard Worker; CHECK: v_movreld_b32_e32 v{{[0-9]+}}, v{{[0-9]+}}
404*9880d681SAndroid Build Coastguard Worker
405*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0, -1
406*9880d681SAndroid Build Coastguard Worker; CHECK: ds_write_b32
407*9880d681SAndroid Build Coastguard Worker; CHECK: ds_write_b32
408*9880d681SAndroid Build Coastguard Worker; CHECK: s_endpgm
409*9880d681SAndroid Build Coastguard Workerdefine void @multi_same_block(i32 %arg) #0 {
410*9880d681SAndroid Build Coastguard Workerbb:
411*9880d681SAndroid Build Coastguard Worker  %tmp1 = add i32 %arg, -16
412*9880d681SAndroid Build Coastguard Worker  %tmp2 = insertelement <6 x float> <float 1.700000e+01, float 1.800000e+01, float 1.900000e+01, float 2.000000e+01, float 2.100000e+01, float 2.200000e+01>, float 0.000000e+00, i32 %tmp1
413*9880d681SAndroid Build Coastguard Worker  %tmp3 = add i32 %arg, -16
414*9880d681SAndroid Build Coastguard Worker  %tmp4 = insertelement <6 x float> <float 0x40311999A0000000, float 0x40321999A0000000, float 0x40331999A0000000, float 0x40341999A0000000, float 0x40351999A0000000, float 0x40361999A0000000>, float 0x3FB99999A0000000, i32 %tmp3
415*9880d681SAndroid Build Coastguard Worker  %tmp5 = bitcast <6 x float> %tmp2 to <6 x i32>
416*9880d681SAndroid Build Coastguard Worker  %tmp6 = extractelement <6 x i32> %tmp5, i32 1
417*9880d681SAndroid Build Coastguard Worker  %tmp7 = bitcast <6 x float> %tmp4 to <6 x i32>
418*9880d681SAndroid Build Coastguard Worker  %tmp8 = extractelement <6 x i32> %tmp7, i32 5
419*9880d681SAndroid Build Coastguard Worker  store volatile i32 %tmp6, i32 addrspace(3)* undef, align 4
420*9880d681SAndroid Build Coastguard Worker  store volatile i32 %tmp8, i32 addrspace(3)* undef, align 4
421*9880d681SAndroid Build Coastguard Worker  ret void
422*9880d681SAndroid Build Coastguard Worker}
423*9880d681SAndroid Build Coastguard Worker
424*9880d681SAndroid Build Coastguard Worker; offset puts outside of superegister bounaries, so clamp to 1st element.
425*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}extract_largest_inbounds_offset:
426*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_load_dwordx4 v{{\[}}[[LO_ELT:[0-9]+]]:[[HI_ELT:[0-9]+]]{{\]}}
427*9880d681SAndroid Build Coastguard Worker; CHECK: s_load_dword [[IDX:s[0-9]+]]
428*9880d681SAndroid Build Coastguard Worker; CHECK: s_mov_b32 m0, [[IDX]]
429*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movrels_b32_e32 [[EXTRACT:v[0-9]+]], v[[HI_ELT]]
430*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_dword [[EXTRACT]]
431*9880d681SAndroid Build Coastguard Workerdefine void @extract_largest_inbounds_offset(i32 addrspace(1)* %out, <4 x i32> addrspace(1)* %in, i32 %idx) {
432*9880d681SAndroid Build Coastguard Workerentry:
433*9880d681SAndroid Build Coastguard Worker  %ld = load volatile <4 x i32>, <4  x i32> addrspace(1)* %in
434*9880d681SAndroid Build Coastguard Worker  %offset = add i32 %idx, 3
435*9880d681SAndroid Build Coastguard Worker  %value = extractelement <4 x i32> %ld, i32 %offset
436*9880d681SAndroid Build Coastguard Worker  store i32 %value, i32 addrspace(1)* %out
437*9880d681SAndroid Build Coastguard Worker  ret void
438*9880d681SAndroid Build Coastguard Worker}
439*9880d681SAndroid Build Coastguard Worker
440*9880d681SAndroid Build Coastguard Worker; CHECK-LABL: {{^}}extract_out_of_bounds_offset:
441*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_load_dwordx4 v{{\[}}[[LO_ELT:[0-9]+]]:[[HI_ELT:[0-9]+]]{{\]}}
442*9880d681SAndroid Build Coastguard Worker; CHECK: s_load_dword [[IDX:s[0-9]+]]
443*9880d681SAndroid Build Coastguard Worker; CHECK: s_add_i32 m0, [[IDX]], 4
444*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: v_movrels_b32_e32 [[EXTRACT:v[0-9]+]], v[[LO_ELT]]
445*9880d681SAndroid Build Coastguard Worker; CHECK: buffer_store_dword [[EXTRACT]]
446*9880d681SAndroid Build Coastguard Workerdefine void @extract_out_of_bounds_offset(i32 addrspace(1)* %out, <4 x i32> addrspace(1)* %in, i32 %idx) {
447*9880d681SAndroid Build Coastguard Workerentry:
448*9880d681SAndroid Build Coastguard Worker  %ld = load volatile <4 x i32>, <4  x i32> addrspace(1)* %in
449*9880d681SAndroid Build Coastguard Worker  %offset = add i32 %idx, 4
450*9880d681SAndroid Build Coastguard Worker  %value = extractelement <4 x i32> %ld, i32 %offset
451*9880d681SAndroid Build Coastguard Worker  store i32 %value, i32 addrspace(1)* %out
452*9880d681SAndroid Build Coastguard Worker  ret void
453*9880d681SAndroid Build Coastguard Worker}
454*9880d681SAndroid Build Coastguard Worker
455*9880d681SAndroid Build Coastguard Worker; Test that the or is folded into the base address register instead of
456*9880d681SAndroid Build Coastguard Worker; added to m0
457*9880d681SAndroid Build Coastguard Worker
458*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}extractelement_v4i32_or_index:
459*9880d681SAndroid Build Coastguard Worker; GCN: s_load_dword [[IDX_IN:s[0-9]+]]
460*9880d681SAndroid Build Coastguard Worker; GCN: s_lshl_b32 [[IDX_SHL:s[0-9]+]], [[IDX_IN]]
461*9880d681SAndroid Build Coastguard Worker; GCN-NOT: [[IDX_SHL]]
462*9880d681SAndroid Build Coastguard Worker; GCN: s_mov_b32 m0, [[IDX_SHL]]
463*9880d681SAndroid Build Coastguard Worker; GCN: v_movreld_b32_e32 v{{[0-9]+}}, v{{[0-9]+}}
464*9880d681SAndroid Build Coastguard Workerdefine void @extractelement_v4i32_or_index(i32 addrspace(1)* %out, <4 x i32> addrspace(1)* %in, i32 %idx.in) {
465*9880d681SAndroid Build Coastguard Workerentry:
466*9880d681SAndroid Build Coastguard Worker  %ld = load volatile <4 x i32>, <4  x i32> addrspace(1)* %in
467*9880d681SAndroid Build Coastguard Worker  %idx.shl = shl i32 %idx.in, 2
468*9880d681SAndroid Build Coastguard Worker  %idx = or i32 %idx.shl, 1
469*9880d681SAndroid Build Coastguard Worker  %value = extractelement <4 x i32> %ld, i32 %idx
470*9880d681SAndroid Build Coastguard Worker  store i32 %value, i32 addrspace(1)* %out
471*9880d681SAndroid Build Coastguard Worker  ret void
472*9880d681SAndroid Build Coastguard Worker}
473*9880d681SAndroid Build Coastguard Worker
474*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}insertelement_v4f32_or_index:
475*9880d681SAndroid Build Coastguard Worker; GCN: s_load_dword [[IDX_IN:s[0-9]+]]
476*9880d681SAndroid Build Coastguard Worker; GCN: s_lshl_b32 [[IDX_SHL:s[0-9]+]], [[IDX_IN]]
477*9880d681SAndroid Build Coastguard Worker; GCN-NOT: [[IDX_SHL]]
478*9880d681SAndroid Build Coastguard Worker; GCN: s_mov_b32 m0, [[IDX_SHL]]
479*9880d681SAndroid Build Coastguard Worker; GCN: v_movreld_b32_e32 v{{[0-9]+}}, v{{[0-9]+}}
480*9880d681SAndroid Build Coastguard Workerdefine void @insertelement_v4f32_or_index(<4 x float> addrspace(1)* %out, <4 x float> %a, i32 %idx.in) nounwind {
481*9880d681SAndroid Build Coastguard Worker  %idx.shl = shl i32 %idx.in, 2
482*9880d681SAndroid Build Coastguard Worker  %idx = or i32 %idx.shl, 1
483*9880d681SAndroid Build Coastguard Worker  %vecins = insertelement <4 x float> %a, float 5.000000e+00, i32 %idx
484*9880d681SAndroid Build Coastguard Worker  store <4 x float> %vecins, <4 x float> addrspace(1)* %out, align 16
485*9880d681SAndroid Build Coastguard Worker  ret void
486*9880d681SAndroid Build Coastguard Worker}
487*9880d681SAndroid Build Coastguard Worker
488*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.workitem.id.x() #1
489*9880d681SAndroid Build Coastguard Worker
490*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind }
491*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind readnone }
492