From 44b8c7d5d36561d1a685f8b5a95b71f939cce26e Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 8 May 2005 21:41:35 +0000 Subject: [PATCH] Implement Reassociate/mul-neg-add.ll git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21788 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/Reassociate.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) 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");