mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-19 19:29:31 +00:00
Fix bug with previous implementation:
- // ~(c-X) == X-(c-1) == X+(-c+1) + // ~(c-X) == X-c-1 == X+(-c-1) Implement: C - ~X == X + (1+C) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@9715 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
9716eb7676
commit
d65460f133
@ -488,11 +488,18 @@ Instruction *InstCombiner::visitSub(BinaryOperator &I) {
|
||||
if (Value *V = dyn_castNegVal(Op1))
|
||||
return BinaryOperator::create(Instruction::Add, Op0, V);
|
||||
|
||||
if (ConstantInt *C = dyn_cast<ConstantInt>(Op0)) {
|
||||
// Replace (-1 - A) with (~A)...
|
||||
if (ConstantInt *C = dyn_cast<ConstantInt>(Op0))
|
||||
if (C->isAllOnesValue())
|
||||
return BinaryOperator::createNot(Op1);
|
||||
|
||||
// C - ~X == X + (1+C)
|
||||
if (BinaryOperator::isNot(Op1))
|
||||
return BinaryOperator::create(Instruction::Add,
|
||||
BinaryOperator::getNotArgument(cast<BinaryOperator>(Op1)),
|
||||
*C + *ConstantInt::get(I.getType(), 1));
|
||||
}
|
||||
|
||||
if (BinaryOperator *Op1I = dyn_cast<BinaryOperator>(Op1))
|
||||
if (Op1I->hasOneUse()) {
|
||||
// Replace (x - (y - z)) with (x + (z - y)) if the (y - z) subexpression
|
||||
@ -1001,10 +1008,10 @@ Instruction *InstCombiner::visitXor(BinaryOperator &I) {
|
||||
return new SetCondInst(SCI->getInverseCondition(),
|
||||
SCI->getOperand(0), SCI->getOperand(1));
|
||||
|
||||
// ~(c-X) == X-(c-1) == X+(-c+1)
|
||||
// ~(c-X) == X-c-1 == X+(-c-1)
|
||||
if (Op0I->getOpcode() == Instruction::Sub && RHS->isAllOnesValue() &&
|
||||
isa<Constant>(Op0I->getOperand(0))) {
|
||||
Constant *ConstantRHS = *-*cast<Constant>(Op0I->getOperand(0)) +
|
||||
Constant *ConstantRHS = *-*cast<Constant>(Op0I->getOperand(0)) -
|
||||
*ConstantInt::get(I.getType(), 1);
|
||||
return BinaryOperator::create(Instruction::Add, Op0I->getOperand(1),
|
||||
ConstantRHS);
|
||||
|
Loading…
Reference in New Issue
Block a user