diff --git a/llvm/lib/Transforms/Utils/LoopUtils.cpp b/llvm/lib/Transforms/Utils/LoopUtils.cpp --- a/llvm/lib/Transforms/Utils/LoopUtils.cpp +++ b/llvm/lib/Transforms/Utils/LoopUtils.cpp @@ -486,8 +486,10 @@ // Tell ScalarEvolution that the loop is deleted. Do this before // deleting the loop so that ScalarEvolution can look at the loop // to determine what it needs to clean up. - if (SE) + if (SE) { SE->forgetLoop(L); + SE->forgetBlockAndLoopDispositions(); + } Instruction *OldTerm = Preheader->getTerminator(); assert(!OldTerm->mayHaveSideEffects() && diff --git a/llvm/test/Transforms/LoopDeletion/pr57837-invalidate-scev-after-hoisting.ll b/llvm/test/Transforms/LoopDeletion/pr57837-invalidate-scev-after-hoisting.ll --- a/llvm/test/Transforms/LoopDeletion/pr57837-invalidate-scev-after-hoisting.ll +++ b/llvm/test/Transforms/LoopDeletion/pr57837-invalidate-scev-after-hoisting.ll @@ -1,8 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -passes='loop(indvars,loop-deletion),verify,print' -S %s 2>&1| FileCheck %s -; XFAIL: * - ; Make sure the SCEV for %invar is invalidated properly when the instruction is ; moved by LoopDeletion. @@ -78,6 +76,28 @@ define i32 @scev_invalidation_after_deleting(ptr %src) { +; CHECK-LABEL: @scev_invalidation_after_deleting( +; CHECK-NEXT: entry: +; CHECK-NEXT: br label [[OUTER_HEADER:%.*]] +; CHECK: outer.header: +; CHECK-NEXT: [[OUTER_IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[OUTER_IV_NEXT:%.*]], [[OUTER_LATCH:%.*]] ] +; CHECK-NEXT: br label [[INNER_1:%.*]] +; CHECK: inner.1: +; CHECK-NEXT: [[C_1:%.*]] = icmp eq i32 0, [[OUTER_IV]] +; CHECK-NEXT: br i1 [[C_1]], label [[INNER_2_PREHEADER:%.*]], label [[INNER_1]] +; CHECK: inner.2.preheader: +; CHECK-NEXT: br label [[INNER_3_PH:%.*]] +; CHECK: inner.3.ph: +; CHECK-NEXT: br label [[INNER_3:%.*]] +; CHECK: inner.3: +; CHECK-NEXT: [[L:%.*]] = load i32, ptr [[SRC:%.*]], align 4 +; CHECK-NEXT: br i1 false, label [[OUTER_LATCH]], label [[INNER_3]] +; CHECK: outer.latch: +; CHECK-NEXT: [[L_LCSSA:%.*]] = phi i32 [ [[L]], [[INNER_3]] ] +; CHECK-NEXT: [[TRUNC:%.*]] = trunc i64 0 to i32 +; CHECK-NEXT: [[OUTER_IV_NEXT]] = add nsw i32 [[L_LCSSA]], [[TRUNC]] +; CHECK-NEXT: br label [[OUTER_HEADER]] +; entry: br label %outer.header