xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/select-vectors.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs -march=amdgcn < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -verify-machineinstrs -march=amdgcn -mcpu=tonga < %s | FileCheck -check-prefix=SI -check-prefix=FUNC %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; Test expansion of scalar selects on vectors.
5*9880d681SAndroid Build Coastguard Worker; Evergreen not enabled since it seems to be having problems with doubles.
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}select_v4i8:
9*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
10*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
11*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
12*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
13*9880d681SAndroid Build Coastguard Workerdefine void @select_v4i8(<4 x i8> addrspace(1)* %out, <4 x i8> %a, <4 x i8> %b, i8 %c) nounwind {
14*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i8 %c, 0
15*9880d681SAndroid Build Coastguard Worker  %select = select i1 %cmp, <4 x i8> %a, <4 x i8> %b
16*9880d681SAndroid Build Coastguard Worker  store <4 x i8> %select, <4 x i8> addrspace(1)* %out, align 4
17*9880d681SAndroid Build Coastguard Worker  ret void
18*9880d681SAndroid Build Coastguard Worker}
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}select_v4i16:
21*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
22*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
23*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
24*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
25*9880d681SAndroid Build Coastguard Workerdefine void @select_v4i16(<4 x i16> addrspace(1)* %out, <4 x i16> %a, <4 x i16> %b, i32 %c) nounwind {
26*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %c, 0
27*9880d681SAndroid Build Coastguard Worker  %select = select i1 %cmp, <4 x i16> %a, <4 x i16> %b
28*9880d681SAndroid Build Coastguard Worker  store <4 x i16> %select, <4 x i16> addrspace(1)* %out, align 4
29*9880d681SAndroid Build Coastguard Worker  ret void
30*9880d681SAndroid Build Coastguard Worker}
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Worker; FIXME: Expansion with bitwise operations may be better if doing a
33*9880d681SAndroid Build Coastguard Worker; vector select with SGPR inputs.
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_select_v2i32:
36*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
37*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
38*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2
39*9880d681SAndroid Build Coastguard Workerdefine void @s_select_v2i32(<2 x i32> addrspace(1)* %out, <2 x i32> %a, <2 x i32> %b, i32 %c) nounwind {
40*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %c, 0
41*9880d681SAndroid Build Coastguard Worker  %select = select i1 %cmp, <2 x i32> %a, <2 x i32> %b
42*9880d681SAndroid Build Coastguard Worker  store <2 x i32> %select, <2 x i32> addrspace(1)* %out, align 8
43*9880d681SAndroid Build Coastguard Worker  ret void
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_select_v4i32:
47*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
48*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
49*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
50*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
51*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx4
52*9880d681SAndroid Build Coastguard Workerdefine void @s_select_v4i32(<4 x i32> addrspace(1)* %out, <4 x i32> %a, <4 x i32> %b, i32 %c) nounwind {
53*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %c, 0
54*9880d681SAndroid Build Coastguard Worker  %select = select i1 %cmp, <4 x i32> %a, <4 x i32> %b
55*9880d681SAndroid Build Coastguard Worker  store <4 x i32> %select, <4 x i32> addrspace(1)* %out, align 16
56*9880d681SAndroid Build Coastguard Worker  ret void
57*9880d681SAndroid Build Coastguard Worker}
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}v_select_v4i32:
60*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dwordx4
61*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_gt_u32_e64 vcc, 32, s{{[0-9]+}}
62*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32 v{{[0-9]+}}, 0, v{{[0-9]+}}
63*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32 v{{[0-9]+}}, 0, v{{[0-9]+}}
64*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32 v{{[0-9]+}}, 0, v{{[0-9]+}}
65*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32 v{{[0-9]+}}, 0, v{{[0-9]+}}
66*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx4
67*9880d681SAndroid Build Coastguard Workerdefine void @v_select_v4i32(<4 x i32> addrspace(1)* %out, <4 x i32> addrspace(1)* %in, i32 %cond) #0 {
68*9880d681SAndroid Build Coastguard Workerbb:
69*9880d681SAndroid Build Coastguard Worker  %tmp2 = icmp ult i32 %cond, 32
70*9880d681SAndroid Build Coastguard Worker  %val = load <4 x i32>, <4 x i32> addrspace(1)* %in
71*9880d681SAndroid Build Coastguard Worker  %tmp3 = select i1 %tmp2, <4 x i32> %val, <4 x i32> zeroinitializer
72*9880d681SAndroid Build Coastguard Worker  store <4 x i32> %tmp3, <4 x i32> addrspace(1)* %out, align 16
73*9880d681SAndroid Build Coastguard Worker  ret void
74*9880d681SAndroid Build Coastguard Worker}
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}select_v8i32:
77*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
78*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
79*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
80*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
81*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
82*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
83*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
84*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
85*9880d681SAndroid Build Coastguard Workerdefine void @select_v8i32(<8 x i32> addrspace(1)* %out, <8 x i32> %a, <8 x i32> %b, i32 %c) nounwind {
86*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %c, 0
87*9880d681SAndroid Build Coastguard Worker  %select = select i1 %cmp, <8 x i32> %a, <8 x i32> %b
88*9880d681SAndroid Build Coastguard Worker  store <8 x i32> %select, <8 x i32> addrspace(1)* %out, align 16
89*9880d681SAndroid Build Coastguard Worker  ret void
90*9880d681SAndroid Build Coastguard Worker}
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_select_v2f32:
93*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 s{{\[}}[[ALO:[0-9]+]]:[[AHI:[0-9]+]]{{\]}}, s{{\[[0-9]+:[0-9]+\]}}, {{0xb|0x2c}}
94*9880d681SAndroid Build Coastguard Worker; SI-DAG: s_load_dwordx2 s{{\[}}[[BLO:[0-9]+]]:[[BHI:[0-9]+]]{{\]}}, s{{\[[0-9]+:[0-9]+\]}}, {{0xd|0x34}}
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 v{{[0-9]+}}, s[[ALO]]
97*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 v{{[0-9]+}}, s[[AHI]]
98*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 v{{[0-9]+}}, s[[BLO]]
99*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_mov_b32_e32 v{{[0-9]+}}, s[[BHI]]
100*9880d681SAndroid Build Coastguard Worker; SI-DAG: v_cmp_eq_i32_e64 vcc, 0, s{{[0-9]+}}
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
103*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
104*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx2
105*9880d681SAndroid Build Coastguard Workerdefine void @s_select_v2f32(<2 x float> addrspace(1)* %out, <2 x float> %a, <2 x float> %b, i32 %c) nounwind {
106*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %c, 0
107*9880d681SAndroid Build Coastguard Worker  %select = select i1 %cmp, <2 x float> %a, <2 x float> %b
108*9880d681SAndroid Build Coastguard Worker  store <2 x float> %select, <2 x float> addrspace(1)* %out, align 16
109*9880d681SAndroid Build Coastguard Worker  ret void
110*9880d681SAndroid Build Coastguard Worker}
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}s_select_v4f32:
113*9880d681SAndroid Build Coastguard Worker; SI: s_load_dwordx4
114*9880d681SAndroid Build Coastguard Worker; SI: s_load_dwordx4
115*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_eq_i32_e64 vcc, 0, s{{[0-9]+}}
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
118*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
119*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
120*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx4
123*9880d681SAndroid Build Coastguard Workerdefine void @s_select_v4f32(<4 x float> addrspace(1)* %out, <4 x float> %a, <4 x float> %b, i32 %c) nounwind {
124*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %c, 0
125*9880d681SAndroid Build Coastguard Worker  %select = select i1 %cmp, <4 x float> %a, <4 x float> %b
126*9880d681SAndroid Build Coastguard Worker  store <4 x float> %select, <4 x float> addrspace(1)* %out, align 16
127*9880d681SAndroid Build Coastguard Worker  ret void
128*9880d681SAndroid Build Coastguard Worker}
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}v_select_v4f32:
131*9880d681SAndroid Build Coastguard Worker; SI: buffer_load_dwordx4
132*9880d681SAndroid Build Coastguard Worker; SI: v_cmp_gt_u32_e64 vcc, 32, s{{[0-9]+}}
133*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32 v{{[0-9]+}}, 0, v{{[0-9]+}}
134*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32 v{{[0-9]+}}, 0, v{{[0-9]+}}
135*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32 v{{[0-9]+}}, 0, v{{[0-9]+}}
136*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32 v{{[0-9]+}}, 0, v{{[0-9]+}}
137*9880d681SAndroid Build Coastguard Worker; SI: buffer_store_dwordx4
138*9880d681SAndroid Build Coastguard Workerdefine void @v_select_v4f32(<4 x float> addrspace(1)* %out, <4 x float> addrspace(1)* %in, i32 %cond) #0 {
139*9880d681SAndroid Build Coastguard Workerbb:
140*9880d681SAndroid Build Coastguard Worker  %tmp2 = icmp ult i32 %cond, 32
141*9880d681SAndroid Build Coastguard Worker  %val = load <4 x float>, <4 x float> addrspace(1)* %in
142*9880d681SAndroid Build Coastguard Worker  %tmp3 = select i1 %tmp2, <4 x float> %val, <4 x float> zeroinitializer
143*9880d681SAndroid Build Coastguard Worker  store <4 x float> %tmp3, <4 x float> addrspace(1)* %out, align 16
144*9880d681SAndroid Build Coastguard Worker  ret void
145*9880d681SAndroid Build Coastguard Worker}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}select_v8f32:
148*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
149*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
150*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
151*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
152*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
153*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
154*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
155*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
156*9880d681SAndroid Build Coastguard Workerdefine void @select_v8f32(<8 x float> addrspace(1)* %out, <8 x float> %a, <8 x float> %b, i32 %c) nounwind {
157*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %c, 0
158*9880d681SAndroid Build Coastguard Worker  %select = select i1 %cmp, <8 x float> %a, <8 x float> %b
159*9880d681SAndroid Build Coastguard Worker  store <8 x float> %select, <8 x float> addrspace(1)* %out, align 16
160*9880d681SAndroid Build Coastguard Worker  ret void
161*9880d681SAndroid Build Coastguard Worker}
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}select_v2f64:
164*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
165*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
166*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
167*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
168*9880d681SAndroid Build Coastguard Workerdefine void @select_v2f64(<2 x double> addrspace(1)* %out, <2 x double> %a, <2 x double> %b, i32 %c) nounwind {
169*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %c, 0
170*9880d681SAndroid Build Coastguard Worker  %select = select i1 %cmp, <2 x double> %a, <2 x double> %b
171*9880d681SAndroid Build Coastguard Worker  store <2 x double> %select, <2 x double> addrspace(1)* %out, align 16
172*9880d681SAndroid Build Coastguard Worker  ret void
173*9880d681SAndroid Build Coastguard Worker}
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}select_v4f64:
176*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
177*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
178*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
179*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
180*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
181*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
182*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
183*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
184*9880d681SAndroid Build Coastguard Workerdefine void @select_v4f64(<4 x double> addrspace(1)* %out, <4 x double> %a, <4 x double> %b, i32 %c) nounwind {
185*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %c, 0
186*9880d681SAndroid Build Coastguard Worker  %select = select i1 %cmp, <4 x double> %a, <4 x double> %b
187*9880d681SAndroid Build Coastguard Worker  store <4 x double> %select, <4 x double> addrspace(1)* %out, align 16
188*9880d681SAndroid Build Coastguard Worker  ret void
189*9880d681SAndroid Build Coastguard Worker}
190*9880d681SAndroid Build Coastguard Worker
191*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}select_v8f64:
192*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
193*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
194*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
195*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
196*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
197*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
198*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
199*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
200*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
201*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
202*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
203*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
204*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
205*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
206*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
207*9880d681SAndroid Build Coastguard Worker; SI: v_cndmask_b32_e32
208*9880d681SAndroid Build Coastguard Workerdefine void @select_v8f64(<8 x double> addrspace(1)* %out, <8 x double> %a, <8 x double> %b, i32 %c) nounwind {
209*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %c, 0
210*9880d681SAndroid Build Coastguard Worker  %select = select i1 %cmp, <8 x double> %a, <8 x double> %b
211*9880d681SAndroid Build Coastguard Worker  store <8 x double> %select, <8 x double> addrspace(1)* %out, align 16
212*9880d681SAndroid Build Coastguard Worker  ret void
213*9880d681SAndroid Build Coastguard Worker}
214*9880d681SAndroid Build Coastguard Worker
215*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind readnone
216*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.workitem.id.x() #1
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind }
219*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind readnone }
220