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).


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45937 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2008-01-13 20:59:02 +00:00
parent 1fac17f2e7
commit ee2b7a4530
2 changed files with 17 additions and 2 deletions

View 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()) {

View File

@ -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
}