diff --git a/llvm/lib/Transforms/Scalar/LoopFlatten.cpp b/llvm/lib/Transforms/Scalar/LoopFlatten.cpp --- a/llvm/lib/Transforms/Scalar/LoopFlatten.cpp +++ b/llvm/lib/Transforms/Scalar/LoopFlatten.cpp @@ -176,8 +176,11 @@ LLVM_DEBUG(dbgs() << "Found limit: "; Limit->dump()); assert(InductionPHI->getNumIncomingValues() == 2); - assert(InductionPHI->getIncomingValueForBlock(Latch) == Increment && - "PHI value is not increment inst"); + + if (InductionPHI->getIncomingValueForBlock(Latch) != Increment) { + LLVM_DEBUG(dbgs() << "PHI value is not increment inst"); + return false; + } auto *CI = dyn_cast( InductionPHI->getIncomingValueForBlock(L->getLoopPreheader())); diff --git a/llvm/test/Transforms/LoopFlatten/pr49571.ll b/llvm/test/Transforms/LoopFlatten/pr49571.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Transforms/LoopFlatten/pr49571.ll @@ -0,0 +1,24 @@ +; RUN: opt < %s -S -loop-flatten -verify-loop-info -verify-dom-info -verify-scev -verify | FileCheck %s + +; CHECK-LABEL: @main + +define dso_local void @main() { +entry: + br label %for.cond + +for.cond: ; preds = %for.end, %entry + br label %for.body + +for.body: ; preds = %for.inc, %for.cond + %a.03 = phi i32 [ 0, %for.cond ], [ %inc, %for.inc ] + br label %for.inc + +for.inc: ; preds = %for.body + %0 = add i32 %a.03, 1 + %cmp = icmp slt i32 %0, 10 + %inc = add nsw i32 %a.03, 1 + br i1 %cmp, label %for.body, label %for.end + +for.end: ; preds = %for.inc + br label %for.cond +}