[polly] r273855 - This patch updates memory management of ScopBuilder class.

Johannes Doerfert via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 27 02:25:41 PDT 2016


Author: jdoerfert
Date: Mon Jun 27 04:25:40 2016
New Revision: 273855

URL: http://llvm.org/viewvc/llvm-project?rev=273855&view=rev
Log:
This patch updates memory management of ScopBuilder class.

  1. SCoP object is not owned by ScopBuilder. It just creates a SCoP and
     hand over ownership through getScop() method.
  2. ScopInfoRegionPass owns the SCoP object for a given region.

Patch by Utpal Bora <cs14mtech11017 at iith.ac.in>

Differential Revision: http://reviews.llvm.org/D20912

Modified:
    polly/trunk/include/polly/ScopInfo.h
    polly/trunk/lib/Analysis/ScopInfo.cpp

Modified: polly/trunk/include/polly/ScopInfo.h
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/ScopInfo.h?rev=273855&r1=273854&r2=273855&view=diff
==============================================================================
--- polly/trunk/include/polly/ScopInfo.h (original)
+++ polly/trunk/include/polly/ScopInfo.h Mon Jun 27 04:25:40 2016
@@ -2288,9 +2288,6 @@ class ScopBuilder {
   // The Scop
   std::unique_ptr<Scop> scop;
 
-  // Clear the context.
-  void clear();
-
   // Build the SCoP for Region @p R.
   void buildScop(Region &R, AssumptionCache &AC);
 
@@ -2485,18 +2482,16 @@ public:
   /// @brief Try to build the Polly IR of static control part on the current
   ///        SESE-Region.
   ///
-  /// @return If the current region is a valid for a static control part,
-  ///         return the Polly IR representing this static control part,
-  ///         return null otherwise.
-  Scop *getScop() { return scop.get(); }
-  const Scop *getScop() const { return scop.get(); }
+  /// @return Give up the ownership of the scop object or static control part
+  ///         for the region
+  std::unique_ptr<Scop> getScop() { return std::move(scop); }
 };
 
 /// @brief The legacy pass manager's analysis pass to compute scop information
 ///        for a region.
 class ScopInfoRegionPass : public RegionPass {
-  /// @brief The ScopBuilder pointer which is used to construct a Scop.
-  std::unique_ptr<ScopBuilder> SI;
+  /// @brief The Scop pointer which is used to construct a Scop.
+  std::unique_ptr<Scop> S;
 
 public:
   static char ID; // Pass identification, replacement for typeid
@@ -2504,27 +2499,19 @@ public:
   ScopInfoRegionPass() : RegionPass(ID) {}
   ~ScopInfoRegionPass() {}
 
-  /// @brief Build ScopBuilder object, which constructs Polly IR of static
-  ///        control part for the current SESE-Region.
+  /// @brief Build Scop object, the Polly IR of static control
+  ///        part for the current SESE-Region.
   ///
-  /// @return Return Scop for the current Region.
-  Scop *getScop() {
-    if (SI)
-      return SI.get()->getScop();
-    else
-      return nullptr;
-  }
-  const Scop *getScop() const {
-    if (SI)
-      return SI.get()->getScop();
-    else
-      return nullptr;
-  }
+  /// @return If the current region is a valid for a static control part,
+  ///         return the Polly IR representing this static control part,
+  ///         return null otherwise.
+  Scop *getScop() { return S.get(); }
+  const Scop *getScop() const { return S.get(); }
 
   /// @brief Calculate the polyhedral scop information for a given Region.
   bool runOnRegion(Region *R, RGPassManager &RGM) override;
 
-  void releaseMemory() override { SI.reset(); }
+  void releaseMemory() override { S.reset(); }
 
   void print(raw_ostream &O, const Module *M = nullptr) const override;
 

Modified: polly/trunk/lib/Analysis/ScopInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopInfo.cpp?rev=273855&r1=273854&r2=273855&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopInfo.cpp (original)
+++ polly/trunk/lib/Analysis/ScopInfo.cpp Mon Jun 27 04:25:40 2016
@@ -4881,8 +4881,6 @@ ScopBuilder::ScopBuilder(Region *R, Assu
   emitOptimizationRemarkAnalysis(F->getContext(), DEBUG_TYPE, *F, End, Msg);
 }
 
-void ScopBuilder::clear() { scop.reset(); }
-
 //===----------------------------------------------------------------------===//
 void ScopInfoRegionPass::getAnalysisUsage(AnalysisUsage &AU) const {
   AU.addRequired<LoopInfoWrapperPass>();
@@ -4909,19 +4907,16 @@ bool ScopInfoRegionPass::runOnRegion(Reg
   auto &DT = getAnalysis<DominatorTreeWrapperPass>().getDomTree();
   auto &AC = getAnalysis<AssumptionCacheTracker>().getAssumptionCache(*F);
 
-  SI.reset(new ScopBuilder(R, AC, AA, DL, DT, LI, SD, SE));
+  ScopBuilder SB(R, AC, AA, DL, DT, LI, SD, SE);
+  S = SB.getScop(); // take ownership of scop object
   return false;
 }
 
 void ScopInfoRegionPass::print(raw_ostream &OS, const Module *) const {
-  Scop *scop;
-  if (SI) {
-    if ((scop = SI->getScop())) {
-      scop->print(OS);
-      return;
-    }
-  }
-  OS << "Invalid Scop!\n";
+  if (S)
+    S->print(OS);
+  else
+    OS << "Invalid Scop!\n";
 }
 
 char ScopInfoRegionPass::ID = 0;




More information about the llvm-commits mailing list