mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-27 14:34:58 +00:00
InstCombine: Fold A-b == C --> b == A-C if A and C are constants.
The backend already knew this trick. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@132915 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
aa99bea46f
commit
e7fdcad2f2
@ -870,11 +870,6 @@ rshift_gt (unsigned int a)
|
|||||||
bar ();
|
bar ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void neg_eq_cst(unsigned int a) {
|
|
||||||
if (-a == 123)
|
|
||||||
bar();
|
|
||||||
}
|
|
||||||
|
|
||||||
All should simplify to a single comparison. All of these are
|
All should simplify to a single comparison. All of these are
|
||||||
currently not optimized with "clang -emit-llvm-bc | opt
|
currently not optimized with "clang -emit-llvm-bc | opt
|
||||||
-std-compile-opts".
|
-std-compile-opts".
|
||||||
|
@ -1407,18 +1407,27 @@ Instruction *InstCombiner::visitICmpInstWithInstAndIntCst(ICmpInst &ICI,
|
|||||||
case Instruction::Xor:
|
case Instruction::Xor:
|
||||||
// For the xor case, we can xor two constants together, eliminating
|
// For the xor case, we can xor two constants together, eliminating
|
||||||
// the explicit xor.
|
// the explicit xor.
|
||||||
if (Constant *BOC = dyn_cast<Constant>(BO->getOperand(1)))
|
if (Constant *BOC = dyn_cast<Constant>(BO->getOperand(1))) {
|
||||||
return new ICmpInst(ICI.getPredicate(), BO->getOperand(0),
|
return new ICmpInst(ICI.getPredicate(), BO->getOperand(0),
|
||||||
ConstantExpr::getXor(RHS, BOC));
|
ConstantExpr::getXor(RHS, BOC));
|
||||||
|
} else if (RHSV == 0) {
|
||||||
// FALLTHROUGH
|
// Replace ((xor A, B) != 0) with (A != B)
|
||||||
case Instruction::Sub:
|
|
||||||
// Replace (([sub|xor] A, B) != 0) with (A != B)
|
|
||||||
if (RHSV == 0)
|
|
||||||
return new ICmpInst(ICI.getPredicate(), BO->getOperand(0),
|
return new ICmpInst(ICI.getPredicate(), BO->getOperand(0),
|
||||||
BO->getOperand(1));
|
BO->getOperand(1));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case Instruction::Sub:
|
||||||
|
// Replace ((sub A, B) != C) with (B != A-C) if A & C are constants.
|
||||||
|
if (ConstantInt *BOp0C = dyn_cast<ConstantInt>(BO->getOperand(0))) {
|
||||||
|
if (BO->hasOneUse())
|
||||||
|
return new ICmpInst(ICI.getPredicate(), BO->getOperand(1),
|
||||||
|
ConstantExpr::getSub(BOp0C, RHS));
|
||||||
|
} else if (RHSV == 0) {
|
||||||
|
// Replace ((sub A, B) != 0) with (A != B)
|
||||||
|
return new ICmpInst(ICI.getPredicate(), BO->getOperand(0),
|
||||||
|
BO->getOperand(1));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Instruction::Or:
|
case Instruction::Or:
|
||||||
// If bits are being or'd in that are not present in the constant we
|
// If bits are being or'd in that are not present in the constant we
|
||||||
// are comparing against, then the comparison could never succeed!
|
// are comparing against, then the comparison could never succeed!
|
||||||
|
@ -531,3 +531,19 @@ define i1 @test54(i8 %a) nounwind {
|
|||||||
%ret = icmp eq i32 %and, 128
|
%ret = icmp eq i32 %and, 128
|
||||||
ret i1 %ret
|
ret i1 %ret
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; CHECK: @test55
|
||||||
|
; CHECK-NEXT: icmp eq i32 %a, -123
|
||||||
|
define i1 @test55(i32 %a) {
|
||||||
|
%sub = sub i32 0, %a
|
||||||
|
%cmp = icmp eq i32 %sub, 123
|
||||||
|
ret i1 %cmp
|
||||||
|
}
|
||||||
|
|
||||||
|
; CHECK: @test56
|
||||||
|
; CHECK-NEXT: icmp eq i32 %a, -113
|
||||||
|
define i1 @test56(i32 %a) {
|
||||||
|
%sub = sub i32 10, %a
|
||||||
|
%cmp = icmp eq i32 %sub, 123
|
||||||
|
ret i1 %cmp
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user