[PATCH] D128790: [InstCombine] improve fold for icmp_eq_and to icmp_ult

Chenbing.Zheng via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 30 23:16:31 PDT 2022


Chenbing.Zheng updated this revision to Diff 441600.
Chenbing.Zheng added a comment.

update tests


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D128790/new/

https://reviews.llvm.org/D128790

Files:
  llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
  llvm/test/Transforms/InstCombine/lshr-and-negC-icmpeq-zero.ll


Index: llvm/test/Transforms/InstCombine/lshr-and-negC-icmpeq-zero.ll
===================================================================
--- llvm/test/Transforms/InstCombine/lshr-and-negC-icmpeq-zero.ll
+++ llvm/test/Transforms/InstCombine/lshr-and-negC-icmpeq-zero.ll
@@ -177,15 +177,10 @@
   ret i1 %r
 }
 
-; Negative tests
-
-; TODO: This could be reduced to lshr+icmp ult.
-
 define i1 @scalar_i32_lshr_and_negC_eq_X_is_constant1(i32 %y) {
 ; CHECK-LABEL: @scalar_i32_lshr_and_negC_eq_X_is_constant1(
 ; CHECK-NEXT:    [[LSHR:%.*]] = lshr i32 12345, [[Y:%.*]]
-; CHECK-NEXT:    [[AND:%.*]] = and i32 [[LSHR]], 16376
-; CHECK-NEXT:    [[R:%.*]] = icmp eq i32 [[AND]], 0
+; CHECK-NEXT:    [[R:%.*]] = icmp ult i32 [[LSHR]], 8
 ; CHECK-NEXT:    ret i1 [[R]]
 ;
   %lshr = lshr i32 12345, %y
@@ -194,13 +189,9 @@
   ret i1 %r
 }
 
-; TODO: This could be reduced to lshr+icmp ult.
-
 define i1 @scalar_i32_lshr_and_negC_eq_X_is_constant2(i32 %y) {
 ; CHECK-LABEL: @scalar_i32_lshr_and_negC_eq_X_is_constant2(
-; CHECK-NEXT:    [[LSHR:%.*]] = lshr i32 268435456, [[Y:%.*]]
-; CHECK-NEXT:    [[AND:%.*]] = and i32 [[LSHR]], 536870904
-; CHECK-NEXT:    [[R:%.*]] = icmp eq i32 [[AND]], 0
+; CHECK-NEXT:    [[R:%.*]] = icmp ugt i32 [[Y:%.*]], 25
 ; CHECK-NEXT:    ret i1 [[R]]
 ;
   %lshr = lshr i32 268435456, %y
@@ -209,6 +200,18 @@
   ret i1 %r
 }
 
+define i1 @scalar_i32_lshr_and_negC_eq_X_is_constant3(i32 %y) {
+; CHECK-LABEL: @scalar_i32_lshr_and_negC_eq_X_is_constant3(
+; CHECK-NEXT:    [[LSHR:%.*]] = lshr i32 12345, [[Y:%.*]]
+; CHECK-NEXT:    [[R:%.*]] = icmp ult i32 [[LSHR]], 8
+; CHECK-NEXT:    ret i1 [[R]]
+;
+  %lshr = lshr i32 12345, %y
+  %and = and i32 %lshr, 16376    ; 0x3ff8
+  %r = icmp eq i32 %and, 0
+  ret i1 %r
+}
+
 ; Check 'slt' predicate
 
 define i1 @scalar_i32_lshr_and_negC_slt(i32 %x, i32 %y) {
Index: llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
===================================================================
--- llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ llvm/lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -1775,11 +1775,16 @@
       return new ICmpInst(NewPred, X, Zero);
     }
 
+    APInt NewC2 = *C2;
+    KnownBits Know = computeKnownBits(And->getOperand(0), 0, And);
+    // Set high zero of C2, that is friendly to the folding later.
+    NewC2 = *C2 + APInt::getHighBitsSet(C2->getBitWidth(),
+                                        Know.countMinLeadingZeros());
+
     // Restrict this fold only for single-use 'and' (PR10267).
     // ((%x & C) == 0) --> %x u< (-C)  iff (-C) is power of two.
-    if ((~(*C2) + 1).isPowerOf2()) {
-      Constant *NegBOC =
-          ConstantExpr::getNeg(cast<Constant>(And->getOperand(1)));
+    if ((~(NewC2) + 1).isPowerOf2()) {
+      Constant *NegBOC = ConstantInt::get(And->getType(), -NewC2);
       auto NewPred = isICMP_NE ? ICmpInst::ICMP_UGE : ICmpInst::ICMP_ULT;
       return new ICmpInst(NewPred, X, NegBOC);
     }


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D128790.441600.patch
Type: text/x-patch
Size: 2952 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220701/9558353c/attachment.bin>


More information about the llvm-commits mailing list