bool UseDependencies);
/// \brief Returns the checks that generateChecks created.
- const SmallVectorImpl<PointerCheck> &getChecks() const { return Checks; }
+ const SmallVector<PointerCheck, 4> &getChecks() const { return Checks; }
/// \brief Decide if we need to add a check between two groups of pointers,
/// according to needsChecking.
/// already has a preheader.
class LoopVersioning {
public:
+ /// \brief Expects MemCheck, LoopAccessInfo, Loop, LoopInfo, DominatorTree
+ /// as input. It uses runtime check provided by user.
LoopVersioning(SmallVector<RuntimePointerChecking::PointerCheck, 4> Checks,
const LoopAccessInfo &LAI, Loop *L, LoopInfo *LI,
DominatorTree *DT);
+ /// \brief Expects LoopAccessInfo, Loop, LoopInfo, DominatorTree as input.
+ /// It uses default runtime check provided by LoopAccessInfo.
+ LoopVersioning(const LoopAccessInfo &LAInfo, Loop *L, LoopInfo *LI,
+ DominatorTree *DT);
+
/// \brief Performs the CFG manipulation part of versioning the loop including
/// the DominatorTree and LoopInfo updates.
///
assert(L->getLoopPreheader() && "No preheader");
}
+LoopVersioning::LoopVersioning(const LoopAccessInfo &LAInfo, Loop *L,
+ LoopInfo *LI, DominatorTree *DT)
+ : VersionedLoop(L), NonVersionedLoop(nullptr),
+ Checks(LAInfo.getRuntimePointerChecking()->getChecks()), LAI(LAInfo),
+ LI(LI), DT(DT) {
+ assert(L->getExitBlock() && "No single exit block");
+ assert(L->getLoopPreheader() && "No preheader");
+}
+
void LoopVersioning::versionLoop(Pass *P) {
Instruction *FirstCheckInst;
Instruction *MemRuntimeCheck;