forked from OSchip/llvm-project
Rework this to clarify where the removal of nodes from the queue is
really happening. No intended functionality change. llvm-svn: 159451
This commit is contained in:
parent
1db30fc071
commit
9838286d9e
|
@ -667,15 +667,13 @@ void Reassociate::RewriteExprTree(BinaryOperator *I,
|
|||
/// the new expression into.
|
||||
SmallVector<BinaryOperator*, 8> 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
|
||||
|
|
Loading…
Reference in New Issue