Skip to content

Commit a03c5cd

Browse files
committed
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 27a0143 commit a03c5cd

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
@@ -332,10 +332,7 @@ function SNCA!(domtree::GenericDomTree{IsPostDom}, blocks::Vector{BasicBlock}, m
332332
ancestors = copy(D.to_parent_pre)
333333
relevant_blocks = IsPostDom ? (1:max_pre) : (2:max_pre)
334334
for w::PreNumber in reverse(relevant_blocks)
335-
# LLVM initializes this to the parent, the paper initializes this to
336-
# `w`, but it doesn't really matter (the parent is a predecessor, so at
337-
# worst we'll discover it below). Save a memory reference here.
338-
semi_w = typemax(PreNumber)
335+
semi_w = ancestors[w]
339336
last_linked = PreNumber(w + 1)
340337
for v dom_edges(domtree, blocks, D.from_pre[w])
341338
# For the purpose of the domtree, ignore virtual predecessors into

0 commit comments

Comments
 (0)