nir/dead_cf: Remove if statement if one branch has infinite loop
If one branch has infinite loop it's not enough to remove this branch. Removing it may break previous optimizations which were made on assumption that the branch with infinite loop doesn't dominate other blocks.
Closes: #2357 (closed)
No regressions in CI: https://mesa-ci.01.org/global_logic/builds/244/group/63a9f0ea7bb98050796b649e85481845
Consider such NIR:
vec1 1 ssa_1 = ...
if ssa_1 {
block block_2:
vec2 32 ssa_2 = %some_calculation_result%
vec2 32 ssa_3 = intrinsic load_deref (ssa_2)
} else {
block block_3:
loop {
block block_4:
}
}
vec1 1 ssa_4 = load_const (true)
if ssa_4 {
block_6:
vec1 32 ssa_5 = intrinsic load_deref (ssa_2)
}
Here while ssa_2
is defined in one of the branches it's ok for block_6
to use it since other branch doesn't dominate anything. Previously opt_dead_cf
removed the loop, breaking previous assumption. With my changes if statement is removed leaving only the contents of the branch without the infinite loop.