From bd426c622e694f4d792ed1f2d916fffd17b69645 Mon Sep 17 00:00:00 2001 From: Adam Nemet Date: Tue, 28 Jul 2015 05:01:53 +0000 Subject: [PATCH] [LDist][LVer] Explicitly pass the set of memchecks to LoopVersioning, NFC Before the patch, the checks were generated internally in addRuntimeCheck. Now, we use the new overloaded version of addRuntimeCheck that takes the ready-made set of checks as a parameter. The checks are now generated by the client (LoopDistribution) with the new RuntimePointerChecking::generateChecks API. Also the new printChecks API is used to print out the checks for debugging. This is to continue the transition over to the new model whereby clients will get the full set of checks from LAA, filter it and then pass it to LoopVersioning and in turn to addRuntimeCheck. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@243382 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Transforms/Utils/LoopVersioning.h | 6 +++++- lib/Transforms/Scalar/LoopDistribute.cpp | 8 +++++--- lib/Transforms/Utils/LoopVersioning.cpp | 11 ++++++----- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/include/llvm/Transforms/Utils/LoopVersioning.h b/include/llvm/Transforms/Utils/LoopVersioning.h index 009fba48c6a..077ae2a11bf 100644 --- a/include/llvm/Transforms/Utils/LoopVersioning.h +++ b/include/llvm/Transforms/Utils/LoopVersioning.h @@ -31,7 +31,8 @@ class LoopInfo; /// already has a preheader. class LoopVersioning { public: - LoopVersioning(const LoopAccessInfo &LAI, Loop *L, LoopInfo *LI, + LoopVersioning(SmallVector Checks, + const LoopAccessInfo &LAI, Loop *L, LoopInfo *LI, DominatorTree *DT, const SmallVector *PtrToPartition = nullptr); @@ -90,6 +91,9 @@ private: /// in NonVersionedLoop. ValueToValueMapTy VMap; + /// \brief The set of checks that we are versioning for. + SmallVector Checks; + /// \brief Analyses used. const LoopAccessInfo &LAI; LoopInfo *LI; diff --git a/lib/Transforms/Scalar/LoopDistribute.cpp b/lib/Transforms/Scalar/LoopDistribute.cpp index 96ac582525d..5ad4a454ce4 100644 --- a/lib/Transforms/Scalar/LoopDistribute.cpp +++ b/lib/Transforms/Scalar/LoopDistribute.cpp @@ -747,10 +747,12 @@ private: // 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); } diff --git a/lib/Transforms/Utils/LoopVersioning.cpp b/lib/Transforms/Utils/LoopVersioning.cpp index 832079d2cf6..b2182bd6409 100644 --- a/lib/Transforms/Utils/LoopVersioning.cpp +++ b/lib/Transforms/Utils/LoopVersioning.cpp @@ -22,11 +22,12 @@ using namespace llvm; -LoopVersioning::LoopVersioning(const LoopAccessInfo &LAI, Loop *L, LoopInfo *LI, - DominatorTree *DT, - const SmallVector *PtrToPartition) +LoopVersioning::LoopVersioning( + SmallVector Checks, + const LoopAccessInfo &LAI, Loop *L, LoopInfo *LI, DominatorTree *DT, + const SmallVector *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"); } @@ -41,7 +42,7 @@ void LoopVersioning::versionLoop(Pass *P) { // 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. -- 2.34.1