diff options
author | Chris Lattner <sabre@nondot.org> | 2005-08-10 00:35:32 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2005-08-10 00:35:32 +0000 |
commit | c41e34520ab2f8c0bfe2f95546745826f6b34d59 (patch) | |
tree | 54853aaef500e58b64d9adc3fea1d4fe452b802d /lib/Transforms/Scalar/LoopStrengthReduce.cpp | |
parent | 3b7fd6647d825b88ba5c9580546408b730c867a8 (diff) |
Fix Regression/Transforms/LoopStrengthReduce/phi_node_update_multiple_preds.ll
by being more careful about updating PHI nodes
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22739 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms/Scalar/LoopStrengthReduce.cpp')
-rw-r--r-- | lib/Transforms/Scalar/LoopStrengthReduce.cpp | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp index 4975614e50..547fd25d58 100644 --- a/lib/Transforms/Scalar/LoopStrengthReduce.cpp +++ b/lib/Transforms/Scalar/LoopStrengthReduce.cpp @@ -423,21 +423,28 @@ void BasedUser::RewriteInstructionToUseNewBase(const SCEVHandle &NewBase, } // PHI nodes are more complex. We have to insert one copy of the NewBase+Imm - // expression into each operand block that uses it. + // expression into each operand block that uses it. Note that PHI nodes can + // have multiple entries for the same predecessor. We use a map to make sure + // that a PHI node only has a single Value* for each predecessor (which also + // prevents us from inserting duplicate code in some blocks). + std::map<BasicBlock*, Value*> InsertedCode; PHINode *PN = cast<PHINode>(Inst); for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) { if (PN->getIncomingValue(i) == OperandValToReplace) { // FIXME: this should split any critical edges. - // Insert the code into the end of the predecessor block. - BasicBlock::iterator InsertPt = PN->getIncomingBlock(i)->getTerminator(); + Value *&Code = InsertedCode[PN->getIncomingBlock(i)]; + if (!Code) { + // Insert the code into the end of the predecessor block. + BasicBlock::iterator InsertPt =PN->getIncomingBlock(i)->getTerminator(); - SCEVHandle NewValSCEV = SCEVAddExpr::get(NewBase, Imm); - Value *NewVal = Rewriter.expandCodeFor(NewValSCEV, InsertPt, - OperandValToReplace->getType()); + SCEVHandle NewValSCEV = SCEVAddExpr::get(NewBase, Imm); + Code = Rewriter.expandCodeFor(NewValSCEV, InsertPt, + OperandValToReplace->getType()); + } // Replace the use of the operand Value with the new Phi we just created. - PN->setIncomingValue(i, NewVal); + PN->setIncomingValue(i, Code); Rewriter.clear(); } } |