Skip to content

Commit 2775c9a

Browse files
authored
Fix handling of virtual exit node in PostDomTree (#53739)
This is an alternative to #53642 The `dom_edges()` for an exit block in the CFG are empty when computing the PostDomTree so the loop below this may not actually run. In that case, the right semidominator is the ancestor from the DFSTree, which is the "virtual" -1 block. This resolves half of the issue in #53613: ```julia julia> let code = Any[ # block 1 GotoIfNot(Argument(2), 3), # block 2 ReturnNode(Argument(3)), # block 3 (we should visit this block) Expr(:call, throw, "potential throw"), ReturnNode(), # unreachable ] ir = make_ircode(code; slottypes=Any[Any,Bool,Bool]) visited = BitSet() @test !Core.Compiler.visit_conditional_successors(CC.LazyPostDomtree(ir), ir, #=bb=#1) do succ::Int push!(visited, succ) return false end @test 2 ∈ visited @test 3 ∈ visited end Test Passed ``` This needs some tests (esp. since I don't think we have any DomTree tests at all right now), but otherwise should be good to go.
1 parent 8f76c69 commit 2775c9a

File tree

1 file changed

+1
-4
lines changed

1 file changed

+1
-4
lines changed

base/compiler/ssair/domtree.jl

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -345,10 +345,7 @@ function SNCA!(domtree::GenericDomTree{IsPostDom}, blocks::Vector{BasicBlock}, m
345345
ancestors = copy(D.to_parent_pre)
346346
relevant_blocks = IsPostDom ? (1:max_pre) : (2:max_pre)
347347
for w::PreNumber in reverse(relevant_blocks)
348-
# LLVM initializes this to the parent, the paper initializes this to
349-
# `w`, but it doesn't really matter (the parent is a predecessor, so at
350-
# worst we'll discover it below). Save a memory reference here.
351-
semi_w = typemax(PreNumber)
348+
semi_w = ancestors[w]
352349
last_linked = PreNumber(w + 1)
353350
for v dom_edges(domtree, blocks, D.from_pre[w])
354351
# For the purpose of the domtree, ignore virtual predecessors into

0 commit comments

Comments
 (0)