[polly] r294649 - [ScopInfo] Use ScopArrayInfo instead of base address

Tobias Grosser via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 9 15:12:23 PST 2017


Author: grosser
Date: Thu Feb  9 17:12:22 2017
New Revision: 294649

URL: http://llvm.org/viewvc/llvm-project?rev=294649&view=rev
Log:
[ScopInfo] Use ScopArrayInfo instead of base address

When building alias groups, we sort different ScopArrays into unrelated groups.
Historically we identified arrays through their base pointer, as no
ScopArrayInfo class was yet available. This change changes the alias group
construction to reference arrays through their ScopArrayInfo object.

This change removes unnecessary uses of MemoryAddress::getBaseAddr() in
preparation for https://reviews.llvm.org/D28518.

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

Modified: polly/trunk/include/polly/ScopInfo.h
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/ScopInfo.h?rev=294649&r1=294648&r2=294649&view=diff
==============================================================================
--- polly/trunk/include/polly/ScopInfo.h (original)
+++ polly/trunk/include/polly/ScopInfo.h Thu Feb  9 17:12:22 2017
@@ -2290,13 +2290,13 @@ public:
   /// for all memory accesses inside the Scop. For each alias set we then map
   /// the aliasing pointers back to the memory accesses we know, thus obtain
   /// groups of memory accesses which might alias. We also collect the set of
-  /// base pointers through which memory is written.
+  /// arrays through which memory is written.
   ///
   /// @param AA A reference to the alias analysis.
   ///
-  /// @returns A pair consistent of a vector of alias groups and a set of values
-  ///          that are used as base pointers for write accesses.
-  std::tuple<AliasGroupVectorTy, DenseSet<Value *>>
+  /// @returns A pair consistent of a vector of alias groups and a set of arrays
+  ///          through which memory is written.
+  std::tuple<AliasGroupVectorTy, DenseSet<const ScopArrayInfo *>>
   buildAliasGroupsForAccesses(AliasAnalysis &AA);
 
   ///  Split alias groups by iteration domains.
@@ -2311,12 +2311,12 @@ public:
   /// Build a given alias group and its access data.
   ///
   /// @param AliasGroup     The alias group to build.
-  /// @param HasWriteAccess A set of base pointer values for through which
-  ///                       memory is not only read, but also written.
+  /// @param HasWriteAccess A set of arrays through which memory is not only
+  ///                       read, but also written.
   ///
   /// @returns True if __no__ error occurred, false otherwise.
   bool buildAliasGroup(Scop::AliasGroupTy &AliasGroup,
-                       DenseSet<Value *> HasWriteAccess);
+                       DenseSet<const ScopArrayInfo *> HasWriteAccess);
 
   /// Return all alias groups for this SCoP.
   const MinMaxVectorPairVectorTy &getAliasGroups() const {

Modified: polly/trunk/lib/Analysis/ScopInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopInfo.cpp?rev=294649&r1=294648&r2=294649&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopInfo.cpp (original)
+++ polly/trunk/lib/Analysis/ScopInfo.cpp Thu Feb  9 17:12:22 2017
@@ -2892,12 +2892,12 @@ bool Scop::buildAliasChecks(AliasAnalysi
   return false;
 }
 
-std::tuple<Scop::AliasGroupVectorTy, DenseSet<Value *>>
+std::tuple<Scop::AliasGroupVectorTy, DenseSet<const ScopArrayInfo *>>
 Scop::buildAliasGroupsForAccesses(AliasAnalysis &AA) {
   AliasSetTracker AST(AA);
 
   DenseMap<Value *, MemoryAccess *> PtrToAcc;
-  DenseSet<Value *> HasWriteAccess;
+  DenseSet<const ScopArrayInfo *> HasWriteAccess;
   for (ScopStmt &Stmt : *this) {
 
     isl_set *StmtDomain = Stmt.getDomain();
@@ -2912,7 +2912,7 @@ Scop::buildAliasGroupsForAccesses(AliasA
       if (MA->isScalarKind())
         continue;
       if (!MA->isRead())
-        HasWriteAccess.insert(MA->getBaseAddr());
+        HasWriteAccess.insert(MA->getScopArrayInfo());
       MemAccInst Acc(MA->getAccessInstruction());
       if (MA->isRead() && isa<MemTransferInst>(Acc))
         PtrToAcc[cast<MemTransferInst>(Acc)->getRawSource()] = MA;
@@ -2968,7 +2968,7 @@ bool Scop::buildAliasGroups(AliasAnalysi
   //      and maximal accesses to each array of a group in read only and non
   //      read only partitions separately.
   AliasGroupVectorTy AliasGroups;
-  DenseSet<Value *> HasWriteAccess;
+  DenseSet<const ScopArrayInfo *> HasWriteAccess;
 
   std::tie(AliasGroups, HasWriteAccess) = buildAliasGroupsForAccesses(AA);
 
@@ -2984,10 +2984,10 @@ bool Scop::buildAliasGroups(AliasAnalysi
 }
 
 bool Scop::buildAliasGroup(Scop::AliasGroupTy &AliasGroup,
-                           DenseSet<Value *> HasWriteAccess) {
+                           DenseSet<const ScopArrayInfo *> HasWriteAccess) {
   AliasGroupTy ReadOnlyAccesses;
   AliasGroupTy ReadWriteAccesses;
-  SmallPtrSet<const Value *, 4> ReadWriteBaseValues;
+  SmallPtrSet<const ScopArrayInfo *, 4> ReadWriteArrays;
 
   auto &F = getFunction();
 
@@ -3000,9 +3000,9 @@ bool Scop::buildAliasGroup(Scop::AliasGr
         Access->getAccessInstruction()->getDebugLoc(),
         "Possibly aliasing pointer, use restrict keyword.");
 
-    Value *BaseAddr = Access->getBaseAddr();
-    if (HasWriteAccess.count(BaseAddr)) {
-      ReadWriteBaseValues.insert(BaseAddr);
+    const ScopArrayInfo *Array = Access->getScopArrayInfo();
+    if (HasWriteAccess.count(Array)) {
+      ReadWriteArrays.insert(Array);
       ReadWriteAccesses.push_back(Access);
     } else {
       ReadOnlyAccesses.push_back(Access);
@@ -3011,11 +3011,11 @@ bool Scop::buildAliasGroup(Scop::AliasGr
 
   // If there are no read-only pointers, and less than two read-write pointers,
   // no alias check is needed.
-  if (ReadOnlyAccesses.empty() && ReadWriteBaseValues.size() <= 1)
+  if (ReadOnlyAccesses.empty() && ReadWriteArrays.size() <= 1)
     return true;
 
   // If there is no read-write pointer, no alias check is needed.
-  if (ReadWriteBaseValues.empty())
+  if (ReadWriteArrays.empty())
     return true;
 
   // For non-affine accesses, no alias check can be generated as we cannot




More information about the llvm-commits mailing list