diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp index 1e4bb1d606cd3..91bbe92a94c21 100644 --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -15754,6 +15754,7 @@ void ScalarEvolution::LoopGuards::collectFromBlock( // original header. // TODO: share this logic with isLoopEntryGuardedByCond. unsigned NumCollectedConditions = 0; + VisitedBlocks.insert(Block); std::pair Pair(Pred, Block); for (; Pair.first; Pair = SE.getPredecessorWithUniqueSuccessorForBB(Pair.first)) { diff --git a/llvm/test/Analysis/ScalarEvolution/backedge-taken-count-guard-info-with-multiple-predecessors.ll b/llvm/test/Analysis/ScalarEvolution/backedge-taken-count-guard-info-with-multiple-predecessors.ll index 81fe96a2f30c0..46dccf454f21a 100644 --- a/llvm/test/Analysis/ScalarEvolution/backedge-taken-count-guard-info-with-multiple-predecessors.ll +++ b/llvm/test/Analysis/ScalarEvolution/backedge-taken-count-guard-info-with-multiple-predecessors.ll @@ -310,3 +310,29 @@ inner.header: exit: ret void } + +; Checks correct traversal for loops without a unique predecessor +; outside the loop. +define void @pr120615() { +; CHECK-LABEL: pr120615 +; CHECK-NEXT: Determining loop execution counts for: @pr120615 +; CHECK-NEXT: Loop %header: backedge-taken count is i32 0 +; CHECK-NEXT: Loop %header: constant max backedge-taken count is i32 0 +; CHECK-NEXT: Loop %header: symbolic max backedge-taken count is i32 0 +; CHECK-NEXT: Loop %header: Trip multiple is 1 +entry: + br label %header + +bb: + br label %header + +header: + %0 = phi i32 [ %1, %header ], [ 0, %bb ], [ 0, %entry ] + %1 = add i32 %0, 1 + %icmp = icmp slt i32 %0, 0 + br i1 %icmp, label %header, label %exit + +exit: + ret void + +}