[llvm] b9edf6d - [InstCombine] Add additional pre-commit tests for #67915. NFC.

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 6 05:41:14 PDT 2023


Author: Yingwei Zheng
Date: 2023-10-06T20:39:23+08:00
New Revision: b9edf6d4ba7b698238b736d72e544c587285f5f6

URL: https://github.com/llvm/llvm-project/commit/b9edf6d4ba7b698238b736d72e544c587285f5f6
DIFF: https://github.com/llvm/llvm-project/commit/b9edf6d4ba7b698238b736d72e544c587285f5f6.diff

LOG: [InstCombine] Add additional pre-commit tests for #67915. NFC.

Added: 
    

Modified: 
    llvm/test/Transforms/InstCombine/and.ll

Removed: 
    


################################################################################
diff  --git a/llvm/test/Transforms/InstCombine/and.ll b/llvm/test/Transforms/InstCombine/and.ll
index 528a4e62c192d0e..48e21a581b7d329 100644
--- a/llvm/test/Transforms/InstCombine/and.ll
+++ b/llvm/test/Transforms/InstCombine/and.ll
@@ -2552,15 +2552,17 @@ define i32 @canonicalize_and_add_power2_or_zero(i32 %x, i32 %y) {
 ; CHECK-NEXT:    [[NY:%.*]] = sub i32 0, [[Y:%.*]]
 ; CHECK-NEXT:    [[P2:%.*]] = and i32 [[NY]], [[Y]]
 ; CHECK-NEXT:    call void @use32(i32 [[P2]])
-; CHECK-NEXT:    [[VAL:%.*]] = add i32 [[P2]], [[X:%.*]]
+; CHECK-NEXT:    [[X2:%.*]] = mul i32 [[X:%.*]], [[X]]
+; CHECK-NEXT:    [[VAL:%.*]] = add i32 [[X2]], [[P2]]
 ; CHECK-NEXT:    [[AND:%.*]] = and i32 [[VAL]], [[P2]]
 ; CHECK-NEXT:    ret i32 [[AND]]
 ;
   %ny = sub i32 0, %y
-  %p2 = and i32 %y, %ny
+  %p2 = and i32 %ny, %y
   call void @use32(i32 %p2) ; keep p2
 
-  %val = add i32 %x, %p2
+  %x2 = mul i32 %x, %x ; thwart complexity-based canonicalization
+  %val = add i32 %x2, %p2
   %and = and i32 %val, %p2
   ret i32 %and
 }
@@ -2575,10 +2577,137 @@ define i32 @canonicalize_and_sub_power2_or_zero(i32 %x, i32 %y) {
 ; CHECK-NEXT:    ret i32 [[AND]]
 ;
   %ny = sub i32 0, %y
-  %p2 = and i32 %y, %ny
+  %p2 = and i32 %ny, %y
+  call void @use32(i32 %p2) ; keep p2
+
+  %val = sub i32 %x, %p2
+  %and = and i32 %val, %p2
+  ret i32 %and
+}
+
+define i32 @canonicalize_and_add_power2_or_zero_commuted1(i32 %x, i32 %y) {
+; CHECK-LABEL: @canonicalize_and_add_power2_or_zero_commuted1(
+; CHECK-NEXT:    [[NY:%.*]] = sub i32 0, [[Y:%.*]]
+; CHECK-NEXT:    [[P2:%.*]] = and i32 [[NY]], [[Y]]
+; CHECK-NEXT:    call void @use32(i32 [[P2]])
+; CHECK-NEXT:    [[VAL:%.*]] = add i32 [[P2]], [[X:%.*]]
+; CHECK-NEXT:    [[AND:%.*]] = and i32 [[VAL]], [[P2]]
+; CHECK-NEXT:    ret i32 [[AND]]
+;
+  %ny = sub i32 0, %y
+  %p2 = and i32 %ny, %y
+  call void @use32(i32 %p2) ; keep p2
+
+  %val = add i32 %p2, %x
+  %and = and i32 %val, %p2
+  ret i32 %and
+}
+
+define i32 @canonicalize_and_add_power2_or_zero_commuted2(i32 %x, i32 %y) {
+; CHECK-LABEL: @canonicalize_and_add_power2_or_zero_commuted2(
+; CHECK-NEXT:    [[NY:%.*]] = sub i32 0, [[Y:%.*]]
+; CHECK-NEXT:    [[P2:%.*]] = and i32 [[NY]], [[Y]]
+; CHECK-NEXT:    call void @use32(i32 [[P2]])
+; CHECK-NEXT:    [[X2:%.*]] = mul i32 [[X:%.*]], [[X]]
+; CHECK-NEXT:    [[VAL:%.*]] = add i32 [[X2]], [[P2]]
+; CHECK-NEXT:    [[AND:%.*]] = and i32 [[P2]], [[VAL]]
+; CHECK-NEXT:    ret i32 [[AND]]
+;
+  %ny = sub i32 0, %y
+  %p2 = and i32 %ny, %y
+  call void @use32(i32 %p2) ; keep p2
+
+  %x2 = mul i32 %x, %x ; thwart complexity-based canonicalization
+  %val = add i32 %x2, %p2
+  %and = and i32 %p2, %val
+  ret i32 %and
+}
+
+define i32 @canonicalize_and_add_power2_or_zero_commuted3(i32 %x, i32 %y) {
+; CHECK-LABEL: @canonicalize_and_add_power2_or_zero_commuted3(
+; CHECK-NEXT:    [[NY:%.*]] = sub i32 0, [[Y:%.*]]
+; CHECK-NEXT:    [[P2:%.*]] = and i32 [[NY]], [[Y]]
+; CHECK-NEXT:    call void @use32(i32 [[P2]])
+; CHECK-NEXT:    [[VAL:%.*]] = add i32 [[P2]], [[X:%.*]]
+; CHECK-NEXT:    [[AND:%.*]] = and i32 [[P2]], [[VAL]]
+; CHECK-NEXT:    ret i32 [[AND]]
+;
+  %ny = sub i32 0, %y
+  %p2 = and i32 %ny, %y
+  call void @use32(i32 %p2) ; keep p2
+
+  %val = add i32 %p2, %x
+  %and = and i32 %p2, %val
+  ret i32 %and
+}
+
+define i32 @canonicalize_and_sub_power2_or_zero_commuted_nofold(i32 %x, i32 %y) {
+; CHECK-LABEL: @canonicalize_and_sub_power2_or_zero_commuted_nofold(
+; CHECK-NEXT:    [[NY:%.*]] = sub i32 0, [[Y:%.*]]
+; CHECK-NEXT:    [[P2:%.*]] = and i32 [[NY]], [[Y]]
+; CHECK-NEXT:    call void @use32(i32 [[P2]])
+; CHECK-NEXT:    [[VAL:%.*]] = sub i32 [[P2]], [[X:%.*]]
+; CHECK-NEXT:    [[AND:%.*]] = and i32 [[VAL]], [[P2]]
+; CHECK-NEXT:    ret i32 [[AND]]
+;
+  %ny = sub i32 0, %y
+  %p2 = and i32 %ny, %y
+  call void @use32(i32 %p2) ; keep p2
+
+  %val = sub i32 %p2, %x
+  %and = and i32 %val, %p2
+  ret i32 %and
+}
+
+define i32 @canonicalize_and_add_non_power2_or_zero_nofold(i32 %x, i32 %y) {
+; CHECK-LABEL: @canonicalize_and_add_non_power2_or_zero_nofold(
+; CHECK-NEXT:    [[VAL:%.*]] = add i32 [[X:%.*]], [[Y:%.*]]
+; CHECK-NEXT:    [[AND:%.*]] = and i32 [[VAL]], [[Y]]
+; CHECK-NEXT:    ret i32 [[AND]]
+;
+  %val = add i32 %x, %y
+  %and = and i32 %val, %y
+  ret i32 %and
+}
+
+define i32 @canonicalize_and_add_power2_or_zero_multiuse_nofold(i32 %x, i32 %y) {
+; CHECK-LABEL: @canonicalize_and_add_power2_or_zero_multiuse_nofold(
+; CHECK-NEXT:    [[NY:%.*]] = sub i32 0, [[Y:%.*]]
+; CHECK-NEXT:    [[P2:%.*]] = and i32 [[NY]], [[Y]]
+; CHECK-NEXT:    call void @use32(i32 [[P2]])
+; CHECK-NEXT:    [[X2:%.*]] = mul i32 [[X:%.*]], [[X]]
+; CHECK-NEXT:    [[VAL:%.*]] = add i32 [[X2]], [[P2]]
+; CHECK-NEXT:    call void @use32(i32 [[VAL]])
+; CHECK-NEXT:    [[AND:%.*]] = and i32 [[VAL]], [[P2]]
+; CHECK-NEXT:    ret i32 [[AND]]
+;
+  %ny = sub i32 0, %y
+  %p2 = and i32 %ny, %y
+  call void @use32(i32 %p2) ; keep p2
+
+  %x2 = mul i32 %x, %x ; thwart complexity-based canonicalization
+  %val = add i32 %x2, %p2
+  call void @use32(i32 %val)
+  %and = and i32 %val, %p2
+  ret i32 %and
+}
+
+define i32 @canonicalize_and_sub_power2_or_zero_multiuse_nofold(i32 %x, i32 %y) {
+; CHECK-LABEL: @canonicalize_and_sub_power2_or_zero_multiuse_nofold(
+; CHECK-NEXT:    [[NY:%.*]] = sub i32 0, [[Y:%.*]]
+; CHECK-NEXT:    [[P2:%.*]] = and i32 [[NY]], [[Y]]
+; CHECK-NEXT:    call void @use32(i32 [[P2]])
+; CHECK-NEXT:    [[VAL:%.*]] = sub i32 [[X:%.*]], [[P2]]
+; CHECK-NEXT:    call void @use32(i32 [[VAL]])
+; CHECK-NEXT:    [[AND:%.*]] = and i32 [[VAL]], [[P2]]
+; CHECK-NEXT:    ret i32 [[AND]]
+;
+  %ny = sub i32 0, %y
+  %p2 = and i32 %ny, %y
   call void @use32(i32 %p2) ; keep p2
 
   %val = sub i32 %x, %p2
+  call void @use32(i32 %val)
   %and = and i32 %val, %p2
   ret i32 %and
 }


        


More information about the llvm-commits mailing list