summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
diff options
context:
space:
mode:
authorAndrew Trick <atrick@apple.com>2012-01-07 03:16:50 +0000
committerAndrew Trick <atrick@apple.com>2012-01-07 03:16:50 +0000
commit732ad80dbb21f100891691706e00ffabcca1f67d (patch)
tree868eb40b7d3da73adab1f0766627323ee201ac07 /llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
parent07082096428579009bf20eb276b3e67707a0916d (diff)
downloadbcm5719-llvm-732ad80dbb21f100891691706e00ffabcca1f67d.tar.gz
bcm5719-llvm-732ad80dbb21f100891691706e00ffabcca1f67d.zip
LSR: Don't optimize loops if an outer loop has no preheader.
LoopSimplify may not run on some outer loops, e.g. because of indirect branches. SCEVExpander simply cannot handle outer loops with no preheaders. Fixes rdar://10655343 SCEVExpander segfault. llvm-svn: 147718
Diffstat (limited to 'llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp')
-rw-r--r--llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp9
1 files changed, 8 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
index f59e156c93a..8f3a5ab071c 100644
--- a/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp
@@ -3842,8 +3842,15 @@ LSRInstance::LSRInstance(const TargetLowering *tli, Loop *l, Pass *P)
TLI(tli), L(l), Changed(false), IVIncInsertPos(0) {
// If LoopSimplify form is not available, stay out of trouble.
- if (!L->isLoopSimplifyForm()) return;
+ if (!L->isLoopSimplifyForm())
+ return;
+ // All outer loops must have preheaders, or SCEVExpander may not be able to
+ // materialize an AddRecExpr whose Start is an outer AddRecExpr.
+ for (const Loop *OuterLoop = L; (OuterLoop = OuterLoop->getParentLoop());) {
+ if (!OuterLoop->getLoopPreheader())
+ return;
+ }
// If there's no interesting work to be done, bail early.
if (IU.empty()) return;
OpenPOWER on IntegriCloud