From 2923bca2b5fe46189c4c5572047e1d95946ac549 Mon Sep 17 00:00:00 2001 From: Duncan Sands Date: Fri, 29 Jun 2012 19:03:05 +0000 Subject: Rework this to clarify where the removal of nodes from the queue is really happening. No intended functionality change. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@159451 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/Reassociate.cpp | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'lib/Transforms/Scalar/Reassociate.cpp') diff --git a/lib/Transforms/Scalar/Reassociate.cpp b/lib/Transforms/Scalar/Reassociate.cpp index 547a51e7d4..bcf34b5256 100644 --- a/lib/Transforms/Scalar/Reassociate.cpp +++ b/lib/Transforms/Scalar/Reassociate.cpp @@ -667,15 +667,13 @@ void Reassociate::RewriteExprTree(BinaryOperator *I, /// the new expression into. SmallVector NodesToRewrite; unsigned Opcode = I->getOpcode(); - NodesToRewrite.push_back(I); + BinaryOperator *Op = I; // ExpressionChanged - Non-null if the rewritten expression differs from the // original in some non-trivial way, requiring the clearing of optional flags. // Flags are cleared from the operator in ExpressionChanged up to I inclusive. BinaryOperator *ExpressionChanged = 0; for (unsigned i = 0; ; ++i) { - BinaryOperator *Op = NodesToRewrite.pop_back_val(); - // The last operation (which comes earliest in the IR) is special as both // operands will come from Ops, rather than just one with the other being // a subexpression. @@ -746,7 +744,7 @@ void Reassociate::RewriteExprTree(BinaryOperator *I, // from the original expression then just rewrite the rest of the expression // into it. if (BinaryOperator *BO = isReassociableOp(Op->getOperand(0), Opcode)) { - NodesToRewrite.push_back(BO); + Op = BO; continue; } @@ -757,19 +755,22 @@ void Reassociate::RewriteExprTree(BinaryOperator *I, // hard (finding the mimimal number of multiplications needed to realize a // multiplication expression is NP-complete). Whatever the reason, smart or // stupid, create a new node if there are none left. + BinaryOperator *NewOp; if (NodesToRewrite.empty()) { Constant *Undef = UndefValue::get(I->getType()); - BinaryOperator *N = BinaryOperator::Create(Instruction::BinaryOps(Opcode), - Undef, Undef, "", I); - NodesToRewrite.push_back(N); + NewOp = BinaryOperator::Create(Instruction::BinaryOps(Opcode), + Undef, Undef, "", I); + } else { + NewOp = NodesToRewrite.pop_back_val(); } DEBUG(dbgs() << "RA: " << *Op << '\n'); - Op->setOperand(0, NodesToRewrite.back()); + Op->setOperand(0, NewOp); DEBUG(dbgs() << "TO: " << *Op << '\n'); ExpressionChanged = Op; MadeChange = true; ++NumChanged; + Op = NewOp; } // If the expression changed non-trivially then clear out all subclass data -- cgit v1.2.3-18-g5258