Instcombine: -(X sdiv C) -> (X sdiv -C), tested by sub.ll:test16
authorChris Lattner <sabre@nondot.org>
Wed, 6 Oct 2004 15:08:25 +0000 (15:08 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 6 Oct 2004 15:08:25 +0000 (15:08 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@16769 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/InstructionCombining.cpp

index 6db0717a9fccbf17f879fbce0a67a95f7a4ccebe..767fc9582b0777068e39ab31af526d23b5715236 100644 (file)
@@ -746,6 +746,14 @@ Instruction *InstCombiner::visitSub(BinaryOperator &I) {
         return BinaryOperator::createAnd(Op0, NewNot);
       }
 
+      // -(X sdiv C)  -> (X sdiv -C)
+      if (Op1I->getOpcode() == Instruction::Div)
+        if (ConstantSInt *CSI = dyn_cast<ConstantSInt>(Op0))
+          if (CSI->getValue() == 0)
+            if (Constant *DivRHS = dyn_cast<Constant>(Op1I->getOperand(1)))
+              return BinaryOperator::createDiv(Op1I->getOperand(0), 
+                                               ConstantExpr::getNeg(DivRHS));
+
       // X - X*C --> X * (1-C)
       if (dyn_castFoldableMul(Op1I) == Op0) {
         Constant *CP1 =