@@ -2546,3 +2546,39 @@ define i32 @and_zext_eq_zero(i32 %A, i32 %C) {
2546
2546
%5 = and i32 %2 , %4
2547
2547
ret i32 %5
2548
2548
}
2549
+
2550
+ define i32 @canonicalize_and_add_power2_or_zero (i32 %x , i32 %y ) {
2551
+ ; CHECK-LABEL: @canonicalize_and_add_power2_or_zero(
2552
+ ; CHECK-NEXT: [[NY:%.*]] = sub i32 0, [[Y:%.*]]
2553
+ ; CHECK-NEXT: [[P2:%.*]] = and i32 [[NY]], [[Y]]
2554
+ ; CHECK-NEXT: call void @use32(i32 [[P2]])
2555
+ ; CHECK-NEXT: [[VAL:%.*]] = add i32 [[P2]], [[X:%.*]]
2556
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[VAL]], [[P2]]
2557
+ ; CHECK-NEXT: ret i32 [[AND]]
2558
+ ;
2559
+ %ny = sub i32 0 , %y
2560
+ %p2 = and i32 %y , %ny
2561
+ call void @use32 (i32 %p2 ) ; keep p2
2562
+
2563
+ %val = add i32 %x , %p2
2564
+ %and = and i32 %val , %p2
2565
+ ret i32 %and
2566
+ }
2567
+
2568
+ define i32 @canonicalize_and_sub_power2_or_zero (i32 %x , i32 %y ) {
2569
+ ; CHECK-LABEL: @canonicalize_and_sub_power2_or_zero(
2570
+ ; CHECK-NEXT: [[NY:%.*]] = sub i32 0, [[Y:%.*]]
2571
+ ; CHECK-NEXT: [[P2:%.*]] = and i32 [[NY]], [[Y]]
2572
+ ; CHECK-NEXT: call void @use32(i32 [[P2]])
2573
+ ; CHECK-NEXT: [[VAL:%.*]] = sub i32 [[X:%.*]], [[P2]]
2574
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[VAL]], [[P2]]
2575
+ ; CHECK-NEXT: ret i32 [[AND]]
2576
+ ;
2577
+ %ny = sub i32 0 , %y
2578
+ %p2 = and i32 %y , %ny
2579
+ call void @use32 (i32 %p2 ) ; keep p2
2580
+
2581
+ %val = sub i32 %x , %p2
2582
+ %and = and i32 %val , %p2
2583
+ ret i32 %and
2584
+ }
0 commit comments