[PATCH] Patch for PR19753 InstCombine: constant comparison involving "ashr exact" not optimized well

suyog suyog.sarda at samsung.com
Thu May 29 08:27:03 PDT 2014


Hi bkramer, majnemer, rafael,

This patch implements missed optimization stated in PR19753
This will work for 'ashr exact' only for now in the 'instcombine' pass.

Test Case :

define i1 @exact_ashr_eq_false(i32 %a) {
  %shr = ashr exact i32 -30, %a
  %cmp = icmp eq i32 %shr, -15
  ret i1 %cmp
}

Result after applying patch :

define i1 @exact_ashr_eq_false(i32 %a) {
  %cmp = icmp eq i32 %a, 1
  ret i1 %cmp
}

It calculates the quotient of division of the 2 constants and takes log2, and then puts this value for comparison in icmp instruction.

Added the test case given in the bug report.

Please help in reviewing the patch.

http://reviews.llvm.org/D3959

Files:
  lib/Transforms/InstCombine/InstCombineCompares.cpp
  test/Transforms/InstCombine/icmp.ll

Index: lib/Transforms/InstCombine/InstCombineCompares.cpp
===================================================================
--- lib/Transforms/InstCombine/InstCombineCompares.cpp
+++ lib/Transforms/InstCombine/InstCombineCompares.cpp
@@ -2439,6 +2439,20 @@
       return new ICmpInst(I.getPredicate(), A, B);
     }
 
+    // PR19753:
+    // (icmp (ashr exact const1, A), const2) -> icmp A, Log2(const1/const2)
+    {
+      ConstantInt *CI2;
+      Value *V;
+      if (match(Op0, m_AShr(m_ConstantInt(CI2), m_Value(V))) &&
+          (cast<BinaryOperator>(Op0)->isExact())) {
+        APInt Quotient = CI2->getValue().sdiv(CI->getValue());
+        unsigned shift = Quotient.logBase2();
+        return new ICmpInst(I.getPredicate(), V,
+                            ConstantInt::get(V->getType(), shift));
+      }
+    }
+
     // If we have an icmp le or icmp ge instruction, turn it into the
     // appropriate icmp lt or icmp gt instruction.  This allows us to rely on
     // them being folded in the code below.  The SimplifyICmpInst code has
Index: test/Transforms/InstCombine/icmp.ll
===================================================================
--- test/Transforms/InstCombine/icmp.ll
+++ test/Transforms/InstCombine/icmp.ll
@@ -1365,3 +1365,11 @@
   %2 = icmp slt i32 %1, -10
   ret i1 %2
 }
+
+; CHECK-LABEL: @exact_ashr_eq_false
+; CHECK-NEXT: icmp eq i32 %a, 1
+define i1 @exact_ashr_eq_false(i32 %a) {
+  %shr = ashr exact i32 -30, %a
+  %cmp = icmp eq i32 %shr, -15
+  ret i1 %cmp
+}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D3959.9922.patch
Type: text/x-patch
Size: 1511 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140529/fec60a2f/attachment.bin>


More information about the llvm-commits mailing list