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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@147718 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp
index f59e156..8f3a5ab 100644
--- a/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+++ b/lib/Transforms/Scalar/LoopStrengthReduce.cpp
@@ -3842,8 +3842,15 @@
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;