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: br i1 [[TMP2]], label [[RETURN:%.*]], label [[LOR_LHS_FALSE:%.*]]
15 ; CHECK: lor.lhs.false:
16 ; CHECK-NEXT: [[TMP3:%.*]] = fcmp ule <4 x float> [[T_FR]], <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>
17 ; CHECK-NEXT: [[TMP4:%.*]] = bitcast <4 x i1> [[TMP3]] to i4
18 ; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i4 [[TMP4]], 0
19 ; CHECK-NEXT: [[SHIFT:%.*]] = shufflevector <4 x float> [[T_FR]], <4 x float> poison, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
20 ; CHECK-NEXT: [[TMP6:%.*]] = fadd <4 x float> [[SHIFT]], [[T_FR]]
21 ; CHECK-NEXT: [[ADD:%.*]] = extractelement <4 x float> [[TMP6]], i32 0
22 ; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[TMP5]], float 0.000000e+00, float [[ADD]]
23 ; CHECK-NEXT: br label [[RETURN]]
25 ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi float [ 0.000000e+00, [[ENTRY:%.*]] ], [ [[SPEC_SELECT]], [[LOR_LHS_FALSE]] ]
26 ; CHECK-NEXT: ret float [[RETVAL_0]]
29 %vecext = extractelement <4 x float> %t, i32 0
30 %conv = fpext float %vecext to double
31 %cmp = fcmp olt double %conv, 0.000000e+00
32 br i1 %cmp, label %land.lhs.true, label %lor.lhs.false
35 %vecext2 = extractelement <4 x float> %t, i32 1
36 %conv3 = fpext float %vecext2 to double
37 %cmp4 = fcmp olt double %conv3, 0.000000e+00
38 br i1 %cmp4, label %land.lhs.true6, label %lor.lhs.false
41 %vecext7 = extractelement <4 x float> %t, i32 2
42 %conv8 = fpext float %vecext7 to double
43 %cmp9 = fcmp olt double %conv8, 0.000000e+00
44 br i1 %cmp9, label %land.lhs.true11, label %lor.lhs.false
47 %vecext12 = extractelement <4 x float> %t, i32 3
48 %conv13 = fpext float %vecext12 to double
49 %cmp14 = fcmp olt double %conv13, 0.000000e+00
50 br i1 %cmp14, label %if.then, label %lor.lhs.false
53 %vecext16 = extractelement <4 x float> %t, i32 0
54 %conv17 = fpext float %vecext16 to double
55 %cmp18 = fcmp ogt double %conv17, 1.000000e+00
56 br i1 %cmp18, label %land.lhs.true20, label %if.end
59 %vecext21 = extractelement <4 x float> %t, i32 1
60 %conv22 = fpext float %vecext21 to double
61 %cmp23 = fcmp ogt double %conv22, 1.000000e+00
62 br i1 %cmp23, label %land.lhs.true25, label %if.end
65 %vecext26 = extractelement <4 x float> %t, i32 2
66 %conv27 = fpext float %vecext26 to double
67 %cmp28 = fcmp ogt double %conv27, 1.000000e+00
68 br i1 %cmp28, label %land.lhs.true30, label %if.end
71 %vecext31 = extractelement <4 x float> %t, i32 3
72 %conv32 = fpext float %vecext31 to double
73 %cmp33 = fcmp ogt double %conv32, 1.000000e+00
74 br i1 %cmp33, label %if.then, label %if.end
80 %vecext35 = extractelement <4 x float> %t, i32 0
81 %vecext36 = extractelement <4 x float> %t, i32 1
82 %add = fadd float %vecext35, %vecext36
86 %retval.0 = phi float [ 0.000000e+00, %if.then ], [ %add, %if.end ]
90 define float @test_merge_anyof_v4sf(<4 x float> %t) {
91 ; CHECK-LABEL: @test_merge_anyof_v4sf(
93 ; CHECK-NEXT: [[TMP0:%.*]] = extractelement <4 x float> [[T:%.*]], i32 3
94 ; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x float> [[T]], i32 2
95 ; CHECK-NEXT: [[TMP2:%.*]] = extractelement <4 x float> [[T]], i32 1
96 ; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x float> [[T]], i32 0
97 ; CHECK-NEXT: [[T_FR:%.*]] = freeze <4 x float> [[T]]
98 ; CHECK-NEXT: [[TMP4:%.*]] = fcmp olt <4 x float> [[T_FR]], zeroinitializer
99 ; CHECK-NEXT: [[TMP5:%.*]] = bitcast <4 x i1> [[TMP4]] to i4
100 ; CHECK-NEXT: [[TMP6:%.*]] = icmp ne i4 [[TMP5]], 0
101 ; CHECK-NEXT: [[CMP19:%.*]] = fcmp ogt float [[TMP3]], 1.000000e+00
102 ; CHECK-NEXT: [[OR_COND3:%.*]] = select i1 [[TMP6]], i1 true, i1 [[CMP19]]
103 ; CHECK-NEXT: [[CMP24:%.*]] = fcmp ogt float [[TMP2]], 1.000000e+00
104 ; CHECK-NEXT: [[OR_COND4:%.*]] = select i1 [[OR_COND3]], i1 true, i1 [[CMP24]]
105 ; CHECK-NEXT: [[CMP29:%.*]] = fcmp ogt float [[TMP1]], 1.000000e+00
106 ; CHECK-NEXT: [[OR_COND5:%.*]] = select i1 [[OR_COND4]], i1 true, i1 [[CMP29]]
107 ; CHECK-NEXT: [[CMP34:%.*]] = fcmp ogt float [[TMP0]], 1.000000e+00
108 ; CHECK-NEXT: [[OR_COND6:%.*]] = select i1 [[OR_COND5]], i1 true, i1 [[CMP34]]
109 ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[TMP3]], [[TMP2]]
110 ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[OR_COND6]], float 0.000000e+00, float [[ADD]]
111 ; CHECK-NEXT: ret float [[RETVAL_0]]
114 %vecext = extractelement <4 x float> %t, i32 0
115 %conv = fpext float %vecext to double
116 %cmp = fcmp olt double %conv, 0.000000e+00
117 br i1 %cmp, label %if.then, label %lor.lhs.false
120 %vecext2 = extractelement <4 x float> %t, i32 1
121 %conv3 = fpext float %vecext2 to double
122 %cmp4 = fcmp olt double %conv3, 0.000000e+00
123 br i1 %cmp4, label %if.then, label %lor.lhs.false6
126 %vecext7 = extractelement <4 x float> %t, i32 2
127 %conv8 = fpext float %vecext7 to double
128 %cmp9 = fcmp olt double %conv8, 0.000000e+00
129 br i1 %cmp9, label %if.then, label %lor.lhs.false11
132 %vecext12 = extractelement <4 x float> %t, i32 3
133 %conv13 = fpext float %vecext12 to double
134 %cmp14 = fcmp olt double %conv13, 0.000000e+00
135 br i1 %cmp14, label %if.then, label %lor.lhs.false16
138 %vecext17 = extractelement <4 x float> %t, i32 0
139 %conv18 = fpext float %vecext17 to double
140 %cmp19 = fcmp ogt double %conv18, 1.000000e+00
141 br i1 %cmp19, label %if.then, label %lor.lhs.false21
144 %vecext22 = extractelement <4 x float> %t, i32 1
145 %conv23 = fpext float %vecext22 to double
146 %cmp24 = fcmp ogt double %conv23, 1.000000e+00
147 br i1 %cmp24, label %if.then, label %lor.lhs.false26
150 %vecext27 = extractelement <4 x float> %t, i32 2
151 %conv28 = fpext float %vecext27 to double
152 %cmp29 = fcmp ogt double %conv28, 1.000000e+00
153 br i1 %cmp29, label %if.then, label %lor.lhs.false31
156 %vecext32 = extractelement <4 x float> %t, i32 3
157 %conv33 = fpext float %vecext32 to double
158 %cmp34 = fcmp ogt double %conv33, 1.000000e+00
159 br i1 %cmp34, label %if.then, label %if.end
165 %vecext36 = extractelement <4 x float> %t, i32 0
166 %vecext37 = extractelement <4 x float> %t, i32 1
167 %add = fadd float %vecext36, %vecext37
171 %retval.0 = phi float [ 0.000000e+00, %if.then ], [ %add, %if.end ]
175 define float @test_separate_allof_v4sf(<4 x float> %t) {
176 ; CHECK-LABEL: @test_separate_allof_v4sf(
178 ; CHECK-NEXT: [[T_FR:%.*]] = freeze <4 x float> [[T:%.*]]
179 ; CHECK-NEXT: [[TMP0:%.*]] = fcmp uge <4 x float> [[T_FR]], zeroinitializer
180 ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i1> [[TMP0]] to i4
181 ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i4 [[TMP1]], 0
182 ; CHECK-NEXT: br i1 [[TMP2]], label [[RETURN:%.*]], label [[IF_END:%.*]]
184 ; CHECK-NEXT: [[TMP3:%.*]] = fcmp ule <4 x float> [[T_FR]], <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>
185 ; CHECK-NEXT: [[TMP4:%.*]] = bitcast <4 x i1> [[TMP3]] to i4
186 ; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i4 [[TMP4]], 0
187 ; CHECK-NEXT: [[SHIFT:%.*]] = shufflevector <4 x float> [[T_FR]], <4 x float> poison, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
188 ; CHECK-NEXT: [[TMP6:%.*]] = fadd <4 x float> [[SHIFT]], [[T_FR]]
189 ; CHECK-NEXT: [[ADD:%.*]] = extractelement <4 x float> [[TMP6]], i32 0
190 ; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[TMP5]], float 0.000000e+00, float [[ADD]]
191 ; CHECK-NEXT: br label [[RETURN]]
193 ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi float [ 0.000000e+00, [[ENTRY:%.*]] ], [ [[SPEC_SELECT]], [[IF_END]] ]
194 ; CHECK-NEXT: ret float [[RETVAL_0]]
197 %vecext = extractelement <4 x float> %t, i32 0
198 %conv = fpext float %vecext to double
199 %cmp = fcmp olt double %conv, 0.000000e+00
200 br i1 %cmp, label %land.lhs.true, label %if.end
203 %vecext2 = extractelement <4 x float> %t, i32 1
204 %conv3 = fpext float %vecext2 to double
205 %cmp4 = fcmp olt double %conv3, 0.000000e+00
206 br i1 %cmp4, label %land.lhs.true6, label %if.end
209 %vecext7 = extractelement <4 x float> %t, i32 2
210 %conv8 = fpext float %vecext7 to double
211 %cmp9 = fcmp olt double %conv8, 0.000000e+00
212 br i1 %cmp9, label %land.lhs.true11, label %if.end
215 %vecext12 = extractelement <4 x float> %t, i32 3
216 %conv13 = fpext float %vecext12 to double
217 %cmp14 = fcmp olt double %conv13, 0.000000e+00
218 br i1 %cmp14, label %if.then, label %if.end
224 %vecext16 = extractelement <4 x float> %t, i32 0
225 %conv17 = fpext float %vecext16 to double
226 %cmp18 = fcmp ogt double %conv17, 1.000000e+00
227 br i1 %cmp18, label %land.lhs.true20, label %if.end36
230 %vecext21 = extractelement <4 x float> %t, i32 1
231 %conv22 = fpext float %vecext21 to double
232 %cmp23 = fcmp ogt double %conv22, 1.000000e+00
233 br i1 %cmp23, label %land.lhs.true25, label %if.end36
236 %vecext26 = extractelement <4 x float> %t, i32 2
237 %conv27 = fpext float %vecext26 to double
238 %cmp28 = fcmp ogt double %conv27, 1.000000e+00
239 br i1 %cmp28, label %land.lhs.true30, label %if.end36
242 %vecext31 = extractelement <4 x float> %t, i32 3
243 %conv32 = fpext float %vecext31 to double
244 %cmp33 = fcmp ogt double %conv32, 1.000000e+00
245 br i1 %cmp33, label %if.then35, label %if.end36
251 %vecext37 = extractelement <4 x float> %t, i32 0
252 %vecext38 = extractelement <4 x float> %t, i32 1
253 %add = fadd float %vecext37, %vecext38
257 %retval.0 = phi float [ 0.000000e+00, %if.then ], [ 0.000000e+00, %if.then35 ], [ %add, %if.end36 ]
261 define float @test_separate_anyof_v4sf(<4 x float> %t) {
262 ; CHECK-LABEL: @test_separate_anyof_v4sf(
264 ; CHECK-NEXT: [[TMP0:%.*]] = extractelement <4 x float> [[T:%.*]], i32 3
265 ; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x float> [[T]], i32 2
266 ; CHECK-NEXT: [[TMP2:%.*]] = extractelement <4 x float> [[T]], i32 1
267 ; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x float> [[T]], i32 0
268 ; CHECK-NEXT: [[T_FR:%.*]] = freeze <4 x float> [[T]]
269 ; CHECK-NEXT: [[TMP4:%.*]] = fcmp olt <4 x float> [[T_FR]], zeroinitializer
270 ; CHECK-NEXT: [[TMP5:%.*]] = bitcast <4 x i1> [[TMP4]] to i4
271 ; CHECK-NEXT: [[TMP6:%.*]] = icmp ne i4 [[TMP5]], 0
272 ; CHECK-NEXT: [[CMP18:%.*]] = fcmp ogt float [[TMP3]], 1.000000e+00
273 ; CHECK-NEXT: [[OR_COND3:%.*]] = select i1 [[TMP6]], i1 true, i1 [[CMP18]]
274 ; CHECK-NEXT: [[CMP23:%.*]] = fcmp ogt float [[TMP2]], 1.000000e+00
275 ; CHECK-NEXT: [[OR_COND4:%.*]] = select i1 [[OR_COND3]], i1 true, i1 [[CMP23]]
276 ; CHECK-NEXT: [[CMP28:%.*]] = fcmp ogt float [[TMP1]], 1.000000e+00
277 ; CHECK-NEXT: [[OR_COND5:%.*]] = select i1 [[OR_COND4]], i1 true, i1 [[CMP28]]
278 ; CHECK-NEXT: [[CMP33:%.*]] = fcmp ogt float [[TMP0]], 1.000000e+00
279 ; CHECK-NEXT: [[OR_COND6:%.*]] = select i1 [[OR_COND5]], i1 true, i1 [[CMP33]]
280 ; CHECK-NEXT: [[ADD:%.*]] = fadd float [[TMP3]], [[TMP2]]
281 ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[OR_COND6]], float 0.000000e+00, float [[ADD]]
282 ; CHECK-NEXT: ret float [[RETVAL_0]]
285 %vecext = extractelement <4 x float> %t, i32 0
286 %conv = fpext float %vecext to double
287 %cmp = fcmp olt double %conv, 0.000000e+00
288 br i1 %cmp, label %if.then, label %lor.lhs.false
291 %vecext2 = extractelement <4 x float> %t, i32 1
292 %conv3 = fpext float %vecext2 to double
293 %cmp4 = fcmp olt double %conv3, 0.000000e+00
294 br i1 %cmp4, label %if.then, label %lor.lhs.false6
297 %vecext7 = extractelement <4 x float> %t, i32 2
298 %conv8 = fpext float %vecext7 to double
299 %cmp9 = fcmp olt double %conv8, 0.000000e+00
300 br i1 %cmp9, label %if.then, label %lor.lhs.false11
303 %vecext12 = extractelement <4 x float> %t, i32 3
304 %conv13 = fpext float %vecext12 to double
305 %cmp14 = fcmp olt double %conv13, 0.000000e+00
306 br i1 %cmp14, label %if.then, label %if.end
312 %vecext16 = extractelement <4 x float> %t, i32 0
313 %conv17 = fpext float %vecext16 to double
314 %cmp18 = fcmp ogt double %conv17, 1.000000e+00
315 br i1 %cmp18, label %if.then35, label %lor.lhs.false20
318 %vecext21 = extractelement <4 x float> %t, i32 1
319 %conv22 = fpext float %vecext21 to double
320 %cmp23 = fcmp ogt double %conv22, 1.000000e+00
321 br i1 %cmp23, label %if.then35, label %lor.lhs.false25
324 %vecext26 = extractelement <4 x float> %t, i32 2
325 %conv27 = fpext float %vecext26 to double
326 %cmp28 = fcmp ogt double %conv27, 1.000000e+00
327 br i1 %cmp28, label %if.then35, label %lor.lhs.false30
330 %vecext31 = extractelement <4 x float> %t, i32 3
331 %conv32 = fpext float %vecext31 to double
332 %cmp33 = fcmp ogt double %conv32, 1.000000e+00
333 br i1 %cmp33, label %if.then35, label %if.end36
339 %vecext37 = extractelement <4 x float> %t, i32 0
340 %vecext38 = extractelement <4 x float> %t, i32 1
341 %add = fadd float %vecext37, %vecext38
345 %retval.0 = phi float [ 0.000000e+00, %if.then ], [ 0.000000e+00, %if.then35 ], [ %add, %if.end36 ]
349 define float @test_merge_allof_v4si(<4 x i32> %t) {
350 ; CHECK-LABEL: @test_merge_allof_v4si(
352 ; CHECK-NEXT: [[T_FR:%.*]] = freeze <4 x i32> [[T:%.*]]
353 ; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt <4 x i32> [[T_FR]], zeroinitializer
354 ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i1> [[TMP0]] to i4
355 ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i4 [[TMP1]], 0
356 ; CHECK-NEXT: br i1 [[TMP2]], label [[RETURN:%.*]], label [[LOR_LHS_FALSE:%.*]]
357 ; CHECK: lor.lhs.false:
358 ; CHECK-NEXT: [[TMP3:%.*]] = icmp slt <4 x i32> [[T_FR]], <i32 256, i32 256, i32 256, i32 256>
359 ; CHECK-NEXT: [[TMP4:%.*]] = bitcast <4 x i1> [[TMP3]] to i4
360 ; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i4 [[TMP4]], 0
361 ; CHECK-NEXT: br i1 [[TMP5]], label [[RETURN]], label [[IF_END:%.*]]
363 ; CHECK-NEXT: [[SHIFT:%.*]] = shufflevector <4 x i32> [[T_FR]], <4 x i32> poison, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
364 ; CHECK-NEXT: [[TMP6:%.*]] = add nsw <4 x i32> [[T_FR]], [[SHIFT]]
365 ; CHECK-NEXT: [[ADD:%.*]] = extractelement <4 x i32> [[TMP6]], i32 0
366 ; CHECK-NEXT: [[CONV:%.*]] = sitofp i32 [[ADD]] to float
367 ; CHECK-NEXT: br label [[RETURN]]
369 ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi float [ [[CONV]], [[IF_END]] ], [ 0.000000e+00, [[LOR_LHS_FALSE]] ], [ 0.000000e+00, [[ENTRY:%.*]] ]
370 ; CHECK-NEXT: ret float [[RETVAL_0]]
373 %vecext = extractelement <4 x i32> %t, i32 0
374 %cmp = icmp slt i32 %vecext, 1
375 br i1 %cmp, label %land.lhs.true, label %lor.lhs.false
378 %vecext1 = extractelement <4 x i32> %t, i32 1
379 %cmp2 = icmp slt i32 %vecext1, 1
380 br i1 %cmp2, label %land.lhs.true3, label %lor.lhs.false
383 %vecext4 = extractelement <4 x i32> %t, i32 2
384 %cmp5 = icmp slt i32 %vecext4, 1
385 br i1 %cmp5, label %land.lhs.true6, label %lor.lhs.false
388 %vecext7 = extractelement <4 x i32> %t, i32 3
389 %cmp8 = icmp slt i32 %vecext7, 1
390 br i1 %cmp8, label %if.then, label %lor.lhs.false
393 %vecext9 = extractelement <4 x i32> %t, i32 0
394 %cmp10 = icmp sgt i32 %vecext9, 255
395 br i1 %cmp10, label %land.lhs.true11, label %if.end
398 %vecext12 = extractelement <4 x i32> %t, i32 1
399 %cmp13 = icmp sgt i32 %vecext12, 255
400 br i1 %cmp13, label %land.lhs.true14, label %if.end
403 %vecext15 = extractelement <4 x i32> %t, i32 2
404 %cmp16 = icmp sgt i32 %vecext15, 255
405 br i1 %cmp16, label %land.lhs.true17, label %if.end
408 %vecext18 = extractelement <4 x i32> %t, i32 3
409 %cmp19 = icmp sgt i32 %vecext18, 255
410 br i1 %cmp19, label %if.then, label %if.end
416 %vecext20 = extractelement <4 x i32> %t, i32 0
417 %vecext21 = extractelement <4 x i32> %t, i32 1
418 %add = add nsw i32 %vecext20, %vecext21
419 %conv = sitofp i32 %add to float
423 %retval.0 = phi float [ 0.000000e+00, %if.then ], [ %conv, %if.end ]
427 define float @test_merge_anyof_v4si(<4 x i32> %t) {
428 ; CHECK-LABEL: @test_merge_anyof_v4si(
430 ; CHECK-NEXT: [[TMP0:%.*]] = extractelement <4 x i32> [[T:%.*]], i32 3
431 ; CHECK-NEXT: [[TMP1:%.*]] = extractelement <4 x i32> [[T]], i32 2
432 ; CHECK-NEXT: [[TMP2:%.*]] = extractelement <4 x i32> [[T]], i32 1
433 ; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x i32> [[T]], i32 0
434 ; CHECK-NEXT: [[T_FR:%.*]] = freeze <4 x i32> [[T]]
435 ; CHECK-NEXT: [[TMP4:%.*]] = icmp slt <4 x i32> [[T_FR]], <i32 1, i32 1, i32 1, i32 1>
436 ; CHECK-NEXT: [[TMP5:%.*]] = bitcast <4 x i1> [[TMP4]] to i4
437 ; CHECK-NEXT: [[TMP6:%.*]] = icmp ne i4 [[TMP5]], 0
438 ; CHECK-NEXT: [[CMP11:%.*]] = icmp sgt i32 [[TMP3]], 255
439 ; CHECK-NEXT: [[OR_COND3:%.*]] = select i1 [[TMP6]], i1 true, i1 [[CMP11]]
440 ; CHECK-NEXT: [[CMP14:%.*]] = icmp sgt i32 [[TMP2]], 255
441 ; CHECK-NEXT: [[OR_COND4:%.*]] = select i1 [[OR_COND3]], i1 true, i1 [[CMP14]]
442 ; CHECK-NEXT: [[CMP17:%.*]] = icmp sgt i32 [[TMP1]], 255
443 ; CHECK-NEXT: [[OR_COND5:%.*]] = select i1 [[OR_COND4]], i1 true, i1 [[CMP17]]
444 ; CHECK-NEXT: [[CMP20:%.*]] = icmp sgt i32 [[TMP0]], 255
445 ; CHECK-NEXT: [[OR_COND6:%.*]] = select i1 [[OR_COND5]], i1 true, i1 [[CMP20]]
446 ; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 [[TMP3]], [[TMP2]]
447 ; CHECK-NEXT: [[CONV:%.*]] = sitofp i32 [[ADD]] to float
448 ; CHECK-NEXT: [[RETVAL_0:%.*]] = select i1 [[OR_COND6]], float 0.000000e+00, float [[CONV]]
449 ; CHECK-NEXT: ret float [[RETVAL_0]]
452 %vecext = extractelement <4 x i32> %t, i32 0
453 %cmp = icmp slt i32 %vecext, 1
454 br i1 %cmp, label %if.then, label %lor.lhs.false
457 %vecext1 = extractelement <4 x i32> %t, i32 1
458 %cmp2 = icmp slt i32 %vecext1, 1
459 br i1 %cmp2, label %if.then, label %lor.lhs.false3
462 %vecext4 = extractelement <4 x i32> %t, i32 2
463 %cmp5 = icmp slt i32 %vecext4, 1
464 br i1 %cmp5, label %if.then, label %lor.lhs.false6
467 %vecext7 = extractelement <4 x i32> %t, i32 3
468 %cmp8 = icmp slt i32 %vecext7, 1
469 br i1 %cmp8, label %if.then, label %lor.lhs.false9
472 %vecext10 = extractelement <4 x i32> %t, i32 0
473 %cmp11 = icmp sgt i32 %vecext10, 255
474 br i1 %cmp11, label %if.then, label %lor.lhs.false12
477 %vecext13 = extractelement <4 x i32> %t, i32 1
478 %cmp14 = icmp sgt i32 %vecext13, 255
479 br i1 %cmp14, label %if.then, label %lor.lhs.false15
482 %vecext16 = extractelement <4 x i32> %t, i32 2
483 %cmp17 = icmp sgt i32 %vecext16, 255
484 br i1 %cmp17, label %if.then, label %lor.lhs.false18
487 %vecext19 = extractelement <4 x i32> %t, i32 3
488 %cmp20 = icmp sgt i32 %vecext19, 255
489 br i1 %cmp20, label %if.then, label %if.end
495 %vecext21 = extractelement <4 x i32> %t, i32 0
496 %vecext22 = extractelement <4 x i32> %t, i32 1
497 %add = add nsw i32 %vecext21, %vecext22
498 %conv = sitofp i32 %add to float
502 %retval.0 = phi float [ 0.000000e+00, %if.then ], [ %conv, %if.end ]
506 define i32 @test_separate_allof_v4si(<4 x i32> %t) {
507 ; CHECK-LABEL: @test_separate_allof_v4si(
509 ; CHECK-NEXT: [[T_FR:%.*]] = freeze <4 x i32> [[T:%.*]]
510 ; CHECK-NEXT: [[TMP0:%.*]] = icmp sgt <4 x i32> [[T_FR]], zeroinitializer
511 ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i1> [[TMP0]] to i4
512 ; CHECK-NEXT: [[TMP2:%.*]] = icmp eq i4 [[TMP1]], 0
513 ; CHECK-NEXT: br i1 [[TMP2]], label [[RETURN:%.*]], label [[IF_END:%.*]]
515 ; CHECK-NEXT: [[TMP3:%.*]] = icmp slt <4 x i32> [[T_FR]], <i32 256, i32 256, i32 256, i32 256>
516 ; CHECK-NEXT: [[TMP4:%.*]] = bitcast <4 x i1> [[TMP3]] to i4
517 ; CHECK-NEXT: [[TMP5:%.*]] = icmp eq i4 [[TMP4]], 0
518 ; CHECK-NEXT: [[SHIFT:%.*]] = shufflevector <4 x i32> [[T_FR]], <4 x i32> poison, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
519 ; CHECK-NEXT: [[TMP6:%.*]] = add nsw <4 x i32> [[T_FR]], [[SHIFT]]
520 ; CHECK-NEXT: [[ADD:%.*]] = extractelement <4 x i32> [[TMP6]], i32 0
521 ; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[TMP5]], i32 0, i32 [[ADD]]
522 ; CHECK-NEXT: br label [[RETURN]]
524 ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SPEC_SELECT]], [[IF_END]] ]
525 ; CHECK-NEXT: ret i32 [[RETVAL_0]]
528 %vecext = extractelement <4 x i32> %t, i32 0
529 %cmp = icmp slt i32 %vecext, 1
530 br i1 %cmp, label %land.lhs.true, label %if.end
533 %vecext1 = extractelement <4 x i32> %t, i32 1
534 %cmp2 = icmp slt i32 %vecext1, 1
535 br i1 %cmp2, label %land.lhs.true3, label %if.end
538 %vecext4 = extractelement <4 x i32> %t, i32 2
539 %cmp5 = icmp slt i32 %vecext4, 1
540 br i1 %cmp5, label %land.lhs.true6, label %if.end
543 %vecext7 = extractelement <4 x i32> %t, i32 3
544 %cmp8 = icmp slt i32 %vecext7, 1
545 br i1 %cmp8, label %if.then, label %if.end
551 %vecext9 = extractelement <4 x i32> %t, i32 0
552 %cmp10 = icmp sgt i32 %vecext9, 255
553 br i1 %cmp10, label %land.lhs.true11, label %if.end21
556 %vecext12 = extractelement <4 x i32> %t, i32 1
557 %cmp13 = icmp sgt i32 %vecext12, 255
558 br i1 %cmp13, label %land.lhs.true14, label %if.end21
561 %vecext15 = extractelement <4 x i32> %t, i32 2
562 %cmp16 = icmp sgt i32 %vecext15, 255
563 br i1 %cmp16, label %land.lhs.true17, label %if.end21
566 %vecext18 = extractelement <4 x i32> %t, i32 3
567 %cmp19 = icmp sgt i32 %vecext18, 255
568 br i1 %cmp19, label %if.then20, label %if.end21
574 %vecext22 = extractelement <4 x i32> %t, i32 0
575 %vecext23 = extractelement <4 x i32> %t, i32 1
576 %add = add nsw i32 %vecext22, %vecext23
580 %retval.0 = phi i32 [ 0, %if.then ], [ 0, %if.then20 ], [ %add, %if.end21 ]
584 define i32 @test_separate_anyof_v4si(<4 x i32> %t) {
585 ; CHECK-LABEL: @test_separate_anyof_v4si(
587 ; CHECK-NEXT: [[T_FR:%.*]] = freeze <4 x i32> [[T:%.*]]
588 ; CHECK-NEXT: [[TMP0:%.*]] = icmp slt <4 x i32> [[T_FR]], <i32 1, i32 1, i32 1, i32 1>
589 ; CHECK-NEXT: [[TMP1:%.*]] = bitcast <4 x i1> [[TMP0]] to i4
590 ; CHECK-NEXT: [[DOTNOT:%.*]] = icmp eq i4 [[TMP1]], 0
591 ; CHECK-NEXT: br i1 [[DOTNOT]], label [[IF_END:%.*]], label [[RETURN:%.*]]
593 ; CHECK-NEXT: [[TMP2:%.*]] = icmp sgt <4 x i32> [[T_FR]], <i32 255, i32 255, i32 255, i32 255>
594 ; CHECK-NEXT: [[TMP3:%.*]] = bitcast <4 x i1> [[TMP2]] to i4
595 ; CHECK-NEXT: [[DOTNOT7:%.*]] = icmp eq i4 [[TMP3]], 0
596 ; CHECK-NEXT: [[SHIFT:%.*]] = shufflevector <4 x i32> [[T_FR]], <4 x i32> poison, <4 x i32> <i32 1, i32 undef, i32 undef, i32 undef>
597 ; CHECK-NEXT: [[TMP4:%.*]] = add nuw nsw <4 x i32> [[SHIFT]], [[T_FR]]
598 ; CHECK-NEXT: [[ADD:%.*]] = extractelement <4 x i32> [[TMP4]], i32 0
599 ; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[DOTNOT7]], i32 [[ADD]], i32 0
600 ; CHECK-NEXT: br label [[RETURN]]
602 ; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SPEC_SELECT]], [[IF_END]] ]
603 ; CHECK-NEXT: ret i32 [[RETVAL_0]]
606 %vecext = extractelement <4 x i32> %t, i32 0
607 %cmp = icmp slt i32 %vecext, 1
608 br i1 %cmp, label %if.then, label %lor.lhs.false
611 %vecext1 = extractelement <4 x i32> %t, i32 1
612 %cmp2 = icmp slt i32 %vecext1, 1
613 br i1 %cmp2, label %if.then, label %lor.lhs.false3
616 %vecext4 = extractelement <4 x i32> %t, i32 2
617 %cmp5 = icmp slt i32 %vecext4, 1
618 br i1 %cmp5, label %if.then, label %lor.lhs.false6
621 %vecext7 = extractelement <4 x i32> %t, i32 3
622 %cmp8 = icmp slt i32 %vecext7, 1
623 br i1 %cmp8, label %if.then, label %if.end
629 %vecext9 = extractelement <4 x i32> %t, i32 0
630 %cmp10 = icmp sgt i32 %vecext9, 255
631 br i1 %cmp10, label %if.then20, label %lor.lhs.false11
634 %vecext12 = extractelement <4 x i32> %t, i32 1
635 %cmp13 = icmp sgt i32 %vecext12, 255
636 br i1 %cmp13, label %if.then20, label %lor.lhs.false14
639 %vecext15 = extractelement <4 x i32> %t, i32 2
640 %cmp16 = icmp sgt i32 %vecext15, 255
641 br i1 %cmp16, label %if.then20, label %lor.lhs.false17
644 %vecext18 = extractelement <4 x i32> %t, i32 3
645 %cmp19 = icmp sgt i32 %vecext18, 255
646 br i1 %cmp19, label %if.then20, label %if.end21
652 %vecext22 = extractelement <4 x i32> %t, i32 0
653 %vecext23 = extractelement <4 x i32> %t, i32 1
654 %add = add nsw i32 %vecext22, %vecext23
658 %retval.0 = phi i32 [ 0, %if.then ], [ 0, %if.then20 ], [ %add, %if.end21 ]