Skip to content

Commit 30a97d4

Browse files
committed
[JumpThreading] Bail out maybeMergeBasicBlockIntoOnlyPred if SinglePred is in Unreachable.
Merge SinglePred and its successor may delete SinglePred, and causes garbage pointer in Unreachable. Bail out maybeMergeBasicBlockIntoOnlyPred if we found this case.
1 parent 73ce961 commit 30a97d4

File tree

2 files changed

+6
-4
lines changed

2 files changed

+6
-4
lines changed

llvm/lib/Transforms/Scalar/JumpThreading.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1894,16 +1894,18 @@ bool JumpThreadingPass::maybeMergeBasicBlockIntoOnlyPred(BasicBlock *BB) {
18941894
SinglePred == BB || hasAddressTakenAndUsed(BB))
18951895
return false;
18961896

1897+
// MergeBasicBlockIntoOnlyPred may delete SinglePred, we need to avoid
1898+
// deleting a BB pointer from Unreachable.
1899+
if (Unreachable.count(SinglePred))
1900+
return false;
1901+
18971902
// If SinglePred was a loop header, BB becomes one.
18981903
if (LoopHeaders.erase(SinglePred))
18991904
LoopHeaders.insert(BB);
19001905

19011906
LVI->eraseBlock(SinglePred);
19021907
MergeBasicBlockIntoOnlyPred(BB, DTU.get());
19031908

1904-
if (Unreachable.count(SinglePred) && DTU->isBBPendingDeletion(SinglePred))
1905-
Unreachable.erase(SinglePred);
1906-
19071909
// Now that BB is merged into SinglePred (i.e. SinglePred code followed by
19081910
// BB code within one basic block `BB`), we need to invalidate the LVI
19091911
// information associated with BB, because the LVI information need not be

llvm/test/Transforms/JumpThreading/pr62908.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
define i32 @test() {
77
; CHECK-LABEL: define i32 @test() {
8-
; CHECK-NEXT: end:
8+
; CHECK: end:
99
; CHECK-NEXT: ret i32 0
1010
;
1111
entry:

0 commit comments

Comments
 (0)