diff options
| author | Andrew Trick <atrick@apple.com> | 2011-12-20 01:42:24 +0000 |
|---|---|---|
| committer | Andrew Trick <atrick@apple.com> | 2011-12-20 01:42:24 +0000 |
| commit | b9aa26f8eadc8b1bebcdde199c41cafc92f53d85 (patch) | |
| tree | b667e1e3ad81284f3411f84b48e3d395a5826d82 /llvm/lib/Analysis/ScalarEvolutionExpander.cpp | |
| parent | 75f12cc3fe53f3d991e9d1500b6df5d7f7d064a0 (diff) | |
| download | bcm5719-llvm-b9aa26f8eadc8b1bebcdde199c41cafc92f53d85.tar.gz bcm5719-llvm-b9aa26f8eadc8b1bebcdde199c41cafc92f53d85.zip | |
LSR: Fix another corner case in expansion of postinc users.
Fixes PR11571: Instruction does not dominate all uses
llvm-svn: 146950
Diffstat (limited to 'llvm/lib/Analysis/ScalarEvolutionExpander.cpp')
| -rw-r--r-- | llvm/lib/Analysis/ScalarEvolutionExpander.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/ScalarEvolutionExpander.cpp b/llvm/lib/Analysis/ScalarEvolutionExpander.cpp index f3cf5494551..5f83914cb27 100644 --- a/llvm/lib/Analysis/ScalarEvolutionExpander.cpp +++ b/llvm/lib/Analysis/ScalarEvolutionExpander.cpp @@ -1019,6 +1019,16 @@ SCEVExpander::getAddRecExprPHILiterally(const SCEVAddRecExpr *Normalized, BasicBlock *SaveInsertBB = Builder.GetInsertBlock(); BasicBlock::iterator SaveInsertPt = Builder.GetInsertPoint(); + // Another AddRec may need to be recursively expanded below. For example, if + // this AddRec is quadratic, the StepV may itself be an AddRec in this + // loop. Remove this loop from the PostIncLoops set before expanding such + // AddRecs. Otherwise, we cannot find a valid position for the step + // (i.e. StepV can never dominate its loop header). Ideally, we could do + // SavedIncLoops.swap(PostIncLoops), but we generally have a single element, + // so it's not worth implementing SmallPtrSet::swap. + PostIncLoopSet SavedPostIncLoops = PostIncLoops; + PostIncLoops.clear(); + // Expand code for the start value. Value *StartV = expandCodeFor(Normalized->getStart(), ExpandTy, L->getHeader()->begin()); @@ -1073,6 +1083,10 @@ SCEVExpander::getAddRecExprPHILiterally(const SCEVAddRecExpr *Normalized, if (SaveInsertBB) restoreInsertPoint(SaveInsertBB, SaveInsertPt); + // After expanding subexpressions, restore the PostIncLoops set so the caller + // can ensure that IVIncrement dominates the current uses. + PostIncLoops = SavedPostIncLoops; + // Remember this PHI, even in post-inc mode. InsertedValues.insert(PN); |

