@@ -456,10 +456,10 @@ define i32 @zext_or_masked_bit_test_uses(i32 %a, i32 %b, i32 %x) {
456
456
457
457
define i16 @zext_masked_bit_zero_to_smaller_bitwidth (i32 %a , i32 %b ) {
458
458
; CHECK-LABEL: @zext_masked_bit_zero_to_smaller_bitwidth(
459
- ; CHECK-NEXT: [[SHL :%.*]] = shl nuw i32 1, [[B :%.*]]
460
- ; CHECK-NEXT: [[AND :%.*]] = and i32 [[SHL ]], [[A :%.*]]
461
- ; CHECK-NEXT: [[CMP :%.*]] = icmp eq i32 [[AND]], 0
462
- ; CHECK-NEXT: [[Z:%.*]] = zext i1 [[CMP]] to i16
459
+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor i32 [[A :%.*]], -1
460
+ ; CHECK-NEXT: [[TMP2 :%.*]] = lshr i32 [[TMP1 ]], [[B :%.*]]
461
+ ; CHECK-NEXT: [[TMP3 :%.*]] = trunc i32 [[TMP2]] to i16
462
+ ; CHECK-NEXT: [[Z:%.*]] = and i16 [[TMP3]], 1
463
463
; CHECK-NEXT: ret i16 [[Z]]
464
464
;
465
465
%shl = shl i32 1 , %b
@@ -471,10 +471,10 @@ define i16 @zext_masked_bit_zero_to_smaller_bitwidth(i32 %a, i32 %b) {
471
471
472
472
define <4 x i16 > @zext_masked_bit_zero_to_smaller_bitwidth_v4i32 (<4 x i32 > %a , <4 x i32 > %b ) {
473
473
; CHECK-LABEL: @zext_masked_bit_zero_to_smaller_bitwidth_v4i32(
474
- ; CHECK-NEXT: [[SHL :%.*]] = shl nuw <4 x i32> <i32 1, i32 1, i32 1, i32 1>, [[B:%.*]]
475
- ; CHECK-NEXT: [[AND :%.*]] = and <4 x i32> [[SHL ]], [[A :%.*]]
476
- ; CHECK-NEXT: [[CMP :%.*]] = icmp eq <4 x i32> [[AND]], zeroinitializer
477
- ; CHECK-NEXT: [[Z:%.*]] = zext <4 x i1 > [[CMP]] to <4 x i16>
474
+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor <4 x i32> [[A:%.*]], <i32 - 1, i32 - 1, i32 - 1, i32 -1>
475
+ ; CHECK-NEXT: [[TMP2 :%.*]] = lshr <4 x i32> [[TMP1 ]], [[B :%.*]]
476
+ ; CHECK-NEXT: [[TMP3 :%.*]] = trunc <4 x i32> [[TMP2]] to <4 x i16>
477
+ ; CHECK-NEXT: [[Z:%.*]] = and <4 x i16 > [[TMP3]], <i16 1, i16 1, i16 1, i16 1 >
478
478
; CHECK-NEXT: ret <4 x i16> [[Z]]
479
479
;
480
480
%shl = shl <4 x i32 > <i32 1 , i32 1 , i32 1 , i32 1 >, %b
@@ -486,10 +486,9 @@ define <4 x i16> @zext_masked_bit_zero_to_smaller_bitwidth_v4i32(<4 x i32> %a, <
486
486
487
487
define i16 @zext_masked_bit_nonzero_to_smaller_bitwidth (i32 %a , i32 %b ) {
488
488
; CHECK-LABEL: @zext_masked_bit_nonzero_to_smaller_bitwidth(
489
- ; CHECK-NEXT: [[SHL:%.*]] = shl nuw i32 1, [[B:%.*]]
490
- ; CHECK-NEXT: [[AND:%.*]] = and i32 [[SHL]], [[A:%.*]]
491
- ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 0
492
- ; CHECK-NEXT: [[Z:%.*]] = zext i1 [[CMP]] to i16
489
+ ; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[A:%.*]], [[B:%.*]]
490
+ ; CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
491
+ ; CHECK-NEXT: [[Z:%.*]] = and i16 [[TMP2]], 1
493
492
; CHECK-NEXT: ret i16 [[Z]]
494
493
;
495
494
%shl = shl i32 1 , %b
@@ -501,10 +500,10 @@ define i16 @zext_masked_bit_nonzero_to_smaller_bitwidth(i32 %a, i32 %b) {
501
500
502
501
define i64 @zext_masked_bit_zero_to_larger_bitwidth (i32 %a , i32 %b ) {
503
502
; CHECK-LABEL: @zext_masked_bit_zero_to_larger_bitwidth(
504
- ; CHECK-NEXT: [[SHL :%.*]] = shl nuw i32 1, [[B :%.*]]
505
- ; CHECK-NEXT: [[AND :%.*]] = and i32 [[SHL ]], [[A :%.*]]
506
- ; CHECK-NEXT: [[CMP :%.*]] = icmp eq i32 [[AND ]], 0
507
- ; CHECK-NEXT: [[Z:%.*]] = zext i1 [[CMP ]] to i64
503
+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor i32 [[A :%.*]], -1
504
+ ; CHECK-NEXT: [[TMP2 :%.*]] = lshr i32 [[TMP1 ]], [[B :%.*]]
505
+ ; CHECK-NEXT: [[TMP3 :%.*]] = and i32 [[TMP2 ]], 1
506
+ ; CHECK-NEXT: [[Z:%.*]] = zext nneg i32 [[TMP3 ]] to i64
508
507
; CHECK-NEXT: ret i64 [[Z]]
509
508
;
510
509
%shl = shl i32 1 , %b
@@ -516,10 +515,10 @@ define i64 @zext_masked_bit_zero_to_larger_bitwidth(i32 %a, i32 %b) {
516
515
517
516
define <4 x i64 > @zext_masked_bit_zero_to_larger_bitwidth_v4i32 (<4 x i32 > %a , <4 x i32 > %b ) {
518
517
; CHECK-LABEL: @zext_masked_bit_zero_to_larger_bitwidth_v4i32(
519
- ; CHECK-NEXT: [[SHL :%.*]] = shl nuw <4 x i32> <i32 1, i32 1, i32 1, i32 1>, [[B:%.*]]
520
- ; CHECK-NEXT: [[AND :%.*]] = and <4 x i32> [[SHL ]], [[A :%.*]]
521
- ; CHECK-NEXT: [[CMP :%.*]] = icmp eq <4 x i32> [[AND ]], zeroinitializer
522
- ; CHECK-NEXT: [[Z:%.*]] = zext <4 x i1 > [[CMP ]] to <4 x i64>
518
+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor <4 x i32> [[A:%.*]], <i32 - 1, i32 - 1, i32 - 1, i32 -1>
519
+ ; CHECK-NEXT: [[TMP2 :%.*]] = lshr <4 x i32> [[TMP1 ]], [[B :%.*]]
520
+ ; CHECK-NEXT: [[TMP3 :%.*]] = and <4 x i32> [[TMP2 ]], <i32 1, i32 1, i32 1, i32 1>
521
+ ; CHECK-NEXT: [[Z:%.*]] = zext nneg <4 x i32 > [[TMP3 ]] to <4 x i64>
523
522
; CHECK-NEXT: ret <4 x i64> [[Z]]
524
523
;
525
524
%shl = shl <4 x i32 > <i32 1 , i32 1 , i32 1 , i32 1 >, %b
0 commit comments