@@ -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
@@ -504,10 +504,9 @@ define i16 @zext_masked_bit_zero_to_smaller_bitwidth_multi_use_shl(i32 %a, i32 %
504
504
505
505
define i16 @zext_masked_bit_nonzero_to_smaller_bitwidth (i32 %a , i32 %b ) {
506
506
; CHECK-LABEL: @zext_masked_bit_nonzero_to_smaller_bitwidth(
507
- ; CHECK-NEXT: [[SHL:%.*]] = shl nuw i32 1, [[B:%.*]]
508
- ; CHECK-NEXT: [[AND:%.*]] = and i32 [[SHL]], [[A:%.*]]
509
- ; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 0
510
- ; CHECK-NEXT: [[Z:%.*]] = zext i1 [[CMP]] to i16
507
+ ; CHECK-NEXT: [[TMP1:%.*]] = lshr i32 [[A:%.*]], [[B:%.*]]
508
+ ; CHECK-NEXT: [[TMP2:%.*]] = trunc i32 [[TMP1]] to i16
509
+ ; CHECK-NEXT: [[Z:%.*]] = and i16 [[TMP2]], 1
511
510
; CHECK-NEXT: ret i16 [[Z]]
512
511
;
513
512
%shl = shl i32 1 , %b
@@ -520,9 +519,9 @@ define i16 @zext_masked_bit_nonzero_to_smaller_bitwidth(i32 %a, i32 %b) {
520
519
define i16 @zext_masked_bit_nonzero_to_smaller_bitwidth_multi_use_shl (i32 %a , i32 %b ) {
521
520
; CHECK-LABEL: @zext_masked_bit_nonzero_to_smaller_bitwidth_multi_use_shl(
522
521
; CHECK-NEXT: [[SHL:%.*]] = shl nuw i32 1, [[B:%.*]]
523
- ; CHECK-NEXT: [[AND :%.*]] = and i32 [[SHL ]], [[A:%.* ]]
524
- ; CHECK-NEXT: [[CMP :%.*]] = icmp ne i32 [[AND]], 0
525
- ; CHECK-NEXT: [[Z:%.*]] = zext i1 [[CMP]] to i16
522
+ ; CHECK-NEXT: [[TMP1 :%.*]] = lshr i32 [[A:%.* ]], [[B ]]
523
+ ; CHECK-NEXT: [[TMP2 :%.*]] = trunc i32 [[TMP1]] to i16
524
+ ; CHECK-NEXT: [[Z:%.*]] = and i16 [[TMP2]], 1
526
525
; CHECK-NEXT: call void @use32(i32 [[SHL]])
527
526
; CHECK-NEXT: ret i16 [[Z]]
528
527
;
@@ -536,10 +535,10 @@ define i16 @zext_masked_bit_nonzero_to_smaller_bitwidth_multi_use_shl(i32 %a, i3
536
535
537
536
define i64 @zext_masked_bit_zero_to_larger_bitwidth (i32 %a , i32 %b ) {
538
537
; CHECK-LABEL: @zext_masked_bit_zero_to_larger_bitwidth(
539
- ; CHECK-NEXT: [[SHL :%.*]] = shl nuw i32 1, [[B :%.*]]
540
- ; CHECK-NEXT: [[AND :%.*]] = and i32 [[SHL ]], [[A :%.*]]
541
- ; CHECK-NEXT: [[CMP :%.*]] = icmp eq i32 [[AND ]], 0
542
- ; CHECK-NEXT: [[Z:%.*]] = zext i1 [[CMP ]] to i64
538
+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor i32 [[A :%.*]], -1
539
+ ; CHECK-NEXT: [[TMP2 :%.*]] = lshr i32 [[TMP1 ]], [[B :%.*]]
540
+ ; CHECK-NEXT: [[TMP3 :%.*]] = and i32 [[TMP2 ]], 1
541
+ ; CHECK-NEXT: [[Z:%.*]] = zext nneg i32 [[TMP3 ]] to i64
543
542
; CHECK-NEXT: ret i64 [[Z]]
544
543
;
545
544
%shl = shl i32 1 , %b
@@ -551,10 +550,10 @@ define i64 @zext_masked_bit_zero_to_larger_bitwidth(i32 %a, i32 %b) {
551
550
552
551
define <4 x i64 > @zext_masked_bit_zero_to_larger_bitwidth_v4i32 (<4 x i32 > %a , <4 x i32 > %b ) {
553
552
; CHECK-LABEL: @zext_masked_bit_zero_to_larger_bitwidth_v4i32(
554
- ; CHECK-NEXT: [[SHL :%.*]] = shl nuw <4 x i32> <i32 1, i32 1, i32 1, i32 1>, [[B:%.*]]
555
- ; CHECK-NEXT: [[AND :%.*]] = and <4 x i32> [[SHL ]], [[A :%.*]]
556
- ; CHECK-NEXT: [[CMP :%.*]] = icmp eq <4 x i32> [[AND ]], zeroinitializer
557
- ; CHECK-NEXT: [[Z:%.*]] = zext <4 x i1 > [[CMP ]] to <4 x i64>
553
+ ; CHECK-NEXT: [[TMP1 :%.*]] = xor <4 x i32> [[A:%.*]], <i32 - 1, i32 - 1, i32 - 1, i32 -1>
554
+ ; CHECK-NEXT: [[TMP2 :%.*]] = lshr <4 x i32> [[TMP1 ]], [[B :%.*]]
555
+ ; CHECK-NEXT: [[TMP3 :%.*]] = and <4 x i32> [[TMP2 ]], <i32 1, i32 1, i32 1, i32 1>
556
+ ; CHECK-NEXT: [[Z:%.*]] = zext nneg <4 x i32 > [[TMP3 ]] to <4 x i64>
558
557
; CHECK-NEXT: ret <4 x i64> [[Z]]
559
558
;
560
559
%shl = shl <4 x i32 > <i32 1 , i32 1 , i32 1 , i32 1 >, %b
0 commit comments