Index: polly/include/polly/ScopBuilder.h =================================================================== --- polly/include/polly/ScopBuilder.h +++ polly/include/polly/ScopBuilder.h @@ -383,6 +383,9 @@ BasicBlock *IncomingBlock, Value *IncomingValue, bool IsExitBlock); + /// Add user provided parameter constraints to context (command line). + void addUserContext(); + /// Add all recorded assumptions to the assumed context. void addRecordedAssumptions(); Index: polly/include/polly/ScopInfo.h =================================================================== --- polly/include/polly/ScopInfo.h +++ polly/include/polly/ScopInfo.h @@ -2038,9 +2038,6 @@ void addUserAssumptions(AssumptionCache &AC, DominatorTree &DT, LoopInfo &LI, DenseMap &InvalidDomainMap); - /// Add user provided parameter constraints to context (command line). - void addUserContext(); - /// Add the bounds of the parameters to the context. void addParameterBounds(); Index: polly/lib/Analysis/ScopBuilder.cpp =================================================================== --- polly/lib/Analysis/ScopBuilder.cpp +++ polly/lib/Analysis/ScopBuilder.cpp @@ -114,6 +114,11 @@ cl::desc("Count statements with scalar accesses as not optimizable"), cl::Hidden, cl::init(false), cl::cat(PollyCategory)); +static cl::opt UserContextStr( + "polly-context", cl::value_desc("isl parameter set"), + cl::desc("Provide additional constraints on the context parameters"), + cl::init(""), cl::cat(PollyCategory)); + static cl::opt DetectFortranArrays( "polly-detect-fortran-arrays", cl::desc("Detect Fortran arrays and use this for code generation"), @@ -1455,6 +1460,45 @@ return false; } +void ScopBuilder::addUserContext() { + if (UserContextStr.empty()) + return; + + isl::set UserContext = isl::set(scop->getIslCtx(), UserContextStr.c_str()); + isl::space Space = scop->getParamSpace(); + if (Space.dim(isl::dim::param) != UserContext.dim(isl::dim::param)) { + std::string SpaceStr = Space.to_str(); + errs() << "Error: the context provided in -polly-context has not the same " + << "number of dimensions than the computed context. Due to this " + << "mismatch, the -polly-context option is ignored. Please provide " + << "the context in the parameter space: " << SpaceStr << ".\n"; + return; + } + + for (unsigned i = 0; i < Space.dim(isl::dim::param); i++) { + std::string NameContext = + scop->getContext().get_dim_name(isl::dim::param, i); + std::string NameUserContext = UserContext.get_dim_name(isl::dim::param, i); + + if (NameContext != NameUserContext) { + std::string SpaceStr = Space.to_str(); + errs() << "Error: the name of dimension " << i + << " provided in -polly-context " + << "is '" << NameUserContext << "', but the name in the computed " + << "context is '" << NameContext + << "'. Due to this name mismatch, " + << "the -polly-context option is ignored. Please provide " + << "the context in the parameter space: " << SpaceStr << ".\n"; + return; + } + + UserContext = UserContext.set_dim_id(isl::dim::param, i, + Space.get_dim_id(isl::dim::param, i)); + } + isl::set newContext = scop->getContext().intersect(UserContext); + scop->setContext(newContext); +} + isl::set ScopBuilder::getNonHoistableCtx(MemoryAccess *Access, isl::union_map Writes) { // TODO: Loads that are not loop carried, hence are in a statement with @@ -2370,7 +2414,7 @@ scop->finalizeAccesses(); scop->realignParams(); - scop->addUserContext(); + addUserContext(); // After the context was fully constructed, thus all our knowledge about // the parameters is in there, we add all recorded assumptions to the Index: polly/lib/Analysis/ScopInfo.cpp =================================================================== --- polly/lib/Analysis/ScopInfo.cpp +++ polly/lib/Analysis/ScopInfo.cpp @@ -122,11 +122,6 @@ cl::desc("Do not emit remarks about assumptions that are known"), cl::Hidden, cl::ZeroOrMore, cl::init(false), cl::cat(PollyCategory)); -static cl::opt UserContextStr( - "polly-context", cl::value_desc("isl parameter set"), - cl::desc("Provide additional constraints on the context parameters"), - cl::init(""), cl::cat(PollyCategory)); - static cl::opt IslOnErrorAbort("polly-on-isl-error-abort", cl::desc("Abort if an isl error is encountered"), @@ -2017,44 +2012,6 @@ } } -void Scop::addUserContext() { - if (UserContextStr.empty()) - return; - - isl::set UserContext = isl::set(getIslCtx(), UserContextStr.c_str()); - isl::space Space = getParamSpace(); - if (Space.dim(isl::dim::param) != UserContext.dim(isl::dim::param)) { - std::string SpaceStr = Space.to_str(); - errs() << "Error: the context provided in -polly-context has not the same " - << "number of dimensions than the computed context. Due to this " - << "mismatch, the -polly-context option is ignored. Please provide " - << "the context in the parameter space: " << SpaceStr << ".\n"; - return; - } - - for (unsigned i = 0; i < Space.dim(isl::dim::param); i++) { - std::string NameContext = Context.get_dim_name(isl::dim::param, i); - std::string NameUserContext = UserContext.get_dim_name(isl::dim::param, i); - - if (NameContext != NameUserContext) { - std::string SpaceStr = Space.to_str(); - errs() << "Error: the name of dimension " << i - << " provided in -polly-context " - << "is '" << NameUserContext << "', but the name in the computed " - << "context is '" << NameContext - << "'. Due to this name mismatch, " - << "the -polly-context option is ignored. Please provide " - << "the context in the parameter space: " << SpaceStr << ".\n"; - return; - } - - UserContext = UserContext.set_dim_id(isl::dim::param, i, - Space.get_dim_id(isl::dim::param, i)); - } - - Context = Context.intersect(UserContext); -} - void Scop::buildContext() { isl::space Space = isl::space::params_alloc(getIslCtx(), 0); Context = isl::set::universe(Space);