ScopInfo: Simplify the construction of the iteration domain.
llvm-svn: 141325
diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp
index 0f21ad3..5d898fc 100644
--- a/polly/lib/Analysis/ScopInfo.cpp
+++ b/polly/lib/Analysis/ScopInfo.cpp
@@ -81,7 +81,7 @@
public:
static isl_pw_aff *getPwAff(const ScopStmt *stmt, const SCEV *scev,
- const Value *baseAddress) {
+ const Value *baseAddress = 0) {
SCEVAffinator Affinator(stmt, baseAddress);
return Affinator.visit(scev);
}
@@ -632,56 +632,32 @@
return set;
}
-isl_set *ScopStmt::toUpperLoopBound(const SCEVAffFunc &UpperBound,
- isl_space *Space,
- unsigned BoundedDimension) const {
- // FIXME: We should choose a consistent scheme of when to name the dimensions.
- isl_space *UnnamedSpace = isl_space_copy(Space);
- UnnamedSpace = isl_space_set_tuple_name(UnnamedSpace, isl_dim_set, 0);
- isl_local_space *LocalSpace = isl_local_space_from_space(UnnamedSpace);
- isl_aff *LAff = isl_aff_set_coefficient_si(isl_aff_zero_on_domain(LocalSpace),
- isl_dim_in, BoundedDimension, 1);
- isl_pw_aff *BoundedSpace = isl_pw_aff_from_aff(LAff);
- isl_pw_aff *Bound = SCEVAffinator::getPwAff(this, UpperBound.OriginalSCEV, 0);
- isl_set *set = isl_pw_aff_le_set(BoundedSpace, Bound);
- set = isl_set_set_tuple_name(set, isl_space_get_tuple_name(Space, isl_dim_set));
- isl_space_free(Space);
- return set;
-}
-
void ScopStmt::buildIterationDomainFromLoops(TempScop &tempScop) {
isl_space *Space = isl_space_set_alloc(getIslCtx(), 0, getNumIterators());
- Space = isl_space_set_tuple_name(Space, isl_dim_set, getBaseName());
Domain = isl_set_universe(isl_space_copy(Space));
Domain = isl_set_align_params(Domain, Parent.getParamSpace());
-
- isl_int v;
- isl_int_init(v);
-
- isl_local_space *LocalSpace;
- LocalSpace = isl_local_space_from_space(isl_space_copy(Space));
+ isl_local_space *LocalSpace = isl_local_space_from_space(Space);
for (int i = 0, e = getNumIterators(); i != e; ++i) {
- // Lower bound: IV >= 0.
- isl_basic_set *bset = isl_basic_set_universe(isl_space_copy(Space));
- isl_constraint *c = isl_inequality_alloc(isl_local_space_copy(LocalSpace));
- isl_int_set_si(v, 1);
- isl_constraint_set_coefficient(c, isl_dim_set, i, v);
- bset = isl_basic_set_add_constraint(bset, c);
- Domain = isl_set_intersect(Domain, isl_set_from_basic_set(bset));
+ isl_aff *Zero = isl_aff_zero_on_domain(isl_local_space_copy(LocalSpace));
+ isl_pw_aff *IV = isl_pw_aff_from_aff(
+ isl_aff_set_coefficient_si(Zero, isl_dim_in, i, 1));
- // Upper bound: IV <= NumberOfIterations.
+ // 0 <= IV.
+ isl_set *LowerBound = isl_pw_aff_nonneg_set(isl_pw_aff_copy(IV));
+ Domain = isl_set_intersect(Domain, LowerBound);
+
+ // IV <= LatchExecutions.
const Loop *L = getLoopForDimension(i);
- const SCEVAffFunc &UpperBound = tempScop.getLoopBound(L);
- isl_set *UpperBoundSet = toUpperLoopBound(UpperBound, isl_space_copy(Space),
- i);
+ const SCEV *LatchExecutions = tempScop.getLoopBound(L).OriginalSCEV;
+ isl_pw_aff *UpperBound = SCEVAffinator::getPwAff(this, LatchExecutions);
+ isl_set *UpperBoundSet = isl_pw_aff_le_set(IV, UpperBound);
Domain = isl_set_intersect(Domain, UpperBoundSet);
}
+ Domain = isl_set_set_tuple_name(Domain, getBaseName());
isl_local_space_free(LocalSpace);
- isl_space_free(Space);
- isl_int_clear(v);
}
void ScopStmt::addConditionsToDomain(TempScop &tempScop,