mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-17 21:29:20 +00:00
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:
parent
1fac17f2e7
commit
ee2b7a4530
@ -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()) {
|
||||
|
9
test/Transforms/InstCombine/2008-01-13-AndCmpCmp.ll
Normal file
9
test/Transforms/InstCombine/2008-01-13-AndCmpCmp.ll
Normal 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
|
||||
}
|
Loading…
Reference in New Issue
Block a user