diff --git a/lib/Analysis/ScalarEvolutionExpander.cpp b/lib/Analysis/ScalarEvolutionExpander.cpp index 1ab989f4d32..f373a80681a 100644 --- a/lib/Analysis/ScalarEvolutionExpander.cpp +++ b/lib/Analysis/ScalarEvolutionExpander.cpp @@ -569,7 +569,7 @@ Value *SCEVExpander::expandAddToGEP(const SCEV *const *op_begin, } // Save the original insertion point so we can restore it when we're done. - BuilderType::InsertPointGuard Guard(Builder); + BuilderType::InsertPoint SaveInsertPt = Builder.saveIP(); // Move the insertion point out of as many loops as we can. while (const Loop *L = SE.LI->getLoopFor(Builder.GetInsertBlock())) { @@ -604,6 +604,9 @@ Value *SCEVExpander::expandAddToGEP(const SCEV *const *op_begin, Ops.push_back(SE.getUnknown(GEP)); rememberInstruction(GEP); + // Restore the original insert point. + Builder.restoreIP(SaveInsertPt); + return expand(SE.getAddExpr(Ops)); } diff --git a/test/Transforms/LoopStrengthReduce/dominate-assert.ll b/test/Transforms/LoopStrengthReduce/dominate-assert.ll index ff8cab83137..3ba93ff7483 100644 --- a/test/Transforms/LoopStrengthReduce/dominate-assert.ll +++ b/test/Transforms/LoopStrengthReduce/dominate-assert.ll @@ -68,3 +68,46 @@ bb7: catch i8* null ret void } + +; PR17425 +define void @i() { +entry: + br label %while.cond + +while.cond: ; preds = %while.cond, %entry + %c.0 = phi i16* [ undef, %entry ], [ %incdec.ptr, %while.cond ] + %incdec.ptr = getelementptr inbounds i16* %c.0, i64 1 + br i1 undef, label %while.cond1, label %while.cond + +while.cond1: ; preds = %while.cond1, %while.cond + %c.1 = phi i16* [ %incdec.ptr5, %while.cond1 ], [ %c.0, %while.cond ] + %incdec.ptr5 = getelementptr inbounds i16* %c.1, i64 1 + br i1 undef, label %while.cond7, label %while.cond1 + +while.cond7: ; preds = %while.cond7, %while.cond1 + %0 = phi i16* [ %incdec.ptr10, %while.cond7 ], [ %c.1, %while.cond1 ] + %incdec.ptr10 = getelementptr inbounds i16* %0, i64 1 + br i1 undef, label %while.cond12.preheader, label %while.cond7 + +while.cond12.preheader: ; preds = %while.cond7 + br i1 undef, label %while.end16, label %while.body13.lr.ph + +while.body13: ; preds = %if.else, %while.body13.lr.ph + %1 = phi i16* [ %2, %while.body13.lr.ph ], [ %incdec.ptr15, %if.else ] + br i1 undef, label %while.cond12.outer.loopexit, label %if.else + +while.cond12.outer.loopexit: ; preds = %while.body13 + br i1 undef, label %while.end16, label %while.body13.lr.ph + +while.body13.lr.ph: ; preds = %while.cond12.outer.loopexit, %while.cond12.preheader + %2 = phi i16* [ %1, %while.cond12.outer.loopexit ], [ undef, %while.cond12.preheader ] + br label %while.body13 + +if.else: ; preds = %while.body13 + %incdec.ptr15 = getelementptr inbounds i16* %1, i64 1 + %cmp = icmp eq i16* %incdec.ptr15, %0 + br i1 %cmp, label %while.end16, label %while.body13 + +while.end16: ; preds = %if.else, %while.cond12.outer.loopexit, %while.cond12.preheader + ret void +}