llvm-project/llvm/test/Transforms/StructurizeCFG
Sameer Sahasrabuddhe 3cbbded68c Introduce unify-loop-exits pass.
For each natural loop with multiple exit blocks, this pass creates a
new block N such that all exiting blocks now branch to N, and then
control flow is redistributed to all the original exit blocks.

The bulk of the tranformation is a new function introduced in
BasicBlockUtils that an redirect control flow from a set of incoming
blocks to a set of outgoing blocks via a common "hub".

This is a useful workaround for a limitation in the structurizer which
incorrectly orders blocks when processing a nest of loops. This pass
bypasses that issue by ensuring that each natural loop is recognized
as a separate region. Since the structurizer is a region pass, it no
longer sees a nest of loops in a single region, and instead processes
each "level" in the nesting as a separate region.

The AMDGPU backend provides a new option to enable this pass before
the structurizer, which may eventually be enabled by default.

Reviewers: madhur13490, arsenm, nhaehnle

Reviewed By: nhaehnle

Differential Revision: https://reviews.llvm.org/D75865
2020-03-30 13:23:56 -04:00
..
AMDGPU StructurizeCFG: simplify phi nodes when possible 2020-03-05 10:33:15 +05:30
workarounds Introduce unify-loop-exits pass. 2020-03-30 13:23:56 -04:00
branch-on-argument.ll
bug36015.ll
invert-condition.ll
invert-constantexpr.ll
loop-continue-phi.ll
loop-multiple-exits.ll
nested-loop-order.ll
no-branch-to-entry.ll
one-loop-multiple-backedges.ll
post-order-traversal-bug.ll
rebuild-ssa-infinite-loop.ll AMDGPU: Update more tests to use modern buffer intrinsics 2020-01-16 14:29:38 -05:00
switch.ll