[SI] Create Scop Name lazily

Summary: Creating the Scop name is expensive, because creating the
Region name it's derived from is expensive. So create the name lazily,
because getName() is actually called rarely.

This is a reiteration of r328666, which introduced a use-after-free and
got reverted in r331363.

Differential Revision: https://reviews.llvm.org/D46868

llvm-svn: 332359
This commit is contained in:
Philip Pfaffe 2018-05-15 14:53:25 +00:00
parent 8652c53d29
commit d477bb9a50
2 changed files with 9 additions and 4 deletions

View File

@ -25,6 +25,7 @@
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/DenseSet.h"
#include "llvm/ADT/MapVector.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/SetVector.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringMap.h"
@ -1717,7 +1718,7 @@ private:
Region &R;
/// The name of the SCoP (identical to the regions name)
std::string name;
Optional<std::string> name;
/// The ID to be assigned to the next Scop in a function
static int NextScopID;
@ -2455,7 +2456,11 @@ public:
/// could be executed.
bool isEmpty() const { return Stmts.empty(); }
const StringRef getName() const { return name; }
StringRef getName() {
if (!name)
name = R.getNameStr();
return *name;
}
using array_iterator = ArrayInfoSetTy::iterator;
using const_array_iterator = ArrayInfoSetTy::const_iterator;

View File

@ -3328,8 +3328,8 @@ Scop::Scop(Region &R, ScalarEvolution &ScalarEvolution, LoopInfo &LI,
DominatorTree &DT, ScopDetection::DetectionContext &DC,
OptimizationRemarkEmitter &ORE)
: IslCtx(isl_ctx_alloc(), isl_ctx_free), SE(&ScalarEvolution), DT(&DT),
R(R), name(R.getNameStr()), HasSingleExitEdge(R.getExitingBlock()),
DC(DC), ORE(ORE), Affinator(this, LI),
R(R), name(None), HasSingleExitEdge(R.getExitingBlock()), DC(DC),
ORE(ORE), Affinator(this, LI),
ID(getNextID((*R.getEntry()->getParent()).getName().str())) {
if (IslOnErrorAbort)
isl_options_set_on_error(getIslCtx().get(), ISL_ON_ERROR_ABORT);