[all-commits] [llvm/llvm-project] 3cbbde: Introduce unify-loop-exits pass.

Sameer Sahasrabuddhe via All-commits all-commits at lists.llvm.org
Mon Mar 30 10:24:43 PDT 2020


  Branch: refs/heads/master
  Home:   https://github.com/llvm/llvm-project
  Commit: 3cbbded68c260ea5574798ca444b3feecfbbcd70
      https://github.com/llvm/llvm-project/commit/3cbbded68c260ea5574798ca444b3feecfbbcd70
  Author: Sameer Sahasrabuddhe <sameer.sahasrabuddhe at amd.com>
  Date:   2020-03-30 (Mon, 30 Mar 2020)

  Changed paths:
    M llvm/include/llvm/InitializePasses.h
    M llvm/include/llvm/LinkAllPasses.h
    M llvm/include/llvm/Transforms/Utils.h
    M llvm/include/llvm/Transforms/Utils/BasicBlockUtils.h
    M llvm/include/llvm/Transforms/Utils/Local.h
    M llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp
    M llvm/lib/Transforms/Scalar/StructurizeCFG.cpp
    M llvm/lib/Transforms/Utils/BasicBlockUtils.cpp
    M llvm/lib/Transforms/Utils/CMakeLists.txt
    M llvm/lib/Transforms/Utils/Local.cpp
    A llvm/lib/Transforms/Utils/UnifyLoopExits.cpp
    M llvm/lib/Transforms/Utils/Utils.cpp
    M llvm/test/CodeGen/AMDGPU/loop_break.ll
    A llvm/test/Transforms/StructurizeCFG/workarounds/needs-unified-loop-exits.ll
    A llvm/test/Transforms/UnifyLoopExits/basic.ll
    A llvm/test/Transforms/UnifyLoopExits/nested.ll
    A llvm/test/Transforms/UnifyLoopExits/restore-ssa.ll
    A llvm/test/Transforms/UnifyLoopExits/switch.ll
    M llvm/tools/llc/llc.cpp

  Log Message:
  -----------
  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




More information about the All-commits mailing list