[polly] r254149 - Introduce origin/kind for exit PHI node accesses

Michael Kruse via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 26 04:26:07 PST 2015


Author: meinersbur
Date: Thu Nov 26 06:26:06 2015
New Revision: 254149

URL: http://llvm.org/viewvc/llvm-project?rev=254149&view=rev
Log:
Introduce origin/kind for exit PHI node accesses

Previously, accesses that originate from PHI nodes in the exit block
were registered as SCALAR. In some context they are treated as scalars,
but it makes a difference in others. We used to check whether the
AccessInstruction is a terminator to differentiate the cases.

This patch introduces an MemoryAccess origin EXIT_PHI and a
ScopArrayInfo kind KIND_EXIT_PHI to make this case more explicit. No
behavioural change intended.

Differential Revision: http://reviews.llvm.org/D14688

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

Modified: polly/trunk/include/polly/ScopInfo.h
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/include/polly/ScopInfo.h?rev=254149&r1=254148&r2=254149&view=diff
==============================================================================
--- polly/trunk/include/polly/ScopInfo.h (original)
+++ polly/trunk/include/polly/ScopInfo.h Thu Nov 26 06:26:06 2015
@@ -105,6 +105,10 @@ public:
     // Scalar references used to model PHI nodes
     KIND_PHI,
 
+    // Like KIND_PHI, but for PHIs in the exit node. Depending on context, these
+    // are handled like KIND_SCALAR.
+    KIND_EXIT_PHI,
+
     // References to (multi-dimensional) arrays
     KIND_ARRAY,
   };
@@ -324,7 +328,7 @@ public:
   /// #AccessValue is also the llvm::Value itself.
   ///
   ///
-  /// * Accesses to emulate PHI nodes
+  /// * Accesses to emulate PHI nodes within the SCoP
   ///
   /// PHIInst instructions such as
   ///
@@ -359,7 +363,15 @@ public:
   /// Note that there can also be a scalar write access for %PHI if used in a
   /// different BasicBlock, i.e. there can be a %PHI.phiops as well as a
   /// %PHI.s2a.
-  enum AccessOrigin { EXPLICIT, SCALAR, PHI };
+  ///
+  ///
+  /// * Accesses to emulate PHI nodes that are in the SCoP's exit block
+  ///
+  /// Like the previous, but the PHI itself is not located in the SCoP itself.
+  /// There will be no READ type MemoryAccess for such values. The PHINode's
+  /// llvm::Value is treated as a value escaping the SCoP. WRITE accesses write
+  /// directly to the escaping value's ".s2a" alloca.
+  enum AccessOrigin { EXPLICIT, SCALAR, PHI, EXIT_PHI };
 
   /// @brief The access type of a memory access
   ///
@@ -671,6 +683,10 @@ public:
   /// @brief Is this MemoryAccess modeling special PHI node accesses?
   bool isPHI() const { return Origin == PHI; }
 
+  /// @brief Is this MemoryAccess modeling the accesses of a PHI node in the
+  /// SCoP's exit block?
+  bool isExitPHI() const { return Origin == EXIT_PHI; }
+
   /// @brief Get the statement that contains this memory access.
   ScopStmt *getStatement() const { return Statement; }
 

Modified: polly/trunk/lib/Analysis/ScopInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopInfo.cpp?rev=254149&r1=254148&r2=254149&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopInfo.cpp (original)
+++ polly/trunk/lib/Analysis/ScopInfo.cpp Thu Nov 26 06:26:06 2015
@@ -883,6 +883,8 @@ void ScopStmt::buildAccessRelations() {
     ScopArrayInfo::ARRAYKIND Ty;
     if (Access->isPHI())
       Ty = ScopArrayInfo::KIND_PHI;
+    else if (Access->isExitPHI())
+      Ty = ScopArrayInfo::KIND_EXIT_PHI;
     else if (Access->isImplicit())
       Ty = ScopArrayInfo::KIND_SCALAR;
     else
@@ -3932,7 +3934,7 @@ void ScopInfo::addPHIWriteAccess(PHINode
   addMemoryAccess(IncomingBlock, IncomingBlock->getTerminator(),
                   MemoryAccess::MUST_WRITE, PHI, 1, true, IncomingValue,
                   ArrayRef<const SCEV *>(), ArrayRef<const SCEV *>(),
-                  IsExitBlock ? MemoryAccess::SCALAR : MemoryAccess::PHI);
+                  IsExitBlock ? MemoryAccess::EXIT_PHI : MemoryAccess::PHI);
 }
 void ScopInfo::addPHIReadAccess(PHINode *PHI) {
   addMemoryAccess(PHI->getParent(), PHI, MemoryAccess::READ, PHI, 1, true, PHI,

Modified: polly/trunk/lib/CodeGen/BlockGenerators.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGen/BlockGenerators.cpp?rev=254149&r1=254148&r2=254149&view=diff
==============================================================================
--- polly/trunk/lib/CodeGen/BlockGenerators.cpp (original)
+++ polly/trunk/lib/CodeGen/BlockGenerators.cpp Thu Nov 26 06:26:06 2015
@@ -1201,7 +1201,7 @@ void RegionGenerator::generateScalarStor
     ValueMapT *LocalBBMap = &BBMap;
 
     // Implicit writes induced by PHIs must be written in the incoming blocks.
-    if (isa<TerminatorInst>(ScalarInst)) {
+    if (MA->isPHI() || MA->isExitPHI()) {
       BasicBlock *ExitingBB = ScalarInst->getParent();
       BasicBlock *ExitingBBCopy = BlockMap[ExitingBB];
       Builder.SetInsertPoint(ExitingBBCopy->getTerminator());
@@ -1217,7 +1217,7 @@ void RegionGenerator::generateScalarStor
     Builder.CreateStore(Val, Address);
 
     // Restore the insertion point if necessary.
-    if (isa<TerminatorInst>(ScalarInst))
+    if (MA->isPHI() || MA->isExitPHI())
       Builder.SetInsertPoint(SavedInsertBB, SavedInsertionPoint);
   }
 }




More information about the llvm-commits mailing list