diff options
-rw-r--r-- | polly/include/polly/ScopInfo.h | 20 | ||||
-rw-r--r-- | polly/lib/Analysis/ScopInfo.cpp | 4 | ||||
-rw-r--r-- | polly/lib/CodeGen/BlockGenerators.cpp | 4 |
3 files changed, 23 insertions, 5 deletions
diff --git a/polly/include/polly/ScopInfo.h b/polly/include/polly/ScopInfo.h index e440110c314..9eae0e37b6a 100644 --- a/polly/include/polly/ScopInfo.h +++ b/polly/include/polly/ScopInfo.h @@ -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; } diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index 33c5cdf165a..5f902029305 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -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 *PHI, BasicBlock *IncomingBlock, 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, diff --git a/polly/lib/CodeGen/BlockGenerators.cpp b/polly/lib/CodeGen/BlockGenerators.cpp index 962cc380244..67d2e2260c9 100644 --- a/polly/lib/CodeGen/BlockGenerators.cpp +++ b/polly/lib/CodeGen/BlockGenerators.cpp @@ -1201,7 +1201,7 @@ void RegionGenerator::generateScalarStores(ScopStmt &Stmt, LoopToScevMapT <S, 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::generateScalarStores(ScopStmt &Stmt, LoopToScevMapT <S, Builder.CreateStore(Val, Address); // Restore the insertion point if necessary. - if (isa<TerminatorInst>(ScalarInst)) + if (MA->isPHI() || MA->isExitPHI()) Builder.SetInsertPoint(SavedInsertBB, SavedInsertionPoint); } } |