[polly] r256136 - ScopInfo: Check for the existance of a single memory accesses

Tobias Grosser via llvm-commits llvm-commits at lists.llvm.org
Sun Dec 20 23:10:40 PST 2015


Author: grosser
Date: Mon Dec 21 01:10:39 2015
New Revision: 256136

URL: http://llvm.org/viewvc/llvm-project?rev=256136&view=rev
Log:
ScopInfo: Check for the existance of a single memory accesses

Instead of counting all array memory accesses associated with a load
instruction, we now explicitly check that the single array access that could
(potentially) be associated with a load instruction does not exist. This helps
to document the current behavior of Polly where load instructions can indeed
have at most one associated array access. In the unlikely case this changes
in the future, we add an assert for the case where two load accesses would
prevent us to return a single memory access, but we still should communicate
that not all array memory accesses have been removed.

This addresses post-commit comments from Johannes Doerfert for commit 255776.

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=256136&r1=256135&r2=256136&view=diff
==============================================================================
--- polly/trunk/include/polly/ScopInfo.h (original)
+++ polly/trunk/include/polly/ScopInfo.h Mon Dec 21 01:10:39 2015
@@ -958,14 +958,15 @@ public:
   /// @brief Return true if this statement does not contain any accesses.
   bool isEmpty() const { return MemAccs.empty(); }
 
-  /// @brief Return the only array access for @p Inst.
+  /// @brief Return the only array access for @p Inst, if existing.
   ///
   /// @param Inst The instruction for which to look up the access.
-  /// @returns The unique array memory access related to Inst.
-  MemoryAccess &getArrayAccessFor(const Instruction *Inst) const {
+  /// @returns The unique array memory access related to Inst or nullptr if
+  ///          no array access exists
+  MemoryAccess *getArrayAccessOrNULLFor(const Instruction *Inst) const {
     auto It = InstructionToAccess.find(Inst);
-    assert(It != InstructionToAccess.end() &&
-           "No memory accesses found for instruction");
+    if (It == InstructionToAccess.end())
+      return nullptr;
 
     MemoryAccess *ArrayAccess = nullptr;
 
@@ -978,26 +979,18 @@ public:
       ArrayAccess = Access;
     }
 
-    assert(ArrayAccess && "No array access found for instruction!");
-    return *ArrayAccess;
+    return ArrayAccess;
   }
 
-  /// @brief Get the number of array accesses associated with an instruction.
+  /// @brief Return the only array access for @p Inst.
   ///
-  /// @param Inst The instruction for which to obtain the access count.
-  /// @returns The number of array accesses associated with this instruction.
-  size_t getNumberOfArrayAccessesFor(const Instruction *Inst) const {
-    size_t NumAccesses = 0;
-    auto It = InstructionToAccess.find(Inst);
-    if (It == InstructionToAccess.end())
-      return 0;
-
-    for (auto Access : It->getSecond()) {
-      if (Access->isArrayKind())
-        NumAccesses++;
-    }
+  /// @param Inst The instruction for which to look up the access.
+  /// @returns The unique array memory access related to Inst.
+  MemoryAccess &getArrayAccessFor(const Instruction *Inst) const {
+    MemoryAccess *ArrayAccess = getArrayAccessOrNULLFor(Inst);
 
-    return NumAccesses;
+    assert(ArrayAccess && "No array access found for instruction!");
+    return *ArrayAccess;
   }
 
   void setBasicBlock(BasicBlock *Block) {

Modified: polly/trunk/lib/Analysis/ScopInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopInfo.cpp?rev=256136&r1=256135&r2=256136&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopInfo.cpp (original)
+++ polly/trunk/lib/Analysis/ScopInfo.cpp Mon Dec 21 01:10:39 2015
@@ -2928,7 +2928,7 @@ void Scop::verifyInvariantLoads() {
   for (LoadInst *LI : RIL) {
     assert(LI && getRegion().contains(LI));
     ScopStmt *Stmt = getStmtForBasicBlock(LI->getParent());
-    if (Stmt && Stmt->getNumberOfArrayAccessesFor(LI) > 0) {
+    if (Stmt && Stmt->getArrayAccessOrNULLFor(LI)) {
       invalidate(INVARIANTLOAD, LI->getDebugLoc());
       return;
     }




More information about the llvm-commits mailing list