[TTI] getTypeBasedIntrinsicInstrCost - add basic handling for strided load/store...
[llvm-project.git] / llvm / test / Transforms / PhaseOrdering / X86 / vector-reductions-logical.ll
blob035f3f145bf8d32a7358816e7595624364a56efd
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -O2 -S < %s | FileCheck %s
4 target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
5 target triple = "x86_64--"
7 define float @test_merge_allof_v4sf(<4 x float> %t) {
8 ; CHECK-LABEL: @test_merge_allof_v4sf(
9 ; CHECK-NEXT:  entry:
10 ; CHECK-NEXT:    [[T_FR:%.*]] = freeze <4 x float> [[T:%.*]]
11 ; CHECK-NEXT:    [[TMP0:%.*]] = fcmp uge <4 x float> [[T_FR]], zeroinitializer
12 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <4 x i1> [[TMP0]] to i4
13 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i4 [[TMP1]], 0
14 ; CHECK-NEXT:    [[TMP3:%.*]] = fcmp ule <4 x float> [[T_FR]], splat (float 1.000000e+00)
15 ; CHECK-NEXT:    [[TMP4:%.*]] = bitcast <4 x i1> [[TMP3]] to i4
16 ; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i4 [[TMP4]], 0
17 ; CHECK-NEXT:    [[OR_COND:%.*]] = or i1 [[TMP2]], [[TMP5]]
18 ; CHECK-NEXT:    [[SHIFT:%.*]] = shufflevector <4 x float> [[T_FR]], <4 x float> poison, <4 x i32> <i32 1, i32 poison, i32 poison, i32 poison>
19 ; CHECK-NEXT:    [[TMP6:%.*]] = fadd <4 x float> [[T_FR]], [[SHIFT]]
20 ; CHECK-NEXT:    [[ADD:%.*]] = extractelement <4 x float> [[TMP6]], i64 0
21 ; CHECK-NEXT:    [[RETVAL_0:%.*]] = select i1 [[OR_COND]], float 0.000000e+00, float [[ADD]]
22 ; CHECK-NEXT:    ret float [[RETVAL_0]]
24 entry:
25   %vecext = extractelement <4 x float> %t, i32 0
26   %conv = fpext float %vecext to double
27   %cmp = fcmp olt double %conv, 0.000000e+00
28   br i1 %cmp, label %land.lhs.true, label %lor.lhs.false
30 land.lhs.true:
31   %vecext2 = extractelement <4 x float> %t, i32 1
32   %conv3 = fpext float %vecext2 to double
33   %cmp4 = fcmp olt double %conv3, 0.000000e+00
34   br i1 %cmp4, label %land.lhs.true6, label %lor.lhs.false
36 land.lhs.true6:
37   %vecext7 = extractelement <4 x float> %t, i32 2
38   %conv8 = fpext float %vecext7 to double
39   %cmp9 = fcmp olt double %conv8, 0.000000e+00
40   br i1 %cmp9, label %land.lhs.true11, label %lor.lhs.false
42 land.lhs.true11:
43   %vecext12 = extractelement <4 x float> %t, i32 3
44   %conv13 = fpext float %vecext12 to double
45   %cmp14 = fcmp olt double %conv13, 0.000000e+00
46   br i1 %cmp14, label %if.then, label %lor.lhs.false
48 lor.lhs.false:
49   %vecext16 = extractelement <4 x float> %t, i32 0
50   %conv17 = fpext float %vecext16 to double
51   %cmp18 = fcmp ogt double %conv17, 1.000000e+00
52   br i1 %cmp18, label %land.lhs.true20, label %if.end
54 land.lhs.true20:
55   %vecext21 = extractelement <4 x float> %t, i32 1
56   %conv22 = fpext float %vecext21 to double
57   %cmp23 = fcmp ogt double %conv22, 1.000000e+00
58   br i1 %cmp23, label %land.lhs.true25, label %if.end
60 land.lhs.true25:
61   %vecext26 = extractelement <4 x float> %t, i32 2
62   %conv27 = fpext float %vecext26 to double
63   %cmp28 = fcmp ogt double %conv27, 1.000000e+00
64   br i1 %cmp28, label %land.lhs.true30, label %if.end
66 land.lhs.true30:
67   %vecext31 = extractelement <4 x float> %t, i32 3
68   %conv32 = fpext float %vecext31 to double
69   %cmp33 = fcmp ogt double %conv32, 1.000000e+00
70   br i1 %cmp33, label %if.then, label %if.end
72 if.then:
73   br label %return
75 if.end:
76   %vecext35 = extractelement <4 x float> %t, i32 0
77   %vecext36 = extractelement <4 x float> %t, i32 1
78   %add = fadd float %vecext35, %vecext36
79   br label %return
81 return:
82   %retval.0 = phi float [ 0.000000e+00, %if.then ], [ %add, %if.end ]
83   ret float %retval.0
86 define float @test_merge_anyof_v4sf(<4 x float> %t) {
87 ; CHECK-LABEL: @test_merge_anyof_v4sf(
88 ; CHECK-NEXT:  entry:
89 ; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <4 x float> [[T:%.*]], <4 x float> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
90 ; CHECK-NEXT:    [[TMP1:%.*]] = fcmp ogt <8 x float> [[TMP0]], <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>
91 ; CHECK-NEXT:    [[TMP2:%.*]] = fcmp olt <8 x float> [[TMP0]], <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00, float 0.000000e+00>
92 ; CHECK-NEXT:    [[TMP3:%.*]] = shufflevector <8 x i1> [[TMP1]], <8 x i1> [[TMP2]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 12, i32 13, i32 14, i32 15>
93 ; CHECK-NEXT:    [[TMP4:%.*]] = freeze <8 x i1> [[TMP3]]
94 ; CHECK-NEXT:    [[TMP5:%.*]] = bitcast <8 x i1> [[TMP4]] to i8
95 ; CHECK-NEXT:    [[DOTNOT:%.*]] = icmp eq i8 [[TMP5]], 0
96 ; CHECK-NEXT:    [[SHIFT:%.*]] = shufflevector <4 x float> [[T]], <4 x float> poison, <4 x i32> <i32 1, i32 poison, i32 poison, i32 poison>
97 ; CHECK-NEXT:    [[TMP6:%.*]] = fadd <4 x float> [[T]], [[SHIFT]]
98 ; CHECK-NEXT:    [[ADD:%.*]] = extractelement <4 x float> [[TMP6]], i64 0
99 ; CHECK-NEXT:    [[RETVAL_0:%.*]] = select i1 [[DOTNOT]], float [[ADD]], float 0.000000e+00
100 ; CHECK-NEXT:    ret float [[RETVAL_0]]
102 entry:
103   %vecext = extractelement <4 x float> %t, i32 0
104   %conv = fpext float %vecext to double
105   %cmp = fcmp olt double %conv, 0.000000e+00
106   br i1 %cmp, label %if.then, label %lor.lhs.false
108 lor.lhs.false:
109   %vecext2 = extractelement <4 x float> %t, i32 1
110   %conv3 = fpext float %vecext2 to double
111   %cmp4 = fcmp olt double %conv3, 0.000000e+00
112   br i1 %cmp4, label %if.then, label %lor.lhs.false6
114 lor.lhs.false6:
115   %vecext7 = extractelement <4 x float> %t, i32 2
116   %conv8 = fpext float %vecext7 to double
117   %cmp9 = fcmp olt double %conv8, 0.000000e+00
118   br i1 %cmp9, label %if.then, label %lor.lhs.false11
120 lor.lhs.false11:
121   %vecext12 = extractelement <4 x float> %t, i32 3
122   %conv13 = fpext float %vecext12 to double
123   %cmp14 = fcmp olt double %conv13, 0.000000e+00
124   br i1 %cmp14, label %if.then, label %lor.lhs.false16
126 lor.lhs.false16:
127   %vecext17 = extractelement <4 x float> %t, i32 0
128   %conv18 = fpext float %vecext17 to double
129   %cmp19 = fcmp ogt double %conv18, 1.000000e+00
130   br i1 %cmp19, label %if.then, label %lor.lhs.false21
132 lor.lhs.false21:
133   %vecext22 = extractelement <4 x float> %t, i32 1
134   %conv23 = fpext float %vecext22 to double
135   %cmp24 = fcmp ogt double %conv23, 1.000000e+00
136   br i1 %cmp24, label %if.then, label %lor.lhs.false26
138 lor.lhs.false26:
139   %vecext27 = extractelement <4 x float> %t, i32 2
140   %conv28 = fpext float %vecext27 to double
141   %cmp29 = fcmp ogt double %conv28, 1.000000e+00
142   br i1 %cmp29, label %if.then, label %lor.lhs.false31
144 lor.lhs.false31:
145   %vecext32 = extractelement <4 x float> %t, i32 3
146   %conv33 = fpext float %vecext32 to double
147   %cmp34 = fcmp ogt double %conv33, 1.000000e+00
148   br i1 %cmp34, label %if.then, label %if.end
150 if.then:
151   br label %return
153 if.end:
154   %vecext36 = extractelement <4 x float> %t, i32 0
155   %vecext37 = extractelement <4 x float> %t, i32 1
156   %add = fadd float %vecext36, %vecext37
157   br label %return
159 return:
160   %retval.0 = phi float [ 0.000000e+00, %if.then ], [ %add, %if.end ]
161   ret float %retval.0
164 define float @test_separate_allof_v4sf(<4 x float> %t) {
165 ; CHECK-LABEL: @test_separate_allof_v4sf(
166 ; CHECK-NEXT:  entry:
167 ; CHECK-NEXT:    [[T_FR:%.*]] = freeze <4 x float> [[T:%.*]]
168 ; CHECK-NEXT:    [[TMP0:%.*]] = fcmp uge <4 x float> [[T_FR]], zeroinitializer
169 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <4 x i1> [[TMP0]] to i4
170 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i4 [[TMP1]], 0
171 ; CHECK-NEXT:    [[TMP3:%.*]] = fcmp ule <4 x float> [[T_FR]], splat (float 1.000000e+00)
172 ; CHECK-NEXT:    [[TMP4:%.*]] = bitcast <4 x i1> [[TMP3]] to i4
173 ; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i4 [[TMP4]], 0
174 ; CHECK-NEXT:    [[OR_COND:%.*]] = or i1 [[TMP2]], [[TMP5]]
175 ; CHECK-NEXT:    [[SHIFT:%.*]] = shufflevector <4 x float> [[T_FR]], <4 x float> poison, <4 x i32> <i32 1, i32 poison, i32 poison, i32 poison>
176 ; CHECK-NEXT:    [[TMP6:%.*]] = fadd <4 x float> [[T_FR]], [[SHIFT]]
177 ; CHECK-NEXT:    [[ADD:%.*]] = extractelement <4 x float> [[TMP6]], i64 0
178 ; CHECK-NEXT:    [[RETVAL_0:%.*]] = select i1 [[OR_COND]], float 0.000000e+00, float [[ADD]]
179 ; CHECK-NEXT:    ret float [[RETVAL_0]]
181 entry:
182   %vecext = extractelement <4 x float> %t, i32 0
183   %conv = fpext float %vecext to double
184   %cmp = fcmp olt double %conv, 0.000000e+00
185   br i1 %cmp, label %land.lhs.true, label %if.end
187 land.lhs.true:
188   %vecext2 = extractelement <4 x float> %t, i32 1
189   %conv3 = fpext float %vecext2 to double
190   %cmp4 = fcmp olt double %conv3, 0.000000e+00
191   br i1 %cmp4, label %land.lhs.true6, label %if.end
193 land.lhs.true6:
194   %vecext7 = extractelement <4 x float> %t, i32 2
195   %conv8 = fpext float %vecext7 to double
196   %cmp9 = fcmp olt double %conv8, 0.000000e+00
197   br i1 %cmp9, label %land.lhs.true11, label %if.end
199 land.lhs.true11:
200   %vecext12 = extractelement <4 x float> %t, i32 3
201   %conv13 = fpext float %vecext12 to double
202   %cmp14 = fcmp olt double %conv13, 0.000000e+00
203   br i1 %cmp14, label %if.then, label %if.end
205 if.then:
206   br label %return
208 if.end:
209   %vecext16 = extractelement <4 x float> %t, i32 0
210   %conv17 = fpext float %vecext16 to double
211   %cmp18 = fcmp ogt double %conv17, 1.000000e+00
212   br i1 %cmp18, label %land.lhs.true20, label %if.end36
214 land.lhs.true20:
215   %vecext21 = extractelement <4 x float> %t, i32 1
216   %conv22 = fpext float %vecext21 to double
217   %cmp23 = fcmp ogt double %conv22, 1.000000e+00
218   br i1 %cmp23, label %land.lhs.true25, label %if.end36
220 land.lhs.true25:
221   %vecext26 = extractelement <4 x float> %t, i32 2
222   %conv27 = fpext float %vecext26 to double
223   %cmp28 = fcmp ogt double %conv27, 1.000000e+00
224   br i1 %cmp28, label %land.lhs.true30, label %if.end36
226 land.lhs.true30:
227   %vecext31 = extractelement <4 x float> %t, i32 3
228   %conv32 = fpext float %vecext31 to double
229   %cmp33 = fcmp ogt double %conv32, 1.000000e+00
230   br i1 %cmp33, label %if.then35, label %if.end36
232 if.then35:
233   br label %return
235 if.end36:
236   %vecext37 = extractelement <4 x float> %t, i32 0
237   %vecext38 = extractelement <4 x float> %t, i32 1
238   %add = fadd float %vecext37, %vecext38
239   br label %return
241 return:
242   %retval.0 = phi float [ 0.000000e+00, %if.then ], [ 0.000000e+00, %if.then35 ], [ %add, %if.end36 ]
243   ret float %retval.0
246 define float @test_separate_anyof_v4sf(<4 x float> %t) {
247 ; CHECK-LABEL: @test_separate_anyof_v4sf(
248 ; CHECK-NEXT:  entry:
249 ; CHECK-NEXT:    [[T_FR:%.*]] = freeze <4 x float> [[T:%.*]]
250 ; CHECK-NEXT:    [[TMP0:%.*]] = fcmp olt <4 x float> [[T_FR]], zeroinitializer
251 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <4 x i1> [[TMP0]] to i4
252 ; CHECK-NEXT:    [[DOTNOT:%.*]] = icmp eq i4 [[TMP1]], 0
253 ; CHECK-NEXT:    [[TMP2:%.*]] = fcmp ogt <4 x float> [[T_FR]], splat (float 1.000000e+00)
254 ; CHECK-NEXT:    [[TMP3:%.*]] = bitcast <4 x i1> [[TMP2]] to i4
255 ; CHECK-NEXT:    [[DOTNOT6:%.*]] = icmp eq i4 [[TMP3]], 0
256 ; CHECK-NEXT:    [[OR_COND:%.*]] = and i1 [[DOTNOT]], [[DOTNOT6]]
257 ; CHECK-NEXT:    [[SHIFT:%.*]] = shufflevector <4 x float> [[T_FR]], <4 x float> poison, <4 x i32> <i32 1, i32 poison, i32 poison, i32 poison>
258 ; CHECK-NEXT:    [[TMP4:%.*]] = fadd <4 x float> [[T_FR]], [[SHIFT]]
259 ; CHECK-NEXT:    [[ADD:%.*]] = extractelement <4 x float> [[TMP4]], i64 0
260 ; CHECK-NEXT:    [[RETVAL_0:%.*]] = select i1 [[OR_COND]], float [[ADD]], float 0.000000e+00
261 ; CHECK-NEXT:    ret float [[RETVAL_0]]
263 entry:
264   %vecext = extractelement <4 x float> %t, i32 0
265   %conv = fpext float %vecext to double
266   %cmp = fcmp olt double %conv, 0.000000e+00
267   br i1 %cmp, label %if.then, label %lor.lhs.false
269 lor.lhs.false:
270   %vecext2 = extractelement <4 x float> %t, i32 1
271   %conv3 = fpext float %vecext2 to double
272   %cmp4 = fcmp olt double %conv3, 0.000000e+00
273   br i1 %cmp4, label %if.then, label %lor.lhs.false6
275 lor.lhs.false6:
276   %vecext7 = extractelement <4 x float> %t, i32 2
277   %conv8 = fpext float %vecext7 to double
278   %cmp9 = fcmp olt double %conv8, 0.000000e+00
279   br i1 %cmp9, label %if.then, label %lor.lhs.false11
281 lor.lhs.false11:
282   %vecext12 = extractelement <4 x float> %t, i32 3
283   %conv13 = fpext float %vecext12 to double
284   %cmp14 = fcmp olt double %conv13, 0.000000e+00
285   br i1 %cmp14, label %if.then, label %if.end
287 if.then:
288   br label %return
290 if.end:
291   %vecext16 = extractelement <4 x float> %t, i32 0
292   %conv17 = fpext float %vecext16 to double
293   %cmp18 = fcmp ogt double %conv17, 1.000000e+00
294   br i1 %cmp18, label %if.then35, label %lor.lhs.false20
296 lor.lhs.false20:
297   %vecext21 = extractelement <4 x float> %t, i32 1
298   %conv22 = fpext float %vecext21 to double
299   %cmp23 = fcmp ogt double %conv22, 1.000000e+00
300   br i1 %cmp23, label %if.then35, label %lor.lhs.false25
302 lor.lhs.false25:
303   %vecext26 = extractelement <4 x float> %t, i32 2
304   %conv27 = fpext float %vecext26 to double
305   %cmp28 = fcmp ogt double %conv27, 1.000000e+00
306   br i1 %cmp28, label %if.then35, label %lor.lhs.false30
308 lor.lhs.false30:
309   %vecext31 = extractelement <4 x float> %t, i32 3
310   %conv32 = fpext float %vecext31 to double
311   %cmp33 = fcmp ogt double %conv32, 1.000000e+00
312   br i1 %cmp33, label %if.then35, label %if.end36
314 if.then35:
315   br label %return
317 if.end36:
318   %vecext37 = extractelement <4 x float> %t, i32 0
319   %vecext38 = extractelement <4 x float> %t, i32 1
320   %add = fadd float %vecext37, %vecext38
321   br label %return
323 return:
324   %retval.0 = phi float [ 0.000000e+00, %if.then ], [ 0.000000e+00, %if.then35 ], [ %add, %if.end36 ]
325   ret float %retval.0
328 define float @test_merge_allof_v4si(<4 x i32> %t) {
329 ; CHECK-LABEL: @test_merge_allof_v4si(
330 ; CHECK-NEXT:  entry:
331 ; CHECK-NEXT:    [[T_FR:%.*]] = freeze <4 x i32> [[T:%.*]]
332 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp sgt <4 x i32> [[T_FR]], zeroinitializer
333 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <4 x i1> [[TMP0]] to i4
334 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i4 [[TMP1]], 0
335 ; CHECK-NEXT:    [[TMP3:%.*]] = icmp slt <4 x i32> [[T_FR]], splat (i32 256)
336 ; CHECK-NEXT:    [[TMP4:%.*]] = bitcast <4 x i1> [[TMP3]] to i4
337 ; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i4 [[TMP4]], 0
338 ; CHECK-NEXT:    [[OR_COND:%.*]] = or i1 [[TMP2]], [[TMP5]]
339 ; CHECK-NEXT:    [[SHIFT:%.*]] = shufflevector <4 x i32> [[T_FR]], <4 x i32> poison, <4 x i32> <i32 1, i32 poison, i32 poison, i32 poison>
340 ; CHECK-NEXT:    [[TMP6:%.*]] = add nsw <4 x i32> [[T_FR]], [[SHIFT]]
341 ; CHECK-NEXT:    [[ADD:%.*]] = extractelement <4 x i32> [[TMP6]], i64 0
342 ; CHECK-NEXT:    [[CONV:%.*]] = sitofp i32 [[ADD]] to float
343 ; CHECK-NEXT:    [[RETVAL_0:%.*]] = select i1 [[OR_COND]], float 0.000000e+00, float [[CONV]]
344 ; CHECK-NEXT:    ret float [[RETVAL_0]]
346 entry:
347   %vecext = extractelement <4 x i32> %t, i32 0
348   %cmp = icmp slt i32 %vecext, 1
349   br i1 %cmp, label %land.lhs.true, label %lor.lhs.false
351 land.lhs.true:
352   %vecext1 = extractelement <4 x i32> %t, i32 1
353   %cmp2 = icmp slt i32 %vecext1, 1
354   br i1 %cmp2, label %land.lhs.true3, label %lor.lhs.false
356 land.lhs.true3:
357   %vecext4 = extractelement <4 x i32> %t, i32 2
358   %cmp5 = icmp slt i32 %vecext4, 1
359   br i1 %cmp5, label %land.lhs.true6, label %lor.lhs.false
361 land.lhs.true6:
362   %vecext7 = extractelement <4 x i32> %t, i32 3
363   %cmp8 = icmp slt i32 %vecext7, 1
364   br i1 %cmp8, label %if.then, label %lor.lhs.false
366 lor.lhs.false:
367   %vecext9 = extractelement <4 x i32> %t, i32 0
368   %cmp10 = icmp sgt i32 %vecext9, 255
369   br i1 %cmp10, label %land.lhs.true11, label %if.end
371 land.lhs.true11:
372   %vecext12 = extractelement <4 x i32> %t, i32 1
373   %cmp13 = icmp sgt i32 %vecext12, 255
374   br i1 %cmp13, label %land.lhs.true14, label %if.end
376 land.lhs.true14:
377   %vecext15 = extractelement <4 x i32> %t, i32 2
378   %cmp16 = icmp sgt i32 %vecext15, 255
379   br i1 %cmp16, label %land.lhs.true17, label %if.end
381 land.lhs.true17:
382   %vecext18 = extractelement <4 x i32> %t, i32 3
383   %cmp19 = icmp sgt i32 %vecext18, 255
384   br i1 %cmp19, label %if.then, label %if.end
386 if.then:
387   br label %return
389 if.end:
390   %vecext20 = extractelement <4 x i32> %t, i32 0
391   %vecext21 = extractelement <4 x i32> %t, i32 1
392   %add = add nsw i32 %vecext20, %vecext21
393   %conv = sitofp i32 %add to float
394   br label %return
396 return:
397   %retval.0 = phi float [ 0.000000e+00, %if.then ], [ %conv, %if.end ]
398   ret float %retval.0
401 define float @test_merge_anyof_v4si(<4 x i32> %t) {
402 ; CHECK-LABEL: @test_merge_anyof_v4si(
403 ; CHECK-NEXT:  entry:
404 ; CHECK-NEXT:    [[TMP0:%.*]] = shufflevector <4 x i32> [[T:%.*]], <4 x i32> poison, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 0, i32 1, i32 2, i32 3>
405 ; CHECK-NEXT:    [[TMP1:%.*]] = icmp sgt <8 x i32> [[TMP0]], <i32 255, i32 255, i32 255, i32 255, i32 1, i32 1, i32 1, i32 1>
406 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp slt <8 x i32> [[TMP0]], <i32 255, i32 255, i32 255, i32 255, i32 1, i32 1, i32 1, i32 1>
407 ; CHECK-NEXT:    [[TMP3:%.*]] = shufflevector <8 x i1> [[TMP1]], <8 x i1> [[TMP2]], <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 12, i32 13, i32 14, i32 15>
408 ; CHECK-NEXT:    [[TMP4:%.*]] = freeze <8 x i1> [[TMP3]]
409 ; CHECK-NEXT:    [[TMP5:%.*]] = bitcast <8 x i1> [[TMP4]] to i8
410 ; CHECK-NEXT:    [[DOTNOT:%.*]] = icmp eq i8 [[TMP5]], 0
411 ; CHECK-NEXT:    [[SHIFT:%.*]] = shufflevector <4 x i32> [[T]], <4 x i32> poison, <4 x i32> <i32 1, i32 poison, i32 poison, i32 poison>
412 ; CHECK-NEXT:    [[TMP6:%.*]] = add nsw <4 x i32> [[T]], [[SHIFT]]
413 ; CHECK-NEXT:    [[ADD:%.*]] = extractelement <4 x i32> [[TMP6]], i64 0
414 ; CHECK-NEXT:    [[CONV:%.*]] = sitofp i32 [[ADD]] to float
415 ; CHECK-NEXT:    [[RETVAL_0:%.*]] = select i1 [[DOTNOT]], float [[CONV]], float 0.000000e+00
416 ; CHECK-NEXT:    ret float [[RETVAL_0]]
418 entry:
419   %vecext = extractelement <4 x i32> %t, i32 0
420   %cmp = icmp slt i32 %vecext, 1
421   br i1 %cmp, label %if.then, label %lor.lhs.false
423 lor.lhs.false:
424   %vecext1 = extractelement <4 x i32> %t, i32 1
425   %cmp2 = icmp slt i32 %vecext1, 1
426   br i1 %cmp2, label %if.then, label %lor.lhs.false3
428 lor.lhs.false3:
429   %vecext4 = extractelement <4 x i32> %t, i32 2
430   %cmp5 = icmp slt i32 %vecext4, 1
431   br i1 %cmp5, label %if.then, label %lor.lhs.false6
433 lor.lhs.false6:
434   %vecext7 = extractelement <4 x i32> %t, i32 3
435   %cmp8 = icmp slt i32 %vecext7, 1
436   br i1 %cmp8, label %if.then, label %lor.lhs.false9
438 lor.lhs.false9:
439   %vecext10 = extractelement <4 x i32> %t, i32 0
440   %cmp11 = icmp sgt i32 %vecext10, 255
441   br i1 %cmp11, label %if.then, label %lor.lhs.false12
443 lor.lhs.false12:
444   %vecext13 = extractelement <4 x i32> %t, i32 1
445   %cmp14 = icmp sgt i32 %vecext13, 255
446   br i1 %cmp14, label %if.then, label %lor.lhs.false15
448 lor.lhs.false15:
449   %vecext16 = extractelement <4 x i32> %t, i32 2
450   %cmp17 = icmp sgt i32 %vecext16, 255
451   br i1 %cmp17, label %if.then, label %lor.lhs.false18
453 lor.lhs.false18:
454   %vecext19 = extractelement <4 x i32> %t, i32 3
455   %cmp20 = icmp sgt i32 %vecext19, 255
456   br i1 %cmp20, label %if.then, label %if.end
458 if.then:
459   br label %return
461 if.end:
462   %vecext21 = extractelement <4 x i32> %t, i32 0
463   %vecext22 = extractelement <4 x i32> %t, i32 1
464   %add = add nsw i32 %vecext21, %vecext22
465   %conv = sitofp i32 %add to float
466   br label %return
468 return:
469   %retval.0 = phi float [ 0.000000e+00, %if.then ], [ %conv, %if.end ]
470   ret float %retval.0
473 define i32 @test_separate_allof_v4si(<4 x i32> %t) {
474 ; CHECK-LABEL: @test_separate_allof_v4si(
475 ; CHECK-NEXT:  entry:
476 ; CHECK-NEXT:    [[T_FR:%.*]] = freeze <4 x i32> [[T:%.*]]
477 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp sgt <4 x i32> [[T_FR]], zeroinitializer
478 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <4 x i1> [[TMP0]] to i4
479 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i4 [[TMP1]], 0
480 ; CHECK-NEXT:    br i1 [[TMP2]], label [[RETURN:%.*]], label [[IF_END:%.*]]
481 ; CHECK:       if.end:
482 ; CHECK-NEXT:    [[TMP3:%.*]] = icmp slt <4 x i32> [[T_FR]], splat (i32 256)
483 ; CHECK-NEXT:    [[TMP4:%.*]] = bitcast <4 x i1> [[TMP3]] to i4
484 ; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i4 [[TMP4]], 0
485 ; CHECK-NEXT:    [[SHIFT:%.*]] = shufflevector <4 x i32> [[T_FR]], <4 x i32> poison, <4 x i32> <i32 1, i32 poison, i32 poison, i32 poison>
486 ; CHECK-NEXT:    [[TMP6:%.*]] = add nsw <4 x i32> [[T_FR]], [[SHIFT]]
487 ; CHECK-NEXT:    [[ADD:%.*]] = extractelement <4 x i32> [[TMP6]], i64 0
488 ; CHECK-NEXT:    [[SPEC_SELECT:%.*]] = select i1 [[TMP5]], i32 0, i32 [[ADD]]
489 ; CHECK-NEXT:    br label [[RETURN]]
490 ; CHECK:       return:
491 ; CHECK-NEXT:    [[RETVAL_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SPEC_SELECT]], [[IF_END]] ]
492 ; CHECK-NEXT:    ret i32 [[RETVAL_0]]
494 entry:
495   %vecext = extractelement <4 x i32> %t, i32 0
496   %cmp = icmp slt i32 %vecext, 1
497   br i1 %cmp, label %land.lhs.true, label %if.end
499 land.lhs.true:
500   %vecext1 = extractelement <4 x i32> %t, i32 1
501   %cmp2 = icmp slt i32 %vecext1, 1
502   br i1 %cmp2, label %land.lhs.true3, label %if.end
504 land.lhs.true3:
505   %vecext4 = extractelement <4 x i32> %t, i32 2
506   %cmp5 = icmp slt i32 %vecext4, 1
507   br i1 %cmp5, label %land.lhs.true6, label %if.end
509 land.lhs.true6:
510   %vecext7 = extractelement <4 x i32> %t, i32 3
511   %cmp8 = icmp slt i32 %vecext7, 1
512   br i1 %cmp8, label %if.then, label %if.end
514 if.then:
515   br label %return
517 if.end:
518   %vecext9 = extractelement <4 x i32> %t, i32 0
519   %cmp10 = icmp sgt i32 %vecext9, 255
520   br i1 %cmp10, label %land.lhs.true11, label %if.end21
522 land.lhs.true11:
523   %vecext12 = extractelement <4 x i32> %t, i32 1
524   %cmp13 = icmp sgt i32 %vecext12, 255
525   br i1 %cmp13, label %land.lhs.true14, label %if.end21
527 land.lhs.true14:
528   %vecext15 = extractelement <4 x i32> %t, i32 2
529   %cmp16 = icmp sgt i32 %vecext15, 255
530   br i1 %cmp16, label %land.lhs.true17, label %if.end21
532 land.lhs.true17:
533   %vecext18 = extractelement <4 x i32> %t, i32 3
534   %cmp19 = icmp sgt i32 %vecext18, 255
535   br i1 %cmp19, label %if.then20, label %if.end21
537 if.then20:
538   br label %return
540 if.end21:
541   %vecext22 = extractelement <4 x i32> %t, i32 0
542   %vecext23 = extractelement <4 x i32> %t, i32 1
543   %add = add nsw i32 %vecext22, %vecext23
544   br label %return
546 return:
547   %retval.0 = phi i32 [ 0, %if.then ], [ 0, %if.then20 ], [ %add, %if.end21 ]
548   ret i32 %retval.0
551 define i32 @test_separate_anyof_v4si(<4 x i32> %t) {
552 ; CHECK-LABEL: @test_separate_anyof_v4si(
553 ; CHECK-NEXT:  entry:
554 ; CHECK-NEXT:    [[T_FR:%.*]] = freeze <4 x i32> [[T:%.*]]
555 ; CHECK-NEXT:    [[TMP0:%.*]] = icmp slt <4 x i32> [[T_FR]], splat (i32 1)
556 ; CHECK-NEXT:    [[TMP1:%.*]] = bitcast <4 x i1> [[TMP0]] to i4
557 ; CHECK-NEXT:    [[DOTNOT:%.*]] = icmp eq i4 [[TMP1]], 0
558 ; CHECK-NEXT:    br i1 [[DOTNOT]], label [[IF_END:%.*]], label [[RETURN:%.*]]
559 ; CHECK:       if.end:
560 ; CHECK-NEXT:    [[TMP2:%.*]] = icmp ugt <4 x i32> [[T_FR]], splat (i32 255)
561 ; CHECK-NEXT:    [[TMP3:%.*]] = bitcast <4 x i1> [[TMP2]] to i4
562 ; CHECK-NEXT:    [[DOTNOT6:%.*]] = icmp eq i4 [[TMP3]], 0
563 ; CHECK-NEXT:    [[SHIFT:%.*]] = shufflevector <4 x i32> [[T_FR]], <4 x i32> poison, <4 x i32> <i32 1, i32 poison, i32 poison, i32 poison>
564 ; CHECK-NEXT:    [[TMP4:%.*]] = add nuw nsw <4 x i32> [[T_FR]], [[SHIFT]]
565 ; CHECK-NEXT:    [[ADD:%.*]] = extractelement <4 x i32> [[TMP4]], i64 0
566 ; CHECK-NEXT:    [[SPEC_SELECT:%.*]] = select i1 [[DOTNOT6]], i32 [[ADD]], i32 0
567 ; CHECK-NEXT:    br label [[RETURN]]
568 ; CHECK:       return:
569 ; CHECK-NEXT:    [[RETVAL_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SPEC_SELECT]], [[IF_END]] ]
570 ; CHECK-NEXT:    ret i32 [[RETVAL_0]]
572 entry:
573   %vecext = extractelement <4 x i32> %t, i32 0
574   %cmp = icmp slt i32 %vecext, 1
575   br i1 %cmp, label %if.then, label %lor.lhs.false
577 lor.lhs.false:
578   %vecext1 = extractelement <4 x i32> %t, i32 1
579   %cmp2 = icmp slt i32 %vecext1, 1
580   br i1 %cmp2, label %if.then, label %lor.lhs.false3
582 lor.lhs.false3:
583   %vecext4 = extractelement <4 x i32> %t, i32 2
584   %cmp5 = icmp slt i32 %vecext4, 1
585   br i1 %cmp5, label %if.then, label %lor.lhs.false6
587 lor.lhs.false6:
588   %vecext7 = extractelement <4 x i32> %t, i32 3
589   %cmp8 = icmp slt i32 %vecext7, 1
590   br i1 %cmp8, label %if.then, label %if.end
592 if.then:
593   br label %return
595 if.end:
596   %vecext9 = extractelement <4 x i32> %t, i32 0
597   %cmp10 = icmp sgt i32 %vecext9, 255
598   br i1 %cmp10, label %if.then20, label %lor.lhs.false11
600 lor.lhs.false11:
601   %vecext12 = extractelement <4 x i32> %t, i32 1
602   %cmp13 = icmp sgt i32 %vecext12, 255
603   br i1 %cmp13, label %if.then20, label %lor.lhs.false14
605 lor.lhs.false14:
606   %vecext15 = extractelement <4 x i32> %t, i32 2
607   %cmp16 = icmp sgt i32 %vecext15, 255
608   br i1 %cmp16, label %if.then20, label %lor.lhs.false17
610 lor.lhs.false17:
611   %vecext18 = extractelement <4 x i32> %t, i32 3
612   %cmp19 = icmp sgt i32 %vecext18, 255
613   br i1 %cmp19, label %if.then20, label %if.end21
615 if.then20:
616   br label %return
618 if.end21:
619   %vecext22 = extractelement <4 x i32> %t, i32 0
620   %vecext23 = extractelement <4 x i32> %t, i32 1
621   %add = add nsw i32 %vecext22, %vecext23
622   br label %return
624 return:
625   %retval.0 = phi i32 [ 0, %if.then ], [ 0, %if.then20 ], [ %add, %if.end21 ]
626   ret i32 %retval.0