diff --git a/llvm/lib/Transforms/Scalar/LoopFlatten.cpp b/llvm/lib/Transforms/Scalar/LoopFlatten.cpp index 319d9b4c752a9b..5b5196529734fc 100644 --- a/llvm/lib/Transforms/Scalar/LoopFlatten.cpp +++ b/llvm/lib/Transforms/Scalar/LoopFlatten.cpp @@ -178,7 +178,8 @@ static bool findLoopComponents( assert(InductionPHI->getNumIncomingValues() == 2); if (InductionPHI->getIncomingValueForBlock(Latch) != Increment) { - LLVM_DEBUG(dbgs() << "PHI value is not increment inst"); + LLVM_DEBUG( + dbgs() << "Incoming value from latch is not the increment inst\n"); return false; } diff --git a/llvm/test/Transforms/LoopFlatten/pr49571.ll b/llvm/test/Transforms/LoopFlatten/pr49571.ll index afd1fb2d8ded3b..0037064245d000 100644 --- a/llvm/test/Transforms/LoopFlatten/pr49571.ll +++ b/llvm/test/Transforms/LoopFlatten/pr49571.ll @@ -1,8 +1,29 @@ +; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt < %s -S -loop-flatten -verify-loop-info -verify-dom-info -verify-scev -verify | FileCheck %s -; CHECK-LABEL: @main +; Testcase of PR49571 +; Previously we had an assertion that the incoming value from the +; loop latch (%inc) is the same as the operator in the compare +; statement (%0). This does not necessarily hold as demonstrated +; in the following case. define dso_local void @main() { +; CHECK-LABEL: @main( +; CHECK-NEXT: entry: +; CHECK-NEXT: br label [[FOR_COND:%.*]] +; CHECK: for.cond: +; CHECK-NEXT: br label [[FOR_BODY:%.*]] +; CHECK: for.body: +; CHECK-NEXT: [[A_03:%.*]] = phi i32 [ 0, [[FOR_COND]] ], [ [[INC:%.*]], [[FOR_INC:%.*]] ] +; CHECK-NEXT: br label [[FOR_INC]] +; CHECK: for.inc: +; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[A_03]], 1 +; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[TMP0]], 10 +; CHECK-NEXT: [[INC]] = add nsw i32 [[A_03]], 1 +; CHECK-NEXT: br i1 [[CMP]], label [[FOR_BODY]], label [[FOR_END:%.*]] +; CHECK: for.end: +; CHECK-NEXT: br label [[FOR_COND]] +; entry: br label %for.cond