From 5af96d3a495d950c57061cf6b19d1e3b88d39bc6 Mon Sep 17 00:00:00 2001 From: Adam Nemet Date: Fri, 19 Jun 2015 19:32:41 +0000 Subject: [PATCH] [LoopDist] Move pointer-to-partition computation out of RuntimeCheckEmitter, NFC This starts preparing the class to become a (more) general LoopVersioning utility class. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@240164 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Scalar/LoopDistribute.cpp | 30 ++++++++++-------------- 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/lib/Transforms/Scalar/LoopDistribute.cpp b/lib/Transforms/Scalar/LoopDistribute.cpp index a907d596e35..7e9efa25070 100644 --- a/lib/Transforms/Scalar/LoopDistribute.cpp +++ b/lib/Transforms/Scalar/LoopDistribute.cpp @@ -633,23 +633,14 @@ private: class RuntimeCheckEmitter { public: RuntimeCheckEmitter(const LoopAccessInfo &LAI, Loop *L, LoopInfo *LI, - DominatorTree *DT) - : OrigLoop(L), NonDistributedLoop(nullptr), LAI(LAI), LI(LI), DT(DT) {} - - /// \brief Given the \p Partitions formed by Loop Distribution, it determines - /// in which partition each pointer is used. - void partitionPointers(InstPartitionContainer &Partitions) { - // Set up partition id in PtrRtChecks. Ptr -> Access -> Intruction -> - // Partition. - PtrToPartition = Partitions.computePartitionSetForPointers(LAI); - - DEBUG(dbgs() << "\nPointers:\n"); - DEBUG(LAI.getRuntimePointerCheck()->print(dbgs(), 0, &PtrToPartition)); - } + DominatorTree *DT, + const SmallVector *PtrToPartition = nullptr) + : OrigLoop(L), NonDistributedLoop(nullptr), + PtrToPartition(PtrToPartition), LAI(LAI), LI(LI), DT(DT) {} /// \brief Returns true if we need memchecks to distribute the loop. bool needsRuntimeChecks() const { - return LAI.getRuntimePointerCheck()->needsAnyChecking(&PtrToPartition); + return LAI.getRuntimePointerCheck()->needsAnyChecking(PtrToPartition); } /// \brief Performs the CFG manipulation part of versioning the loop including @@ -660,7 +651,7 @@ public: // Add the memcheck in the original preheader (this is empty initially). BasicBlock *MemCheckBB = OrigLoop->getLoopPreheader(); std::tie(FirstCheckInst, MemRuntimeCheck) = - LAI.addRuntimeCheck(MemCheckBB->getTerminator(), &PtrToPartition); + LAI.addRuntimeCheck(MemCheckBB->getTerminator(), PtrToPartition); assert(MemRuntimeCheck && "called even though needsAnyChecking = false"); // Rename the block to make the IR more readable. @@ -733,10 +724,11 @@ private: Loop *NonDistributedLoop; /// \brief For each memory pointer it contains the partitionId it is used in. + /// If nullptr, no partitioning is used. /// /// The I-th entry corresponds to I-th entry in LAI.getRuntimePointerCheck(). /// If the pointer is used in multiple partitions the entry is set to -1. - SmallVector PtrToPartition; + const SmallVector *PtrToPartition; /// \brief This maps the instructions from OrigLoop to their counterpart in /// NonDistributedLoop. @@ -929,9 +921,11 @@ private: // If we need run-time checks to disambiguate pointers are run-time, version // the loop now. - RuntimeCheckEmitter RtCheckEmitter(LAI, L, LI, DT); - RtCheckEmitter.partitionPointers(Partitions); + auto PtrToPartition = Partitions.computePartitionSetForPointers(LAI); + RuntimeCheckEmitter RtCheckEmitter(LAI, L, LI, DT, &PtrToPartition); if (RtCheckEmitter.needsRuntimeChecks()) { + DEBUG(dbgs() << "\nPointers:\n"); + DEBUG(LAI.getRuntimePointerCheck()->print(dbgs(), 0, &PtrToPartition)); RtCheckEmitter.versionLoop(this); RtCheckEmitter.addPHINodes(DefsUsedOutside); } -- 2.34.1