Fix bug with previous implementation:
authorChris Lattner <sabre@nondot.org>
Wed, 5 Nov 2003 01:06:05 +0000 (01:06 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 5 Nov 2003 01:06:05 +0000 (01:06 +0000)
-      // ~(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

lib/Transforms/Scalar/InstructionCombining.cpp

index dafd7568f8aa3cad92f671771c005f2e093ce60a..4a5f1fbcfc3e8dfa5a098681f12eeca05643d9a5 100644 (file)
@@ -488,11 +488,18 @@ Instruction *InstCombiner::visitSub(BinaryOperator &I) {
   if (Value *V = dyn_castNegVal(Op1))
     return BinaryOperator::create(Instruction::Add, Op0, V);
 
-  // Replace (-1 - A) with (~A)...
-  if (ConstantInt *C = dyn_cast<ConstantInt>(Op0))
+  if (ConstantInt *C = dyn_cast<ConstantInt>(Op0)) {
+    // Replace (-1 - A) with (~A)...
     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);