![]() 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 |
||
---|---|---|
.. | ||
AMDGPU | ||
workarounds | ||
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 | ||
switch.ll |