[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / Transforms / PhaseOrdering / X86 / vector-reductions-logical.ll
blob6130a762b33e19935184026b06c244e67c68619c
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:    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]]
24 ; CHECK:       return:
25 ; CHECK-NEXT:    [[RETVAL_0:%.*]] = phi float [ 0.000000e+00, [[ENTRY:%.*]] ], [ [[SPEC_SELECT]], [[LOR_LHS_FALSE]] ]
26 ; CHECK-NEXT:    ret float [[RETVAL_0]]
28 entry:
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
34 land.lhs.true:
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
40 land.lhs.true6:
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
46 land.lhs.true11:
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
52 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
58 land.lhs.true20:
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
64 land.lhs.true25:
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
70 land.lhs.true30:
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
76 if.then:
77   br label %return
79 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
83   br label %return
85 return:
86   %retval.0 = phi float [ 0.000000e+00, %if.then ], [ %add, %if.end ]
87   ret float %retval.0
90 define float @test_merge_anyof_v4sf(<4 x float> %t) {
91 ; CHECK-LABEL: @test_merge_anyof_v4sf(
92 ; CHECK-NEXT:  entry:
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]]
113 entry:
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
119 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
125 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
131 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
137 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
143 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
149 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
155 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
161 if.then:
162   br label %return
164 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
168   br label %return
170 return:
171   %retval.0 = phi float [ 0.000000e+00, %if.then ], [ %add, %if.end ]
172   ret float %retval.0
175 define float @test_separate_allof_v4sf(<4 x float> %t) {
176 ; CHECK-LABEL: @test_separate_allof_v4sf(
177 ; CHECK-NEXT:  entry:
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:%.*]]
183 ; CHECK:       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]]
192 ; CHECK:       return:
193 ; CHECK-NEXT:    [[RETVAL_0:%.*]] = phi float [ 0.000000e+00, [[ENTRY:%.*]] ], [ [[SPEC_SELECT]], [[IF_END]] ]
194 ; CHECK-NEXT:    ret float [[RETVAL_0]]
196 entry:
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
202 land.lhs.true:
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
208 land.lhs.true6:
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
214 land.lhs.true11:
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
220 if.then:
221   br label %return
223 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
229 land.lhs.true20:
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
235 land.lhs.true25:
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
241 land.lhs.true30:
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
247 if.then35:
248   br label %return
250 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
254   br label %return
256 return:
257   %retval.0 = phi float [ 0.000000e+00, %if.then ], [ 0.000000e+00, %if.then35 ], [ %add, %if.end36 ]
258   ret float %retval.0
261 define float @test_separate_anyof_v4sf(<4 x float> %t) {
262 ; CHECK-LABEL: @test_separate_anyof_v4sf(
263 ; CHECK-NEXT:  entry:
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]]
284 entry:
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
290 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
296 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
302 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
308 if.then:
309   br label %return
311 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
317 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
323 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
329 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
335 if.then35:
336   br label %return
338 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
342   br label %return
344 return:
345   %retval.0 = phi float [ 0.000000e+00, %if.then ], [ 0.000000e+00, %if.then35 ], [ %add, %if.end36 ]
346   ret float %retval.0
349 define float @test_merge_allof_v4si(<4 x i32> %t) {
350 ; CHECK-LABEL: @test_merge_allof_v4si(
351 ; CHECK-NEXT:  entry:
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:%.*]]
362 ; CHECK:       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]]
368 ; CHECK:       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]]
372 entry:
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
377 land.lhs.true:
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
382 land.lhs.true3:
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
387 land.lhs.true6:
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
392 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
397 land.lhs.true11:
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
402 land.lhs.true14:
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
407 land.lhs.true17:
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
412 if.then:
413   br label %return
415 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
420   br label %return
422 return:
423   %retval.0 = phi float [ 0.000000e+00, %if.then ], [ %conv, %if.end ]
424   ret float %retval.0
427 define float @test_merge_anyof_v4si(<4 x i32> %t) {
428 ; CHECK-LABEL: @test_merge_anyof_v4si(
429 ; CHECK-NEXT:  entry:
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]]
451 entry:
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
456 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
461 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
466 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
471 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
476 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
481 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
486 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
491 if.then:
492   br label %return
494 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
499   br label %return
501 return:
502   %retval.0 = phi float [ 0.000000e+00, %if.then ], [ %conv, %if.end ]
503   ret float %retval.0
506 define i32 @test_separate_allof_v4si(<4 x i32> %t) {
507 ; CHECK-LABEL: @test_separate_allof_v4si(
508 ; CHECK-NEXT:  entry:
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:%.*]]
514 ; CHECK:       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]]
523 ; CHECK:       return:
524 ; CHECK-NEXT:    [[RETVAL_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SPEC_SELECT]], [[IF_END]] ]
525 ; CHECK-NEXT:    ret i32 [[RETVAL_0]]
527 entry:
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
532 land.lhs.true:
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
537 land.lhs.true3:
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
542 land.lhs.true6:
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
547 if.then:
548   br label %return
550 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
555 land.lhs.true11:
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
560 land.lhs.true14:
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
565 land.lhs.true17:
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
570 if.then20:
571   br label %return
573 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
577   br label %return
579 return:
580   %retval.0 = phi i32 [ 0, %if.then ], [ 0, %if.then20 ], [ %add, %if.end21 ]
581   ret i32 %retval.0
584 define i32 @test_separate_anyof_v4si(<4 x i32> %t) {
585 ; CHECK-LABEL: @test_separate_anyof_v4si(
586 ; CHECK-NEXT:  entry:
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:%.*]]
592 ; CHECK:       if.end:
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]]
601 ; CHECK:       return:
602 ; CHECK-NEXT:    [[RETVAL_0:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[SPEC_SELECT]], [[IF_END]] ]
603 ; CHECK-NEXT:    ret i32 [[RETVAL_0]]
605 entry:
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
610 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
615 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
620 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
625 if.then:
626   br label %return
628 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
633 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
638 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
643 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
648 if.then20:
649   br label %return
651 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
655   br label %return
657 return:
658   %retval.0 = phi i32 [ 0, %if.then ], [ 0, %if.then20 ], [ %add, %if.end21 ]
659   ret i32 %retval.0