diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp --- a/llvm/lib/Analysis/ScalarEvolution.cpp +++ b/llvm/lib/Analysis/ScalarEvolution.cpp @@ -8241,8 +8241,10 @@ isKnownPositive(BackedgeTakenCount) && PN->getNumIncomingValues() == 2) { unsigned InLoopPred = LI->contains(PN->getIncomingBlock(0)) ? 0 : 1; - const SCEV *OnBackedge = getSCEV(PN->getIncomingValue(InLoopPred)); - if (IsAvailableOnEntry(LI, DT, OnBackedge, PN->getParent())) + Value *BackedgeVal = PN->getIncomingValue(InLoopPred); + const SCEV *OnBackedge = getSCEV(BackedgeVal); + if (!isa(BackedgeVal) && + IsAvailableOnEntry(LI, DT, OnBackedge, PN->getParent())) return OnBackedge; } if (auto *BTCC = dyn_cast(BackedgeTakenCount)) { diff --git a/llvm/test/Analysis/ScalarEvolution/pr44605.ll b/llvm/test/Analysis/ScalarEvolution/pr44605.ll new file mode 100644 --- /dev/null +++ b/llvm/test/Analysis/ScalarEvolution/pr44605.ll @@ -0,0 +1,37 @@ +; RUN: opt < %s -indvars -S | FileCheck %s +define i32 @test() { +entry: + br label %outer + +outer: + %local_6_6 = phi i32 [ 10, %entry ], [ %5, %latch ] + %local_4_5 = phi i32 [ 56587, %entry ], [ 0, %latch ] + %local_3_4 = phi i32 [ 2, %entry ], [ %local_6_6, %latch ] + %.udiv = udiv i32 %local_6_6, 8361 + br label %inner + +inner: + %local_7_3 = phi i32 [ 2, %outer ], [ %3, %inner ] + %local_4_5.pn = phi i32 [ %local_4_5, %outer ], [ %2, %inner ] + %local_3_31 = mul i32 %local_4_5.pn, %.udiv + %0 = mul i32 %local_7_3, %.udiv + %1 = sub i32 %0, %local_3_4 + %2 = add i32 %1, %local_3_31 + %3 = add nuw nsw i32 %local_7_3, 1 + %4 = icmp ugt i32 %local_7_3, 4 + br i1 %4, label %latch, label %inner + +latch: + %.lcssa = phi i32 [ %2, %inner ] + %5 = add nuw nsw i32 %local_6_6, 1 + %6 = icmp ugt i32 %local_6_6, 276 + br i1 %6, label %return, label %outer + +; CHECK: return: +; CHECK-NOT: ret i32 -277 +return: + %.lcssa.lcssa = phi i32 [ %.lcssa, %latch ] + ret i32 %.lcssa.lcssa + +} +