/// already has a preheader.
class LoopVersioning {
public:
- LoopVersioning(const LoopAccessInfo &LAI, Loop *L, LoopInfo *LI,
+ LoopVersioning(SmallVector<RuntimePointerChecking::PointerCheck, 4> Checks,
+ const LoopAccessInfo &LAI, Loop *L, LoopInfo *LI,
DominatorTree *DT,
const SmallVector<int, 8> *PtrToPartition = nullptr);
/// in NonVersionedLoop.
ValueToValueMapTy VMap;
+ /// \brief The set of checks that we are versioning for.
+ SmallVector<RuntimePointerChecking::PointerCheck, 4> Checks;
+
/// \brief Analyses used.
const LoopAccessInfo &LAI;
LoopInfo *LI;
// If we need run-time checks to disambiguate pointers are run-time, version
// the loop now.
auto PtrToPartition = Partitions.computePartitionSetForPointers(LAI);
- LoopVersioning LVer(LAI, L, LI, DT, &PtrToPartition);
- if (LVer.needsRuntimeChecks()) {
+ auto Checks =
+ LAI.getRuntimePointerChecking()->generateChecks(&PtrToPartition);
+ if (!Checks.empty()) {
DEBUG(dbgs() << "\nPointers:\n");
- DEBUG(LAI.getRuntimePointerChecking()->print(dbgs(), 0, &PtrToPartition));
+ DEBUG(LAI.getRuntimePointerChecking()->printChecks(dbgs(), Checks));
+ LoopVersioning LVer(std::move(Checks), LAI, L, LI, DT);
LVer.versionLoop(this);
LVer.addPHINodes(DefsUsedOutside);
}
using namespace llvm;
-LoopVersioning::LoopVersioning(const LoopAccessInfo &LAI, Loop *L, LoopInfo *LI,
- DominatorTree *DT,
- const SmallVector<int, 8> *PtrToPartition)
+LoopVersioning::LoopVersioning(
+ SmallVector<RuntimePointerChecking::PointerCheck, 4> Checks,
+ const LoopAccessInfo &LAI, Loop *L, LoopInfo *LI, DominatorTree *DT,
+ const SmallVector<int, 8> *PtrToPartition)
: VersionedLoop(L), NonVersionedLoop(nullptr),
- PtrToPartition(PtrToPartition), LAI(LAI), LI(LI), DT(DT) {
+ PtrToPartition(PtrToPartition), Checks(Checks), LAI(LAI), LI(LI), DT(DT) {
assert(L->getExitBlock() && "No single exit block");
assert(L->getLoopPreheader() && "No preheader");
}
// Add the memcheck in the original preheader (this is empty initially).
BasicBlock *MemCheckBB = VersionedLoop->getLoopPreheader();
std::tie(FirstCheckInst, MemRuntimeCheck) =
- LAI.addRuntimeCheck(MemCheckBB->getTerminator(), PtrToPartition);
+ LAI.addRuntimeCheck(MemCheckBB->getTerminator(), Checks);
assert(MemRuntimeCheck && "called even though needsAnyChecking = false");
// Rename the block to make the IR more readable.