LLVM 20.0.0git
|
This class is used to constrain loops to run within a given iteration space. More...
#include "llvm/Transforms/Utils/LoopConstrainer.h"
Classes | |
struct | SubRanges |
Public Member Functions | |
LoopConstrainer (Loop &L, LoopInfo &LI, function_ref< void(Loop *, bool)> LPMAddNewLoop, const LoopStructure &LS, ScalarEvolution &SE, DominatorTree &DT, Type *T, SubRanges SR) | |
bool | run () |
This class is used to constrain loops to run within a given iteration space.
The algorithm this class implements is given a Loop and a range [Begin, End). The algorithm then tries to break out a "main loop" out of the loop it is given in a way that the "main loop" runs with the induction variable in a subset of [Begin, End). The algorithm emits appropriate pre and post loops to run any remaining iterations. The pre loop runs any iterations in which the induction variable is < Begin, and the post loop runs any iterations in which the induction variable is >= End.
Definition at line 95 of file LoopConstrainer.h.
LoopConstrainer::LoopConstrainer | ( | Loop & | L, |
LoopInfo & | LI, | ||
function_ref< void(Loop *, bool)> | LPMAddNewLoop, | ||
const LoopStructure & | LS, | ||
ScalarEvolution & | SE, | ||
DominatorTree & | DT, | ||
Type * | T, | ||
SubRanges | SR | ||
) |
Definition at line 460 of file LoopConstrainer.cpp.
bool LoopConstrainer::run | ( | ) |
At this point:
TODO: support unsigned predicate. To add NUW flag we need to prove that both operands of BO are non-negative. E.g: ... iv.next = add nsw i32 iv, -1 cmp = icmp ult i32 iv.next, n br i1 cmp, label loopexit, label loop
-1 is MAX_UINT in terms of unsigned int. Adding anything but zero will overflow, therefore NUW flag is not legal here.
Definition at line 726 of file LoopConstrainer.cpp.
References assert(), llvm::cannotBeMinInLoop(), llvm::dbgs(), DisableAllLoopOptsOnLoop(), llvm::SCEVExpander::expandCodeFor(), llvm::formLCSSARecursively(), llvm::ScalarEvolution::getAddExpr(), llvm::ScalarEvolution::getConstant(), llvm::Function::getDataLayout(), llvm::LoopBase< BlockT, LoopT >::getLoopPreheader(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), llvm::LoopBase< BlockT, LoopT >::getParentLoop(), llvm::BasicBlock::getTerminator(), llvm::LoopStructure::Header, llvm::LoopConstrainer::SubRanges::HighLimit, llvm::LoopStructure::IndVarBase, llvm::LoopStructure::IndVarIncreasing, llvm::SCEVExpander::isSafeToExpandAt(), llvm::LoopStructure::IsSignedPredicate, LLVM_DEBUG, llvm::LoopConstrainer::SubRanges::LowLimit, llvm::DominatorTreeBase< NodeT, IsPostDom >::recalculate(), llvm::User::replaceUsesOfWith(), llvm::Value::setName(), and llvm::simplifyLoop().