Implement Reassociate/mul-neg-add.ll
authorChris Lattner <sabre@nondot.org>
Sun, 8 May 2005 21:41:35 +0000 (21:41 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 8 May 2005 21:41:35 +0000 (21:41 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21788 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Scalar/Reassociate.cpp

index 592df535af761b461e58280cc9bcc09bd679391e..af0c6118a2774caf74ac5cfbbee35bb044ac1e05 100644 (file)
@@ -614,6 +614,18 @@ void Reassociate::ReassociateBB(BasicBlock *BB) {
     // sorted form, optimize it globally if possible.
     OptimizeExpression(I->getOpcode(), Ops);
 
+    // We want to sink immediates as deeply as possible except in the case where
+    // this is a multiply tree used only by an add, and the immediate is a -1.
+    // In this case we reassociate to put the negation on the outside so that we
+    // can fold the negation into the add: (-X)*Y + Z -> Z-X*Y
+    if (I->getOpcode() == Instruction::Mul && I->hasOneUse() && 
+        cast<Instruction>(I->use_back())->getOpcode() == Instruction::Add &&
+        isa<ConstantInt>(Ops.back().Op) &&
+        cast<ConstantInt>(Ops.back().Op)->isAllOnesValue()) {
+      Ops.insert(Ops.begin(), Ops.back());
+      Ops.pop_back();
+    }
+
     DEBUG(std::cerr << "RAOut:\t"; PrintOps(I->getOpcode(), Ops, BB);
           std::cerr << "\n");