Index: lib/Analysis/ScopInfo.cpp =================================================================== --- lib/Analysis/ScopInfo.cpp +++ lib/Analysis/ScopInfo.cpp @@ -962,7 +962,43 @@ return isStrideX(Schedule, 1); } -void MemoryAccess::setNewAccessRelation(isl_map *NewAccess) { +void MemoryAccess::setNewAccessRelation(__isl_take isl_map *NewAccess) { + assert(NewAccess); + +#ifndef NDEBUG + // Check domain space compatibility. + auto *NewSpace = isl_map_get_space(NewAccess); + auto *NewDomainSpace = isl_space_domain(isl_space_copy(NewSpace)); + auto *OriginalDomainSpace = getStatement()->getDomainSpace(); + assert(isl_space_has_equal_tuples(OriginalDomainSpace, NewDomainSpace)); + isl_space_free(NewDomainSpace); + isl_space_free(OriginalDomainSpace); + + // Check whether there is an access for every statement instance. + auto *StmtDomain = getStatement()->getDomain(); + StmtDomain = isl_set_intersect_params( + StmtDomain, getStatement()->getParent()->getContext()); + auto *NewDomain = isl_map_domain(isl_map_copy(NewAccess)); + assert(isl_set_is_subset(StmtDomain, NewDomain) && + "Partial accesses not supported"); + isl_set_free(NewDomain); + isl_set_free(StmtDomain); + + // Check whether access dimensions correspond to number of dimensions of the + // accesses array. + auto *NewAccessSpace = isl_space_range(NewSpace); + assert(isl_space_has_tuple_id(NewAccessSpace, isl_dim_set) && + "Must specify the array that is accessed"); + auto *NewArrayId = isl_space_get_tuple_id(NewAccessSpace, isl_dim_set); + auto *SAI = static_cast(isl_id_get_user(NewArrayId)); + assert(SAI && "Must set a ScopArrayInfo"); + auto Dims = SAI->getNumberOfDimensions(); + assert(isl_space_dim(NewAccessSpace, isl_dim_set) == Dims && + "Access dims must match array dims"); + isl_space_free(NewAccessSpace); + isl_id_free(NewArrayId); +#endif + isl_map_free(NewAccessRelation); NewAccessRelation = NewAccess; }