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:
Chris Lattner 2003-11-05 01:06:05 +00:00
parent 9716eb7676
commit d65460f133

View File

@ -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);