Skip to content

Commit

Permalink
[SimpleLoopUnswitch] Clear dispos in deleteDeadBlocksFromLoop.
Browse files Browse the repository at this point in the history
SimpleLoopUnswitch may remove blocks from loops. Clear block and loop
dispositions in that case, to clean up invalid entries in the cache.

Fixes #58158.

Fixes #58159.
  • Loading branch information
fhahn committed Oct 5, 2022
1 parent eb975ca commit 469f0fc
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 1 deletion.
5 changes: 4 additions & 1 deletion llvm/lib/Transforms/Scalar/SimpleLoopUnswitch.cpp
Expand Up @@ -1620,6 +1620,7 @@ deleteDeadBlocksFromLoop(Loop &L,
SmallVectorImpl<BasicBlock *> &ExitBlocks,
DominatorTree &DT, LoopInfo &LI,
MemorySSAUpdater *MSSAU,
ScalarEvolution *SE,
function_ref<void(Loop &, StringRef)> DestroyLoopCB) {
// Find all the dead blocks tied to this loop, and remove them from their
// successors.
Expand Down Expand Up @@ -1671,6 +1672,8 @@ deleteDeadBlocksFromLoop(Loop &L,
"If the child loop header is dead all blocks in the child loop must "
"be dead as well!");
DestroyLoopCB(*ChildL, ChildL->getName());
if (SE)
SE->forgetBlockAndLoopDispositions();
LI.destroy(ChildL);
return true;
});
Expand Down Expand Up @@ -2377,7 +2380,7 @@ static void unswitchNontrivialInvariants(
// Now that our cloned loops have been built, we can update the original loop.
// First we delete the dead blocks from it and then we rebuild the loop
// structure taking these deletions into account.
deleteDeadBlocksFromLoop(L, ExitBlocks, DT, LI, MSSAU, DestroyLoopCB);
deleteDeadBlocksFromLoop(L, ExitBlocks, DT, LI, MSSAU, SE,DestroyLoopCB);

if (MSSAU && VerifyMemorySSA)
MSSAU->getMemorySSA()->verifyMemorySSA();
Expand Down
Expand Up @@ -71,3 +71,42 @@ exit: ; preds = %then.bb, %loop.head
}

declare i16 @foo() nounwind readnone

define void @test_pr58158(i1 %c.1) {
; CHECK-LABEL: @test_pr58158(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[CALL:%.*]] = tail call i16 @bar()
; CHECK-NEXT: br i1 [[C_1:%.*]], label [[ENTRY_SPLIT_US:%.*]], label [[ENTRY_SPLIT:%.*]]
; CHECK: entry.split.us:
; CHECK-NEXT: br label [[OUTER_US:%.*]]
; CHECK: outer.us:
; CHECK-NEXT: br label [[INNER_PREHEADER_US:%.*]]
; CHECK: inner.us:
; CHECK-NEXT: [[C_2_US:%.*]] = icmp eq i16 0, [[CALL]]
; CHECK-NEXT: br i1 [[C_2_US]], label [[OUTER_LOOPEXIT_US:%.*]], label [[INNER_US:%.*]]
; CHECK: inner.preheader.us:
; CHECK-NEXT: br label [[INNER_US]]
; CHECK: outer.loopexit.us:
; CHECK-NEXT: br label [[OUTER_BACKEDGE_US:%.*]]
; CHECK: outer.backedge.us:
; CHECK-NEXT: br label [[OUTER_US]]
; CHECK: entry.split:
; CHECK-NEXT: br label [[OUTER:%.*]]
; CHECK: outer:
; CHECK-NEXT: br label [[OUTER_BACKEDGE:%.*]]
; CHECK: outer.backedge:
; CHECK-NEXT: br label [[OUTER]]
;
entry:
%call = tail call i16 @bar()
br label %outer

outer:
br i1 %c.1, label %inner, label %outer

inner:
%c.2 = icmp eq i16 0, %call
br i1 %c.2, label %outer, label %inner
}

declare i16 @bar()

0 comments on commit 469f0fc

Please sign in to comment.