Fix PR1907, a nasty miscompilation because instcombine didn't
authorChris Lattner <sabre@nondot.org>
Sun, 13 Jan 2008 20:59:02 +0000 (20:59 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 13 Jan 2008 20:59:02 +0000 (20:59 +0000)
realize that ne & sgt  was a signed comparison (it was only
looking at whether the left compare was signed).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45937 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp
test/Transforms/InstCombine/2008-01-13-AndCmpCmp.ll [new file with mode: 0644]

index ea53aec76cb254155d61e417126476c5bd96f9e5..9465a31d29d2639c1c755891b3e30a88282ef8c1 100644 (file)
@@ -3495,8 +3495,14 @@ Instruction *InstCombiner::visitAnd(BinaryOperator &I) {
              ICmpInst::isSignedPredicate(LHSCC) == 
                  ICmpInst::isSignedPredicate(RHSCC))) {
           // Ensure that the larger constant is on the RHS.
-          ICmpInst::Predicate GT = ICmpInst::isSignedPredicate(LHSCC) ? 
-            ICmpInst::ICMP_SGT : ICmpInst::ICMP_UGT;
+          ICmpInst::Predicate GT;
+          if (ICmpInst::isSignedPredicate(LHSCC) ||
+              (ICmpInst::isEquality(LHSCC) && 
+               ICmpInst::isSignedPredicate(RHSCC)))
+            GT = ICmpInst::ICMP_SGT;
+          else
+            GT = ICmpInst::ICMP_UGT;
+          
           Constant *Cmp = ConstantExpr::getICmp(GT, LHSCst, RHSCst);
           ICmpInst *LHS = cast<ICmpInst>(Op0);
           if (cast<ConstantInt>(Cmp)->getZExtValue()) {
diff --git a/test/Transforms/InstCombine/2008-01-13-AndCmpCmp.ll b/test/Transforms/InstCombine/2008-01-13-AndCmpCmp.ll
new file mode 100644 (file)
index 0000000..71d5bf7
--- /dev/null
@@ -0,0 +1,9 @@
+; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep and
+; PR1907
+
+define i1 @test(i32 %c84.17) {
+       %tmp2696 = icmp ne i32 %c84.17, 34              ; <i1> [#uses=2]
+       %tmp2699 = icmp sgt i32 %c84.17, -1             ; <i1> [#uses=1]
+       %tmp2703 = and i1 %tmp2696, %tmp2699            ; <i1> [#uses=1]
+       ret i1 %tmp2703
+}