post-opt: add more test cases for `visit_conditional_successors` (#53642)
This commit fixes the first problem that was found while digging into
JuliaLang/julia#53613. It turns out that the post-domtree constructed
from regular `IRCode` doesn't work for visiting conditional successors
for post-opt analysis in cases like:
```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 Failed at REPL[14]:16
Expression: 2 ∉ visited
Evaluated: 2 ∉ BitSet([2])
```
This might mean that we need to fix on the `postdominates` end, but for
now, this commit tries to get around it by using the augmented post
domtree in `visit_conditional_successors`. Since the augmented post
domtree is enforced to have a single return, we can keep using the
current `postdominates` to fix the issue.
However, this commit isn't enough to fix the NeuralNetworkReachability
segfault as reported in #53613, and we need to tackle the second issue
reported there too
(https://github.com/JuliaLang/julia/issues/53613#issuecomment-1983243419).