Remove implementation of getNumberOfIterations from header [NFC]

We moved this implementation into the header file to share it between
the CLooG and isl code generator. As the CLooG code generator was dropped,
the implementation can be folded back into the .cpp file.

No functional change intended.

llvm-svn: 235860
This commit is contained in:
Tobias Grosser 2015-04-27 10:38:45 +00:00
parent c04ce6e25c
commit b68068bf62
2 changed files with 39 additions and 45 deletions

View File

@ -30,48 +30,6 @@ extern CodeGenChoice PollyCodeGenChoice;
/// @brief Flag to turn on/off annotation of alias scopes.
extern bool PollyAnnotateAliasScopes;
static inline int getNumberOfIterations(__isl_take isl_set *Domain) {
int Dim = isl_set_dim(Domain, isl_dim_set);
// Calculate a map similar to the identity map, but with the last input
// and output dimension not related.
// [i0, i1, i2, i3] -> [i0, i1, i2, o0]
isl_space *Space = isl_set_get_space(Domain);
Space = isl_space_drop_dims(Space, isl_dim_out, Dim - 1, 1);
Space = isl_space_map_from_set(Space);
isl_map *Identity = isl_map_identity(Space);
Identity = isl_map_add_dims(Identity, isl_dim_in, 1);
Identity = isl_map_add_dims(Identity, isl_dim_out, 1);
Domain = isl_set_reset_tuple_id(Domain);
isl_map *Map =
isl_map_from_domain_and_range(isl_set_copy(Domain), isl_set_copy(Domain));
isl_set_free(Domain);
Map = isl_map_intersect(Map, Identity);
isl_map *LexMax = isl_map_lexmax(isl_map_copy(Map));
isl_map *LexMin = isl_map_lexmin(Map);
isl_map *Sub = isl_map_sum(LexMax, isl_map_neg(LexMin));
isl_set *Elements = isl_map_range(Sub);
if (!isl_set_is_singleton(Elements)) {
isl_set_free(Elements);
return -1;
}
isl_point *P = isl_set_sample_point(Elements);
isl_val *V;
V = isl_point_get_coordinate_val(P, isl_dim_set, Dim - 1);
int NumberIterations = isl_val_get_num_si(V);
isl_val_free(V);
isl_point_free(P);
return NumberIterations;
}
}
#endif // POLLY_CODEGENERATION_H

View File

@ -297,10 +297,46 @@ IslNodeBuilder::getUpperBound(__isl_keep isl_ast_node *For,
unsigned IslNodeBuilder::getNumberOfIterations(__isl_keep isl_ast_node *For) {
isl_union_map *Schedule = IslAstInfo::getSchedule(For);
isl_set *LoopDomain = isl_set_from_union_set(isl_union_map_range(Schedule));
int NumberOfIterations = polly::getNumberOfIterations(LoopDomain);
if (NumberOfIterations == -1)
int Dim = isl_set_dim(LoopDomain, isl_dim_set);
// Calculate a map similar to the identity map, but with the last input
// and output dimension not related.
// [i0, i1, i2, i3] -> [i0, i1, i2, o0]
isl_space *Space = isl_set_get_space(LoopDomain);
Space = isl_space_drop_dims(Space, isl_dim_out, Dim - 1, 1);
Space = isl_space_map_from_set(Space);
isl_map *Identity = isl_map_identity(Space);
Identity = isl_map_add_dims(Identity, isl_dim_in, 1);
Identity = isl_map_add_dims(Identity, isl_dim_out, 1);
LoopDomain = isl_set_reset_tuple_id(LoopDomain);
isl_map *Map = isl_map_from_domain_and_range(isl_set_copy(LoopDomain),
isl_set_copy(LoopDomain));
isl_set_free(LoopDomain);
Map = isl_map_intersect(Map, Identity);
isl_map *LexMax = isl_map_lexmax(isl_map_copy(Map));
isl_map *LexMin = isl_map_lexmin(Map);
isl_map *Sub = isl_map_sum(LexMax, isl_map_neg(LexMin));
isl_set *Elements = isl_map_range(Sub);
if (!isl_set_is_singleton(Elements)) {
isl_set_free(Elements);
return -1;
return NumberOfIterations + 1;
}
isl_point *P = isl_set_sample_point(Elements);
isl_val *V;
V = isl_point_get_coordinate_val(P, isl_dim_set, Dim - 1);
int NumberIterations = isl_val_get_num_si(V);
isl_val_free(V);
isl_point_free(P);
if (NumberIterations == -1)
return -1;
return NumberIterations + 1;
}
struct FindValuesUser {