From df3332660f55e32cbc20a457e13cdb8dc2fbaecf Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 8 May 2005 21:41:35 +0000 Subject: Implement Reassociate/mul-neg-add.ll llvm-svn: 21788 --- llvm/lib/Transforms/Scalar/Reassociate.cpp | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'llvm/lib/Transforms/Scalar/Reassociate.cpp') diff --git a/llvm/lib/Transforms/Scalar/Reassociate.cpp b/llvm/lib/Transforms/Scalar/Reassociate.cpp index 592df535af7..af0c6118a27 100644 --- a/llvm/lib/Transforms/Scalar/Reassociate.cpp +++ b/llvm/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"); -- cgit v1.2.3