@@ -251,28 +251,53 @@ define i1 @logical_and_icmp_clamp(<4 x i32> %x) {
251
251
}
252
252
253
253
define i1 @logical_and_icmp_clamp_extra_use_cmp (<4 x i32 > %x ) {
254
- ; CHECK-LABEL: @logical_and_icmp_clamp_extra_use_cmp(
255
- ; CHECK-NEXT: [[X0:%.*]] = extractelement <4 x i32> [[X:%.*]], i32 0
256
- ; CHECK-NEXT: [[X1:%.*]] = extractelement <4 x i32> [[X]], i32 1
257
- ; CHECK-NEXT: [[X2:%.*]] = extractelement <4 x i32> [[X]], i32 2
258
- ; CHECK-NEXT: [[X3:%.*]] = extractelement <4 x i32> [[X]], i32 3
259
- ; CHECK-NEXT: [[C0:%.*]] = icmp slt i32 [[X0]], 42
260
- ; CHECK-NEXT: [[C1:%.*]] = icmp slt i32 [[X1]], 42
261
- ; CHECK-NEXT: [[C2:%.*]] = icmp slt i32 [[X2]], 42
262
- ; CHECK-NEXT: call void @use1(i1 [[C2]])
263
- ; CHECK-NEXT: [[C3:%.*]] = icmp slt i32 [[X3]], 42
264
- ; CHECK-NEXT: [[D0:%.*]] = icmp sgt i32 [[X0]], 17
265
- ; CHECK-NEXT: [[D1:%.*]] = icmp sgt i32 [[X1]], 17
266
- ; CHECK-NEXT: [[D2:%.*]] = icmp sgt i32 [[X2]], 17
267
- ; CHECK-NEXT: [[D3:%.*]] = icmp sgt i32 [[X3]], 17
268
- ; CHECK-NEXT: [[S1:%.*]] = select i1 [[C0]], i1 [[C1]], i1 false
269
- ; CHECK-NEXT: [[S2:%.*]] = select i1 [[S1]], i1 [[C2]], i1 false
270
- ; CHECK-NEXT: [[S3:%.*]] = select i1 [[S2]], i1 [[C3]], i1 false
271
- ; CHECK-NEXT: [[S4:%.*]] = select i1 [[S3]], i1 [[D0]], i1 false
272
- ; CHECK-NEXT: [[S5:%.*]] = select i1 [[S4]], i1 [[D1]], i1 false
273
- ; CHECK-NEXT: [[S6:%.*]] = select i1 [[S5]], i1 [[D2]], i1 false
274
- ; CHECK-NEXT: [[S7:%.*]] = select i1 [[S6]], i1 [[D3]], i1 false
275
- ; CHECK-NEXT: ret i1 [[S7]]
254
+ ; SSE-LABEL: @logical_and_icmp_clamp_extra_use_cmp(
255
+ ; SSE-NEXT: [[X0:%.*]] = extractelement <4 x i32> [[X:%.*]], i32 0
256
+ ; SSE-NEXT: [[X1:%.*]] = extractelement <4 x i32> [[X]], i32 1
257
+ ; SSE-NEXT: [[X2:%.*]] = extractelement <4 x i32> [[X]], i32 2
258
+ ; SSE-NEXT: [[X3:%.*]] = extractelement <4 x i32> [[X]], i32 3
259
+ ; SSE-NEXT: [[C2:%.*]] = icmp slt i32 [[X2]], 42
260
+ ; SSE-NEXT: call void @use1(i1 [[C2]])
261
+ ; SSE-NEXT: [[TMP1:%.*]] = insertelement <4 x i32> poison, i32 [[X0]], i32 0
262
+ ; SSE-NEXT: [[TMP2:%.*]] = insertelement <4 x i32> [[TMP1]], i32 [[X1]], i32 1
263
+ ; SSE-NEXT: [[TMP3:%.*]] = insertelement <4 x i32> [[TMP2]], i32 [[X3]], i32 2
264
+ ; SSE-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> [[TMP3]], i32 [[X0]], i32 3
265
+ ; SSE-NEXT: [[TMP5:%.*]] = icmp slt <4 x i32> [[TMP4]], <i32 42, i32 42, i32 42, i32 17>
266
+ ; SSE-NEXT: [[TMP6:%.*]] = icmp sgt <4 x i32> [[TMP4]], <i32 42, i32 42, i32 42, i32 17>
267
+ ; SSE-NEXT: [[TMP7:%.*]] = shufflevector <4 x i1> [[TMP5]], <4 x i1> [[TMP6]], <4 x i32> <i32 0, i32 1, i32 2, i32 7>
268
+ ; SSE-NEXT: [[D1:%.*]] = icmp sgt i32 [[X1]], 17
269
+ ; SSE-NEXT: [[D2:%.*]] = icmp sgt i32 [[X2]], 17
270
+ ; SSE-NEXT: [[D3:%.*]] = icmp sgt i32 [[X3]], 17
271
+ ; SSE-NEXT: [[TMP8:%.*]] = freeze <4 x i1> [[TMP7]]
272
+ ; SSE-NEXT: [[TMP9:%.*]] = call i1 @llvm.vector.reduce.and.v4i1(<4 x i1> [[TMP8]])
273
+ ; SSE-NEXT: [[OP_EXTRA:%.*]] = select i1 [[TMP9]], i1 [[C2]], i1 false
274
+ ; SSE-NEXT: [[S5:%.*]] = select i1 [[OP_EXTRA]], i1 [[D1]], i1 false
275
+ ; SSE-NEXT: [[S6:%.*]] = select i1 [[S5]], i1 [[D2]], i1 false
276
+ ; SSE-NEXT: [[S7:%.*]] = select i1 [[S6]], i1 [[D3]], i1 false
277
+ ; SSE-NEXT: ret i1 [[S7]]
278
+ ;
279
+ ; AVX-LABEL: @logical_and_icmp_clamp_extra_use_cmp(
280
+ ; AVX-NEXT: [[X0:%.*]] = extractelement <4 x i32> [[X:%.*]], i32 0
281
+ ; AVX-NEXT: [[X1:%.*]] = extractelement <4 x i32> [[X]], i32 1
282
+ ; AVX-NEXT: [[X2:%.*]] = extractelement <4 x i32> [[X]], i32 2
283
+ ; AVX-NEXT: [[X3:%.*]] = extractelement <4 x i32> [[X]], i32 3
284
+ ; AVX-NEXT: [[C0:%.*]] = icmp slt i32 [[X0]], 42
285
+ ; AVX-NEXT: [[C1:%.*]] = icmp slt i32 [[X1]], 42
286
+ ; AVX-NEXT: [[C2:%.*]] = icmp slt i32 [[X2]], 42
287
+ ; AVX-NEXT: call void @use1(i1 [[C2]])
288
+ ; AVX-NEXT: [[C3:%.*]] = icmp slt i32 [[X3]], 42
289
+ ; AVX-NEXT: [[D0:%.*]] = icmp sgt i32 [[X0]], 17
290
+ ; AVX-NEXT: [[D1:%.*]] = icmp sgt i32 [[X1]], 17
291
+ ; AVX-NEXT: [[D2:%.*]] = icmp sgt i32 [[X2]], 17
292
+ ; AVX-NEXT: [[D3:%.*]] = icmp sgt i32 [[X3]], 17
293
+ ; AVX-NEXT: [[S1:%.*]] = select i1 [[C0]], i1 [[C1]], i1 false
294
+ ; AVX-NEXT: [[S2:%.*]] = select i1 [[S1]], i1 [[C2]], i1 false
295
+ ; AVX-NEXT: [[S3:%.*]] = select i1 [[S2]], i1 [[C3]], i1 false
296
+ ; AVX-NEXT: [[S4:%.*]] = select i1 [[S3]], i1 [[D0]], i1 false
297
+ ; AVX-NEXT: [[S5:%.*]] = select i1 [[S4]], i1 [[D1]], i1 false
298
+ ; AVX-NEXT: [[S6:%.*]] = select i1 [[S5]], i1 [[D2]], i1 false
299
+ ; AVX-NEXT: [[S7:%.*]] = select i1 [[S6]], i1 [[D3]], i1 false
300
+ ; AVX-NEXT: ret i1 [[S7]]
276
301
;
277
302
%x0 = extractelement <4 x i32 > %x , i32 0
278
303
%x1 = extractelement <4 x i32 > %x , i32 1
@@ -395,25 +420,47 @@ define i1 @logical_and_icmp_clamp_v8i32(<8 x i32> %x, <8 x i32> %y) {
395
420
}
396
421
397
422
define i1 @logical_and_icmp_clamp_partial (<4 x i32 > %x ) {
398
- ; CHECK-LABEL: @logical_and_icmp_clamp_partial(
399
- ; CHECK-NEXT: [[X0:%.*]] = extractelement <4 x i32> [[X:%.*]], i32 0
400
- ; CHECK-NEXT: [[X1:%.*]] = extractelement <4 x i32> [[X]], i32 1
401
- ; CHECK-NEXT: [[X2:%.*]] = extractelement <4 x i32> [[X]], i32 2
402
- ; CHECK-NEXT: [[X3:%.*]] = extractelement <4 x i32> [[X]], i32 3
403
- ; CHECK-NEXT: [[C0:%.*]] = icmp slt i32 [[X0]], 42
404
- ; CHECK-NEXT: [[C1:%.*]] = icmp slt i32 [[X1]], 42
405
- ; CHECK-NEXT: [[C2:%.*]] = icmp slt i32 [[X2]], 42
406
- ; CHECK-NEXT: [[D0:%.*]] = icmp sgt i32 [[X0]], 17
407
- ; CHECK-NEXT: [[D1:%.*]] = icmp sgt i32 [[X1]], 17
408
- ; CHECK-NEXT: [[D2:%.*]] = icmp sgt i32 [[X2]], 17
409
- ; CHECK-NEXT: [[D3:%.*]] = icmp sgt i32 [[X3]], 17
410
- ; CHECK-NEXT: [[S1:%.*]] = select i1 [[C0]], i1 [[C1]], i1 false
411
- ; CHECK-NEXT: [[S2:%.*]] = select i1 [[S1]], i1 [[C2]], i1 false
412
- ; CHECK-NEXT: [[S4:%.*]] = select i1 [[S2]], i1 [[D0]], i1 false
413
- ; CHECK-NEXT: [[S5:%.*]] = select i1 [[S4]], i1 [[D1]], i1 false
414
- ; CHECK-NEXT: [[S6:%.*]] = select i1 [[S5]], i1 [[D2]], i1 false
415
- ; CHECK-NEXT: [[S7:%.*]] = select i1 [[S6]], i1 [[D3]], i1 false
416
- ; CHECK-NEXT: ret i1 [[S7]]
423
+ ; SSE-LABEL: @logical_and_icmp_clamp_partial(
424
+ ; SSE-NEXT: [[X0:%.*]] = extractelement <4 x i32> [[X:%.*]], i32 0
425
+ ; SSE-NEXT: [[X1:%.*]] = extractelement <4 x i32> [[X]], i32 1
426
+ ; SSE-NEXT: [[X2:%.*]] = extractelement <4 x i32> [[X]], i32 2
427
+ ; SSE-NEXT: [[X3:%.*]] = extractelement <4 x i32> [[X]], i32 3
428
+ ; SSE-NEXT: [[TMP1:%.*]] = insertelement <4 x i32> poison, i32 [[X0]], i32 0
429
+ ; SSE-NEXT: [[TMP2:%.*]] = insertelement <4 x i32> [[TMP1]], i32 [[X1]], i32 1
430
+ ; SSE-NEXT: [[TMP3:%.*]] = insertelement <4 x i32> [[TMP2]], i32 [[X2]], i32 2
431
+ ; SSE-NEXT: [[TMP4:%.*]] = insertelement <4 x i32> [[TMP3]], i32 [[X0]], i32 3
432
+ ; SSE-NEXT: [[TMP5:%.*]] = icmp slt <4 x i32> [[TMP4]], <i32 42, i32 42, i32 42, i32 17>
433
+ ; SSE-NEXT: [[TMP6:%.*]] = icmp sgt <4 x i32> [[TMP4]], <i32 42, i32 42, i32 42, i32 17>
434
+ ; SSE-NEXT: [[TMP7:%.*]] = shufflevector <4 x i1> [[TMP5]], <4 x i1> [[TMP6]], <4 x i32> <i32 0, i32 1, i32 2, i32 7>
435
+ ; SSE-NEXT: [[D1:%.*]] = icmp sgt i32 [[X1]], 17
436
+ ; SSE-NEXT: [[D2:%.*]] = icmp sgt i32 [[X2]], 17
437
+ ; SSE-NEXT: [[D3:%.*]] = icmp sgt i32 [[X3]], 17
438
+ ; SSE-NEXT: [[TMP8:%.*]] = freeze <4 x i1> [[TMP7]]
439
+ ; SSE-NEXT: [[TMP9:%.*]] = call i1 @llvm.vector.reduce.and.v4i1(<4 x i1> [[TMP8]])
440
+ ; SSE-NEXT: [[S5:%.*]] = select i1 [[TMP9]], i1 [[D1]], i1 false
441
+ ; SSE-NEXT: [[S6:%.*]] = select i1 [[S5]], i1 [[D2]], i1 false
442
+ ; SSE-NEXT: [[S7:%.*]] = select i1 [[S6]], i1 [[D3]], i1 false
443
+ ; SSE-NEXT: ret i1 [[S7]]
444
+ ;
445
+ ; AVX-LABEL: @logical_and_icmp_clamp_partial(
446
+ ; AVX-NEXT: [[X0:%.*]] = extractelement <4 x i32> [[X:%.*]], i32 0
447
+ ; AVX-NEXT: [[X1:%.*]] = extractelement <4 x i32> [[X]], i32 1
448
+ ; AVX-NEXT: [[X2:%.*]] = extractelement <4 x i32> [[X]], i32 2
449
+ ; AVX-NEXT: [[X3:%.*]] = extractelement <4 x i32> [[X]], i32 3
450
+ ; AVX-NEXT: [[C0:%.*]] = icmp slt i32 [[X0]], 42
451
+ ; AVX-NEXT: [[C1:%.*]] = icmp slt i32 [[X1]], 42
452
+ ; AVX-NEXT: [[C2:%.*]] = icmp slt i32 [[X2]], 42
453
+ ; AVX-NEXT: [[D0:%.*]] = icmp sgt i32 [[X0]], 17
454
+ ; AVX-NEXT: [[D1:%.*]] = icmp sgt i32 [[X1]], 17
455
+ ; AVX-NEXT: [[D2:%.*]] = icmp sgt i32 [[X2]], 17
456
+ ; AVX-NEXT: [[D3:%.*]] = icmp sgt i32 [[X3]], 17
457
+ ; AVX-NEXT: [[S1:%.*]] = select i1 [[C0]], i1 [[C1]], i1 false
458
+ ; AVX-NEXT: [[S2:%.*]] = select i1 [[S1]], i1 [[C2]], i1 false
459
+ ; AVX-NEXT: [[S4:%.*]] = select i1 [[S2]], i1 [[D0]], i1 false
460
+ ; AVX-NEXT: [[S5:%.*]] = select i1 [[S4]], i1 [[D1]], i1 false
461
+ ; AVX-NEXT: [[S6:%.*]] = select i1 [[S5]], i1 [[D2]], i1 false
462
+ ; AVX-NEXT: [[S7:%.*]] = select i1 [[S6]], i1 [[D3]], i1 false
463
+ ; AVX-NEXT: ret i1 [[S7]]
417
464
;
418
465
%x0 = extractelement <4 x i32 > %x , i32 0
419
466
%x1 = extractelement <4 x i32 > %x , i32 1
0 commit comments