[AMDGPU] Unify unreachable intrinsics
authorYaxun (Sam) Liu <yaxun.liu@amd.com>
Thu, 4 Aug 2022 03:27:17 +0000 (23:27 -0400)
committerYaxun (Sam) Liu <yaxun.liu@amd.com>
Tue, 9 Aug 2022 14:23:32 +0000 (10:23 -0400)
commite780648a15e67df92d6aee1fe68393f1edddf06d
treed6aa21ad871d97bc30c5830484a73ff356c69a94
parent4dece4007cc2fb261f29d14287836e28a355810a
[AMDGPU] Unify unreachable intrinsics

si-annotate-control-flow does depth first traversal of BB's of
a function to insert amdgcn if intrinsics for conditional
branches so that isel can generate correct instructions later.

si-annotate-control-flow checks whether the successor BB for the 'else'
branch of a conditional branch has been visited. If it has been
visited, si-annotate-control-flow assumes the conditional
branch has been handled and will not try to insert if intrinsic
for it.

This assumption is not correct when the IR contains multiple
unreachable BB's. Then 'if' intrinscs are not inserted and incorrect
ISA are generated.

This patch fixes the issue by let amdgpu-unify-divergent-exit-nodes
unify unreachables even if they are uniformly reached. In this way
the IR will not contain multiple exits, and structurizer is able to
structurize the IR containing one unified exit.

Reviewed by: Ruiling Song, Matt Arsenault

Differential Revision: https://reviews.llvm.org/D131181

Fixes: SWDEV-343244
llvm/lib/Target/AMDGPU/AMDGPUUnifyDivergentExitNodes.cpp
llvm/test/CodeGen/AMDGPU/GlobalISel/bool-legalization.ll
llvm/test/CodeGen/AMDGPU/si-unify-exit-multiple-unreachables.ll [new file with mode: 0644]
llvm/test/CodeGen/AMDGPU/skip-if-dead.ll
llvm/test/CodeGen/AMDGPU/switch-default-block-unreachable.ll