LLVM 20.0.0git
|
This pass transforms loops that contain branches or switches on loop- invariant conditions to have multiple loops. More...
#include "llvm/Transforms/Scalar/SimpleLoopUnswitch.h"
Public Member Functions | |
SimpleLoopUnswitchPass (bool NonTrivial=false, bool Trivial=true) | |
PreservedAnalyses | run (Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U) |
void | printPipeline (raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName) |
Public Member Functions inherited from llvm::PassInfoMixin< SimpleLoopUnswitchPass > | |
void | printPipeline (raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName) |
Additional Inherited Members | |
Static Public Member Functions inherited from llvm::PassInfoMixin< SimpleLoopUnswitchPass > | |
static StringRef | name () |
Gets the name of the pass we are mixed into. | |
This pass transforms loops that contain branches or switches on loop- invariant conditions to have multiple loops.
For example, it turns the left into the right code:
for (...) if (lic) A for (...) if (lic) A; B; C B else C for (...) A; C
This can increase the size of the code exponentially (doubling it every time a loop is unswitched) so we only unswitch if the resultant code will be smaller than a threshold.
This pass expects LICM to be run before it to hoist invariant conditions out of the loop, to make the unswitching opportunity obvious.
There is a taxonomy of unswitching that we use to classify different forms of this transformaiton:
This pass always does trivial, full unswitching for both branches and switches. For branches, it also always does trivial, partial unswitching.
If enabled (via the constructor's NonTrivial
parameter), this pass will additionally do non-trivial, full unswitching for branches and switches, and will do non-trivial, partial unswitching for branches.
Because partial unswitching of switches is extremely unlikely to be possible in practice and significantly complicates the implementation, this pass does not currently implement that in any mode.
Definition at line 68 of file SimpleLoopUnswitch.h.
|
inline |
Definition at line 73 of file SimpleLoopUnswitch.h.
void SimpleLoopUnswitchPass::printPipeline | ( | raw_ostream & | OS, |
function_ref< StringRef(StringRef)> | MapClassName2PassName | ||
) |
Definition at line 3718 of file SimpleLoopUnswitch.cpp.
References OS, and printPipeline().
Referenced by printPipeline().
PreservedAnalyses SimpleLoopUnswitchPass::run | ( | Loop & | L, |
LoopAnalysisManager & | AM, | ||
LoopStandardAnalysisResults & | AR, | ||
LPMUpdater & | U | ||
) |
Definition at line 3682 of file SimpleLoopUnswitch.cpp.
References llvm::LoopStandardAnalysisResults::AA, llvm::LoopStandardAnalysisResults::AC, llvm::PreservedAnalyses::all(), assert(), llvm::LoopStandardAnalysisResults::BFI, llvm::dbgs(), llvm::LoopStandardAnalysisResults::DT, F, llvm::getLoopPassPreservedAnalyses(), llvm::AnalysisManager< IRUnitT, ExtraArgTs >::getResult(), llvm::LoopStandardAnalysisResults::LI, LLVM_DEBUG, llvm::LoopStandardAnalysisResults::MSSA, llvm::LoopStandardAnalysisResults::SE, llvm::LoopStandardAnalysisResults::TTI, unswitchLoop(), llvm::DominatorTreeBase< NodeT, IsPostDom >::verify(), llvm::MemorySSA::verifyMemorySSA(), and llvm::VerifyMemorySSA.