@@ -2552,15 +2552,17 @@ define i32 @canonicalize_and_add_power2_or_zero(i32 %x, i32 %y) {
2552
2552
; CHECK-NEXT: [[NY:%.*]] = sub i32 0, [[Y:%.*]]
2553
2553
; CHECK-NEXT: [[P2:%.*]] = and i32 [[NY]], [[Y]]
2554
2554
; CHECK-NEXT: call void @use32(i32 [[P2]])
2555
- ; CHECK-NEXT: [[VAL:%.*]] = add i32 [[P2]], [[X:%.*]]
2555
+ ; CHECK-NEXT: [[X2:%.*]] = mul i32 [[X:%.*]], [[X]]
2556
+ ; CHECK-NEXT: [[VAL:%.*]] = add i32 [[X2]], [[P2]]
2556
2557
; CHECK-NEXT: [[AND:%.*]] = and i32 [[VAL]], [[P2]]
2557
2558
; CHECK-NEXT: ret i32 [[AND]]
2558
2559
;
2559
2560
%ny = sub i32 0 , %y
2560
- %p2 = and i32 %y , %ny
2561
+ %p2 = and i32 %ny , %y
2561
2562
call void @use32 (i32 %p2 ) ; keep p2
2562
2563
2563
- %val = add i32 %x , %p2
2564
+ %x2 = mul i32 %x , %x ; thwart complexity-based canonicalization
2565
+ %val = add i32 %x2 , %p2
2564
2566
%and = and i32 %val , %p2
2565
2567
ret i32 %and
2566
2568
}
@@ -2575,10 +2577,137 @@ define i32 @canonicalize_and_sub_power2_or_zero(i32 %x, i32 %y) {
2575
2577
; CHECK-NEXT: ret i32 [[AND]]
2576
2578
;
2577
2579
%ny = sub i32 0 , %y
2578
- %p2 = and i32 %y , %ny
2580
+ %p2 = and i32 %ny , %y
2581
+ call void @use32 (i32 %p2 ) ; keep p2
2582
+
2583
+ %val = sub i32 %x , %p2
2584
+ %and = and i32 %val , %p2
2585
+ ret i32 %and
2586
+ }
2587
+
2588
+ define i32 @canonicalize_and_add_power2_or_zero_commuted1 (i32 %x , i32 %y ) {
2589
+ ; CHECK-LABEL: @canonicalize_and_add_power2_or_zero_commuted1(
2590
+ ; CHECK-NEXT: [[NY:%.*]] = sub i32 0, [[Y:%.*]]
2591
+ ; CHECK-NEXT: [[P2:%.*]] = and i32 [[NY]], [[Y]]
2592
+ ; CHECK-NEXT: call void @use32(i32 [[P2]])
2593
+ ; CHECK-NEXT: [[VAL:%.*]] = add i32 [[P2]], [[X:%.*]]
2594
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[VAL]], [[P2]]
2595
+ ; CHECK-NEXT: ret i32 [[AND]]
2596
+ ;
2597
+ %ny = sub i32 0 , %y
2598
+ %p2 = and i32 %ny , %y
2599
+ call void @use32 (i32 %p2 ) ; keep p2
2600
+
2601
+ %val = add i32 %p2 , %x
2602
+ %and = and i32 %val , %p2
2603
+ ret i32 %and
2604
+ }
2605
+
2606
+ define i32 @canonicalize_and_add_power2_or_zero_commuted2 (i32 %x , i32 %y ) {
2607
+ ; CHECK-LABEL: @canonicalize_and_add_power2_or_zero_commuted2(
2608
+ ; CHECK-NEXT: [[NY:%.*]] = sub i32 0, [[Y:%.*]]
2609
+ ; CHECK-NEXT: [[P2:%.*]] = and i32 [[NY]], [[Y]]
2610
+ ; CHECK-NEXT: call void @use32(i32 [[P2]])
2611
+ ; CHECK-NEXT: [[X2:%.*]] = mul i32 [[X:%.*]], [[X]]
2612
+ ; CHECK-NEXT: [[VAL:%.*]] = add i32 [[X2]], [[P2]]
2613
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[P2]], [[VAL]]
2614
+ ; CHECK-NEXT: ret i32 [[AND]]
2615
+ ;
2616
+ %ny = sub i32 0 , %y
2617
+ %p2 = and i32 %ny , %y
2618
+ call void @use32 (i32 %p2 ) ; keep p2
2619
+
2620
+ %x2 = mul i32 %x , %x ; thwart complexity-based canonicalization
2621
+ %val = add i32 %x2 , %p2
2622
+ %and = and i32 %p2 , %val
2623
+ ret i32 %and
2624
+ }
2625
+
2626
+ define i32 @canonicalize_and_add_power2_or_zero_commuted3 (i32 %x , i32 %y ) {
2627
+ ; CHECK-LABEL: @canonicalize_and_add_power2_or_zero_commuted3(
2628
+ ; CHECK-NEXT: [[NY:%.*]] = sub i32 0, [[Y:%.*]]
2629
+ ; CHECK-NEXT: [[P2:%.*]] = and i32 [[NY]], [[Y]]
2630
+ ; CHECK-NEXT: call void @use32(i32 [[P2]])
2631
+ ; CHECK-NEXT: [[VAL:%.*]] = add i32 [[P2]], [[X:%.*]]
2632
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[P2]], [[VAL]]
2633
+ ; CHECK-NEXT: ret i32 [[AND]]
2634
+ ;
2635
+ %ny = sub i32 0 , %y
2636
+ %p2 = and i32 %ny , %y
2637
+ call void @use32 (i32 %p2 ) ; keep p2
2638
+
2639
+ %val = add i32 %p2 , %x
2640
+ %and = and i32 %p2 , %val
2641
+ ret i32 %and
2642
+ }
2643
+
2644
+ define i32 @canonicalize_and_sub_power2_or_zero_commuted_nofold (i32 %x , i32 %y ) {
2645
+ ; CHECK-LABEL: @canonicalize_and_sub_power2_or_zero_commuted_nofold(
2646
+ ; CHECK-NEXT: [[NY:%.*]] = sub i32 0, [[Y:%.*]]
2647
+ ; CHECK-NEXT: [[P2:%.*]] = and i32 [[NY]], [[Y]]
2648
+ ; CHECK-NEXT: call void @use32(i32 [[P2]])
2649
+ ; CHECK-NEXT: [[VAL:%.*]] = sub i32 [[P2]], [[X:%.*]]
2650
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[VAL]], [[P2]]
2651
+ ; CHECK-NEXT: ret i32 [[AND]]
2652
+ ;
2653
+ %ny = sub i32 0 , %y
2654
+ %p2 = and i32 %ny , %y
2655
+ call void @use32 (i32 %p2 ) ; keep p2
2656
+
2657
+ %val = sub i32 %p2 , %x
2658
+ %and = and i32 %val , %p2
2659
+ ret i32 %and
2660
+ }
2661
+
2662
+ define i32 @canonicalize_and_add_non_power2_or_zero_nofold (i32 %x , i32 %y ) {
2663
+ ; CHECK-LABEL: @canonicalize_and_add_non_power2_or_zero_nofold(
2664
+ ; CHECK-NEXT: [[VAL:%.*]] = add i32 [[X:%.*]], [[Y:%.*]]
2665
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[VAL]], [[Y]]
2666
+ ; CHECK-NEXT: ret i32 [[AND]]
2667
+ ;
2668
+ %val = add i32 %x , %y
2669
+ %and = and i32 %val , %y
2670
+ ret i32 %and
2671
+ }
2672
+
2673
+ define i32 @canonicalize_and_add_power2_or_zero_multiuse_nofold (i32 %x , i32 %y ) {
2674
+ ; CHECK-LABEL: @canonicalize_and_add_power2_or_zero_multiuse_nofold(
2675
+ ; CHECK-NEXT: [[NY:%.*]] = sub i32 0, [[Y:%.*]]
2676
+ ; CHECK-NEXT: [[P2:%.*]] = and i32 [[NY]], [[Y]]
2677
+ ; CHECK-NEXT: call void @use32(i32 [[P2]])
2678
+ ; CHECK-NEXT: [[X2:%.*]] = mul i32 [[X:%.*]], [[X]]
2679
+ ; CHECK-NEXT: [[VAL:%.*]] = add i32 [[X2]], [[P2]]
2680
+ ; CHECK-NEXT: call void @use32(i32 [[VAL]])
2681
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[VAL]], [[P2]]
2682
+ ; CHECK-NEXT: ret i32 [[AND]]
2683
+ ;
2684
+ %ny = sub i32 0 , %y
2685
+ %p2 = and i32 %ny , %y
2686
+ call void @use32 (i32 %p2 ) ; keep p2
2687
+
2688
+ %x2 = mul i32 %x , %x ; thwart complexity-based canonicalization
2689
+ %val = add i32 %x2 , %p2
2690
+ call void @use32 (i32 %val )
2691
+ %and = and i32 %val , %p2
2692
+ ret i32 %and
2693
+ }
2694
+
2695
+ define i32 @canonicalize_and_sub_power2_or_zero_multiuse_nofold (i32 %x , i32 %y ) {
2696
+ ; CHECK-LABEL: @canonicalize_and_sub_power2_or_zero_multiuse_nofold(
2697
+ ; CHECK-NEXT: [[NY:%.*]] = sub i32 0, [[Y:%.*]]
2698
+ ; CHECK-NEXT: [[P2:%.*]] = and i32 [[NY]], [[Y]]
2699
+ ; CHECK-NEXT: call void @use32(i32 [[P2]])
2700
+ ; CHECK-NEXT: [[VAL:%.*]] = sub i32 [[X:%.*]], [[P2]]
2701
+ ; CHECK-NEXT: call void @use32(i32 [[VAL]])
2702
+ ; CHECK-NEXT: [[AND:%.*]] = and i32 [[VAL]], [[P2]]
2703
+ ; CHECK-NEXT: ret i32 [[AND]]
2704
+ ;
2705
+ %ny = sub i32 0 , %y
2706
+ %p2 = and i32 %ny , %y
2579
2707
call void @use32 (i32 %p2 ) ; keep p2
2580
2708
2581
2709
%val = sub i32 %x , %p2
2710
+ call void @use32 (i32 %val )
2582
2711
%and = and i32 %val , %p2
2583
2712
ret i32 %and
2584
2713
}
0 commit comments