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@iith.ac.in>

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

llvm-svn: 273855
This commit is contained in:
Johannes Doerfert 2016-06-27 09:25:40 +00:00
parent efb0b899d3
commit b7e9713563
2 changed files with 19 additions and 37 deletions

View File

@ -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;

View File

@ -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>();
@ -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;