From: Chris Lattner Date: Sun, 8 May 2005 21:41:35 +0000 (+0000) Subject: Implement Reassociate/mul-neg-add.ll X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=44b8c7d5d36561d1a685f8b5a95b71f939cce26e;p=oota-llvm.git Implement Reassociate/mul-neg-add.ll git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21788 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Transforms/Scalar/Reassociate.cpp b/lib/Transforms/Scalar/Reassociate.cpp index 592df535af7..af0c6118a27 100644 --- a/lib/Transforms/Scalar/Reassociate.cpp +++ b/lib/Transforms/Scalar/Reassociate.cpp @@ -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(I->use_back())->getOpcode() == Instruction::Add && + isa(Ops.back().Op) && + cast(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");