mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-26 12:20:42 +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:
@@ -1407,18 +1407,27 @@ Instruction *InstCombiner::visitICmpInstWithInstAndIntCst(ICmpInst &ICI,
|
||||
case Instruction::Xor:
|
||||
// For the xor case, we can xor two constants together, eliminating
|
||||
// the explicit xor.
|
||||
if (Constant *BOC = dyn_cast<Constant>(BO->getOperand(1)))
|
||||
return new ICmpInst(ICI.getPredicate(), BO->getOperand(0),
|
||||
if (Constant *BOC = dyn_cast<Constant>(BO->getOperand(1))) {
|
||||
return new ICmpInst(ICI.getPredicate(), BO->getOperand(0),
|
||||
ConstantExpr::getXor(RHS, BOC));
|
||||
|
||||
// FALLTHROUGH
|
||||
case Instruction::Sub:
|
||||
// Replace (([sub|xor] A, B) != 0) with (A != B)
|
||||
if (RHSV == 0)
|
||||
} else if (RHSV == 0) {
|
||||
// Replace ((xor A, B) != 0) with (A != B)
|
||||
return new ICmpInst(ICI.getPredicate(), BO->getOperand(0),
|
||||
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;
|
||||
|
||||
case Instruction::Or:
|
||||
// If bits are being or'd in that are not present in the constant we
|
||||
// are comparing against, then the comparison could never succeed!
|
||||
|
||||
Reference in New Issue
Block a user