[polly] r280404 - Check validity of new access relations. NFC.

Michael Kruse via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 1 12:16:58 PDT 2016


Author: meinersbur
Date: Thu Sep  1 14:16:58 2016
New Revision: 280404

URL: http://llvm.org/viewvc/llvm-project?rev=280404&view=rev
Log:
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

Modified:
    polly/trunk/lib/Analysis/ScopInfo.cpp

Modified: polly/trunk/lib/Analysis/ScopInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopInfo.cpp?rev=280404&r1=280403&r2=280404&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopInfo.cpp (original)
+++ polly/trunk/lib/Analysis/ScopInfo.cpp Thu Sep  1 14:16:58 2016
@@ -963,6 +963,44 @@ bool MemoryAccess::isStrideOne(__isl_tak
 }
 
 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<ScopArrayInfo *>(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;
 }




More information about the llvm-commits mailing list