[PATCH] D134613: [LoopDeleteion] Forget block and loop dispositions after deleting loop.
Florian Hahn via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sun Sep 25 13:14:05 PDT 2022
fhahn created this revision.
fhahn added reviewers: nikic, reames, mkazantsev.
Herald added subscribers: javed.absar, hiraditya.
Herald added a project: All.
fhahn requested review of this revision.
Herald added a project: LLVM.
After deleting a loop, the block and loop dispositions need to be
cleared. As we don't know which SCEVs in the loop/blocks may be
impacted, completely clear the cache. This should also fix some cases
where deleted loops remained in the LoopDispositions cache.
This fixes a verification failure surfaced by D134531 <https://reviews.llvm.org/D134531>.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D134613
Files:
llvm/lib/Transforms/Utils/LoopUtils.cpp
llvm/test/Transforms/LoopDeletion/pr57837-invalidate-scev-after-hoisting.ll
Index: llvm/test/Transforms/LoopDeletion/pr57837-invalidate-scev-after-hoisting.ll
===================================================================
--- llvm/test/Transforms/LoopDeletion/pr57837-invalidate-scev-after-hoisting.ll
+++ 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<scalar-evolution>,print<scalar-evolution>' -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
Index: llvm/lib/Transforms/Utils/LoopUtils.cpp
===================================================================
--- llvm/lib/Transforms/Utils/LoopUtils.cpp
+++ 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() &&
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D134613.462758.patch
Type: text/x-patch
Size: 2432 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220925/893d21c3/attachment.bin>
More information about the llvm-commits
mailing list