Author: lattner
Date: Sun Jan 13 14:59:02 2008
New Revision: 45937

URL: http://llvm.org/viewvc/llvm-project?rev=45937&view=rev
Log:
Fix PR1907, a nasty miscompilation because instcombine didn't
realize that ne & sgt  was a signed comparison (it was only 
looking at whether the left compare was signed).

Added:
    llvm/trunk/test/Transforms/InstCombine/2008-01-13-AndCmpCmp.ll
Modified:
    llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp

Modified: llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp?rev=45937&r1=45936&r2=45937&view=diff

==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/InstructionCombining.cpp Sun Jan 13 
14:59:02 2008
@@ -3495,8 +3495,14 @@
              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()) {

Added: llvm/trunk/test/Transforms/InstCombine/2008-01-13-AndCmpCmp.ll
URL: 
http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/2008-01-13-AndCmpCmp.ll?rev=45937&view=auto

==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/2008-01-13-AndCmpCmp.ll (added)
+++ llvm/trunk/test/Transforms/InstCombine/2008-01-13-AndCmpCmp.ll Sun Jan 13 
14:59:02 2008
@@ -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
+}


_______________________________________________
llvm-commits mailing list
llvm-commits@cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits

Reply via email to