[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