Skip to content

Commit b9edf6d

Browse files
committed
[InstCombine] Add additional pre-commit tests for #67915. NFC.
1 parent 32a9c09 commit b9edf6d

File tree

1 file changed

+133
-4
lines changed
  • llvm/test/Transforms/InstCombine

1 file changed

+133
-4
lines changed

llvm/test/Transforms/InstCombine/and.ll

Lines changed: 133 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2552,15 +2552,17 @@ define i32 @canonicalize_and_add_power2_or_zero(i32 %x, i32 %y) {
25522552
; CHECK-NEXT: [[NY:%.*]] = sub i32 0, [[Y:%.*]]
25532553
; CHECK-NEXT: [[P2:%.*]] = and i32 [[NY]], [[Y]]
25542554
; 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]]
25562557
; CHECK-NEXT: [[AND:%.*]] = and i32 [[VAL]], [[P2]]
25572558
; CHECK-NEXT: ret i32 [[AND]]
25582559
;
25592560
%ny = sub i32 0, %y
2560-
%p2 = and i32 %y, %ny
2561+
%p2 = and i32 %ny, %y
25612562
call void @use32(i32 %p2) ; keep p2
25622563

2563-
%val = add i32 %x, %p2
2564+
%x2 = mul i32 %x, %x ; thwart complexity-based canonicalization
2565+
%val = add i32 %x2, %p2
25642566
%and = and i32 %val, %p2
25652567
ret i32 %and
25662568
}
@@ -2575,10 +2577,137 @@ define i32 @canonicalize_and_sub_power2_or_zero(i32 %x, i32 %y) {
25752577
; CHECK-NEXT: ret i32 [[AND]]
25762578
;
25772579
%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
25792707
call void @use32(i32 %p2) ; keep p2
25802708

25812709
%val = sub i32 %x, %p2
2710+
call void @use32(i32 %val)
25822711
%and = and i32 %val, %p2
25832712
ret i32 %and
25842713
}

0 commit comments

Comments
 (0)