[PATCH] InstCombineCompare with constant return false if we know it is never going to be equal

suyog suyog.sarda at samsung.com
Wed Jun 18 03:57:09 PDT 2014


Hi Nick,

updated patch as per your review.
1) Included check ICmpInst::isEquality(Pred) before the rest.
2) Moved the code lower down as per suggestion.

I think its fine to commit the change to test/Transforms/InstCombine/align-2d-gep.ll as 
part of this patch only.

I dont have commit access, so please if you could commit it for me.
Meanwhile I will add test cases to the other two refactoring patches and get
back shortly.


Thanks,
Suyog

http://reviews.llvm.org/D3868

Files:
  lib/Analysis/InstructionSimplify.cpp
  test/Transforms/InstCombine/align-2d-gep.ll
  test/Transforms/InstSimplify/compare.ll

Index: test/Transforms/InstSimplify/compare.ll
===================================================================
--- test/Transforms/InstSimplify/compare.ll
+++ test/Transforms/InstSimplify/compare.ll
@@ -883,3 +883,22 @@
 ; CHECK: ret i1 false
 }
 
+; If a bit is known to be zero for A and known to be one for B,
+; then A and B cannot be equal.
+define i1 @icmp_eq_const(i32 %a) nounwind {
+  %b = mul nsw i32 %a, -2
+  %c = icmp eq i32 %b, 1
+  ret i1 %c
+
+; CHECK-LABEL: @icmp_eq_const
+; CHECK-NEXT: ret i1 false 
+}
+
+define i1 @icmp_ne_const(i32 %a) nounwind {
+  %b = mul nsw i32 %a, -2
+  %c = icmp ne i32 %b, 1
+  ret i1 %c
+
+; CHECK-LABEL: @icmp_ne_const
+; CHECK-NEXT: ret i1 true
+}
Index: test/Transforms/InstCombine/align-2d-gep.ll
===================================================================
--- test/Transforms/InstCombine/align-2d-gep.ll
+++ test/Transforms/InstCombine/align-2d-gep.ll
@@ -31,7 +31,7 @@
   store <2 x double><double 0.0, double 0.0>, <2 x double>* %r, align 8
 
   %indvar.next = add i64 %j, 2
-  %exitcond = icmp eq i64 %indvar.next, 557
+  %exitcond = icmp eq i64 %indvar.next, 556
   br i1 %exitcond, label %bb11, label %bb1
 
 bb11:
Index: lib/Analysis/InstructionSimplify.cpp
===================================================================
--- lib/Analysis/InstructionSimplify.cpp
+++ lib/Analysis/InstructionSimplify.cpp
@@ -2241,6 +2241,25 @@
     }
   }
 
+  // If a bit is known to be zero for A and known to be one for B,
+  // then A and B cannot be equal.
+  if (ICmpInst::isEquality(Pred)) {
+    if (ConstantInt *CI = dyn_cast<ConstantInt>(RHS)) {
+      uint32_t BitWidth = CI->getBitWidth();
+      APInt LHSKnownZero(BitWidth, 0);
+      APInt LHSKnownOne(BitWidth, 0);
+      computeKnownBits(LHS, LHSKnownZero, LHSKnownOne);
+      APInt RHSKnownZero(BitWidth, 0);
+      APInt RHSKnownOne(BitWidth, 0);
+      computeKnownBits(RHS, RHSKnownZero, RHSKnownOne);
+      if (((LHSKnownOne & RHSKnownZero) != 0) ||
+          ((LHSKnownZero & RHSKnownOne) != 0))
+        return (Pred == ICmpInst::ICMP_EQ)
+                   ? ConstantInt::getFalse(CI->getContext())
+                   : ConstantInt::getTrue(CI->getContext());
+    }
+  }
+
   // Special logic for binary operators.
   BinaryOperator *LBO = dyn_cast<BinaryOperator>(LHS);
   BinaryOperator *RBO = dyn_cast<BinaryOperator>(RHS);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D3868.10547.patch
Type: text/x-patch
Size: 2366 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140618/fae843ff/attachment.bin>


More information about the llvm-commits mailing list