Skip to content

Commit

Permalink
This patch updates memory management of ScopBuilder class.
Browse files Browse the repository at this point in the history
  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@iith.ac.in>

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

llvm-svn: 273855
  • Loading branch information
Johannes Doerfert committed Jun 27, 2016
1 parent efb0b89 commit b7e9713
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 37 deletions.
39 changes: 13 additions & 26 deletions polly/include/polly/ScopInfo.h
Expand Up @@ -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);

Expand Down Expand Up @@ -2485,46 +2482,36 @@ class ScopBuilder {
/// @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

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;

Expand Down
17 changes: 6 additions & 11 deletions polly/lib/Analysis/ScopInfo.cpp
Expand Up @@ -4881,8 +4881,6 @@ ScopBuilder::ScopBuilder(Region *R, AssumptionCache &AC, AliasAnalysis &AA,
emitOptimizationRemarkAnalysis(F->getContext(), DEBUG_TYPE, *F, End, Msg);
}

void ScopBuilder::clear() { scop.reset(); }

//===----------------------------------------------------------------------===//
void ScopInfoRegionPass::getAnalysisUsage(AnalysisUsage &AU) const {
AU.addRequired<LoopInfoWrapperPass>();
Expand All @@ -4909,19 +4907,16 @@ bool ScopInfoRegionPass::runOnRegion(Region *R, RGPassManager &RGM) {
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;
Expand Down

0 comments on commit b7e9713

Please sign in to comment.