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(
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]]
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
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
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
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
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
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
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
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
76 %vecext35 = extractelement <4 x float> %t, i32 0
77 %vecext36 = extractelement <4 x float> %t, i32 1
78 %add = fadd float %vecext35, %vecext36
82 %retval.0 = phi float [ 0.000000e+00, %if.then ], [ %add, %if.end ]
86 define float @test_merge_anyof_v4sf(<4 x float> %t) {
87 ; CHECK-LABEL: @test_merge_anyof_v4sf(
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]]
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
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
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
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
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
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
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
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
154 %vecext36 = extractelement <4 x float> %t, i32 0
155 %vecext37 = extractelement <4 x float> %t, i32 1
156 %add = fadd float %vecext36, %vecext37
160 %retval.0 = phi float [ 0.000000e+00, %if.then ], [ %add, %if.end ]
164 define float @test_separate_allof_v4sf(<4 x float> %t) {
165 ; CHECK-LABEL: @test_separate_allof_v4sf(
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]]
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
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
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
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
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
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
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
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
236 %vecext37 = extractelement <4 x float> %t, i32 0
237 %vecext38 = extractelement <4 x float> %t, i32 1
238 %add = fadd float %vecext37, %vecext38
242 %retval.0 = phi float [ 0.000000e+00, %if.then ], [ 0.000000e+00, %if.then35 ], [ %add, %if.end36 ]
246 define float @test_separate_anyof_v4sf(<4 x float> %t) {
247 ; CHECK-LABEL: @test_separate_anyof_v4sf(
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]]
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
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
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
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
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
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
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
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
318 %vecext37 = extractelement <4 x float> %t, i32 0
319 %vecext38 = extractelement <4 x float> %t, i32 1
320 %add = fadd float %vecext37, %vecext38
324 %retval.0 = phi float [ 0.000000e+00, %if.then ], [ 0.000000e+00, %if.then35 ], [ %add, %if.end36 ]
328 define float @test_merge_allof_v4si(<4 x i32> %t) {
329 ; CHECK-LABEL: @test_merge_allof_v4si(
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]]
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
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
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
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
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
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
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
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
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
397 %retval.0 = phi float [ 0.000000e+00, %if.then ], [ %conv, %if.end ]
401 define float @test_merge_anyof_v4si(<4 x i32> %t) {
402 ; CHECK-LABEL: @test_merge_anyof_v4si(
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]]
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
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
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
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
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
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
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
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
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
469 %retval.0 = phi float [ 0.000000e+00, %if.then ], [ %conv, %if.end ]
473 define i32 @test_separate_allof_v4si(<4 x i32> %t) {
474 ; CHECK-LABEL: @test_separate_allof_v4si(
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:%.*]]
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]]
491 ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SPEC_SELECT]], [[IF_END]] ]
492 ; CHECK-NEXT: ret i32 [[RETVAL_0]]
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
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
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
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
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
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
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
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
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
547 %retval.0 = phi i32 [ 0, %if.then ], [ 0, %if.then20 ], [ %add, %if.end21 ]
551 define i32 @test_separate_anyof_v4si(<4 x i32> %t) {
552 ; CHECK-LABEL: @test_separate_anyof_v4si(
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:%.*]]
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]]
569 ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SPEC_SELECT]], [[IF_END]] ]
570 ; CHECK-NEXT: ret i32 [[RETVAL_0]]
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
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
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
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
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
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
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
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
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
625 %retval.0 = phi i32 [ 0, %if.then ], [ 0, %if.then20 ], [ %add, %if.end21 ]