From 772ce7200085db8cea395b3b962b8c9496cb9845 Mon Sep 17 00:00:00 2001 From: Michael Kruse Date: Thu, 1 Sep 2016 19:16:58 +0000 Subject: [PATCH] Check validity of new access relations. NFC. There are some constraints on maps that can be access relations. In builds with assertions enabled, verify - The access domain is the same space as the statement's domain (modulo parameters). - Whether an access is defined for every instance of the statement. (codegen does not yet support partial access relations) - Whether the access range links to an array, represented by a ScopArrayInfo. - The number of access dimensions equals the dimensions of the array. - The array is not an indirect access. (also not supported by codegen) Differential Revision: https://reviews.llvm.org/D23916 llvm-svn: 280404 --- polly/lib/Analysis/ScopInfo.cpp | 38 +++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index 40eb6fb3a422..8ae04e8f96ff 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -963,6 +963,44 @@ bool MemoryAccess::isStrideOne(__isl_take const isl_map *Schedule) const { } 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"); + assert(!SAI->getBasePtrOriginSAI() && + "Indirect array not supported by codegen"); + 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; }