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