diff options
-rw-r--r-- | polly/include/polly/ScopInfo.h | 39 | ||||
-rw-r--r-- | polly/lib/Analysis/ScopInfo.cpp | 38 | ||||
-rw-r--r-- | polly/lib/CodeGen/IslNodeBuilder.cpp | 2 |
3 files changed, 50 insertions, 29 deletions
diff --git a/polly/include/polly/ScopInfo.h b/polly/include/polly/ScopInfo.h index 005b050685f..20b38418ab8 100644 --- a/polly/include/polly/ScopInfo.h +++ b/polly/include/polly/ScopInfo.h @@ -84,16 +84,29 @@ typedef std::map<const BasicBlock *, AccFuncSetType> AccFuncMapType; /// class ScopArrayInfo { public: + /// @brief The type of a memory access. + enum ARRAYKIND { + // Scalar references to SSA values. + KIND_SCALAR, + + // Scalar references used to model PHI nodes + KIND_PHI, + + // References to (multi-dimensional) arrays + KIND_ARRAY, + }; + /// @brief Construct a ScopArrayInfo object. /// /// @param BasePtr The array base pointer. /// @param ElementType The type of the elements stored in the array. /// @param IslCtx The isl context used to create the base pointer id. /// @param DimensionSizes A vector containing the size of each dimension. - /// @param IsPHI Is this a PHI node specific array info object. + /// @param Kind The kind of the array object. /// @param S The scop this array object belongs to. ScopArrayInfo(Value *BasePtr, Type *ElementType, isl_ctx *IslCtx, - ArrayRef<const SCEV *> DimensionSizes, bool IsPHI, Scop *S); + ArrayRef<const SCEV *> DimensionSizes, enum ARRAYKIND Kind, + Scop *S); /// @brief Update the sizes of the ScopArrayInfo object. /// @@ -170,7 +183,7 @@ public: /// original PHI node as virtual base pointer, we have this additional /// attribute to distinguish the PHI node specific array modeling from the /// normal scalar array modeling. - bool isPHI() const { return IsPHI; }; + bool isPHI() const { return Kind == KIND_PHI; }; /// @brief Dump a readable representation to stderr. void dump() const; @@ -216,8 +229,10 @@ private: /// @brief The sizes of each dimension as isl_pw_aff. SmallVector<isl_pw_aff *, 4> DimensionSizesPw; - /// @brief Is this PHI node specific storage? - bool IsPHI; + /// @brief The type of this scop array info object. + /// + /// We distinguish between SCALAR, PHI and ARRAY objects. + enum ARRAYKIND Kind; /// @brief The scop this SAI object belongs to. Scop &S; @@ -1076,7 +1091,7 @@ private: /// @brief The affinator used to translate SCEVs to isl expressions. SCEVAffinator Affinator; - typedef MapVector<std::pair<AssertingVH<const Value>, std::pair<int, int>>, + typedef MapVector<std::pair<AssertingVH<const Value>, int>, std::unique_ptr<ScopArrayInfo>> ArrayInfoMapTy; /// @brief A map to remember ScopArrayInfo objects for all base pointers. /// @@ -1510,20 +1525,18 @@ public: /// @brief Return the (possibly new) ScopArrayInfo object for @p Access. /// /// @param ElementType The type of the elements stored in this array. - /// @param IsPHI Is this ScopArrayInfo object modeling special - /// PHI node storage. + /// @param Kind The kind of array info object. const ScopArrayInfo *getOrCreateScopArrayInfo(Value *BasePtr, Type *ElementType, ArrayRef<const SCEV *> Sizes, - bool IsPHI = false); + ScopArrayInfo::ARRAYKIND Kind); /// @brief Return the cached ScopArrayInfo object for @p BasePtr. /// /// @param BasePtr The base pointer the object has been stored for. - /// @param IsScalar Are we looking for a scalar or memory access location. - /// @param IsPHI Are we looking for special PHI storage. - const ScopArrayInfo *getScopArrayInfo(Value *BasePtr, bool IsScalar, - bool IsPHI = false); + /// @param Kind The kind of array info object. + const ScopArrayInfo *getScopArrayInfo(Value *BasePtr, + ScopArrayInfo::ARRAYKIND Kind); void setContext(isl_set *NewContext); diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index 9ef804d3b20..6027cf3481a 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -150,14 +150,16 @@ static const ScopArrayInfo *identifyBasePtrOriginSAI(Scop *S, Value *BasePtr) { if (!OriginBaseSCEVUnknown) return nullptr; - return S->getScopArrayInfo(OriginBaseSCEVUnknown->getValue(), false); + return S->getScopArrayInfo(OriginBaseSCEVUnknown->getValue(), + ScopArrayInfo::KIND_ARRAY); } ScopArrayInfo::ScopArrayInfo(Value *BasePtr, Type *ElementType, isl_ctx *Ctx, - ArrayRef<const SCEV *> Sizes, bool IsPHI, Scop *S) - : BasePtr(BasePtr), ElementType(ElementType), IsPHI(IsPHI), S(*S) { + ArrayRef<const SCEV *> Sizes, enum ARRAYKIND Kind, + Scop *S) + : BasePtr(BasePtr), ElementType(ElementType), Kind(Kind), S(*S) { std::string BasePtrName = - getIslCompatibleName("MemRef_", BasePtr, IsPHI ? "__phi" : ""); + getIslCompatibleName("MemRef_", BasePtr, Kind == KIND_PHI ? "__phi" : ""); Id = isl_id_alloc(Ctx, BasePtrName.c_str(), this); updateSizes(Sizes); @@ -830,8 +832,16 @@ void ScopStmt::buildAccessRelations() { for (MemoryAccess *Access : MemAccs) { Type *ElementType = Access->getAccessValue()->getType(); + ScopArrayInfo::ARRAYKIND Ty; + if (Access->isPHI()) + Ty = ScopArrayInfo::KIND_PHI; + else if (Access->isImplicit()) + Ty = ScopArrayInfo::KIND_SCALAR; + else + Ty = ScopArrayInfo::KIND_ARRAY; + const ScopArrayInfo *SAI = getParent()->getOrCreateScopArrayInfo( - Access->getBaseAddr(), ElementType, Access->Sizes, Access->isPHI()); + Access->getBaseAddr(), ElementType, Access->Sizes, Ty); Access->buildAccessRelation(SAI); } @@ -2771,13 +2781,12 @@ void Scop::hoistInvariantLoads() { const ScopArrayInfo * Scop::getOrCreateScopArrayInfo(Value *BasePtr, Type *AccessType, - ArrayRef<const SCEV *> Sizes, bool IsPHI) { - bool IsScalar = Sizes.empty(); - auto ScalarTypePair = std::make_pair(IsScalar, IsPHI); - auto &SAI = ScopArrayInfoMap[std::make_pair(BasePtr, ScalarTypePair)]; + ArrayRef<const SCEV *> Sizes, + ScopArrayInfo::ARRAYKIND Kind) { + auto &SAI = ScopArrayInfoMap[std::make_pair(BasePtr, Kind)]; if (!SAI) { - SAI.reset(new ScopArrayInfo(BasePtr, AccessType, getIslCtx(), Sizes, IsPHI, - this)); + SAI.reset( + new ScopArrayInfo(BasePtr, AccessType, getIslCtx(), Sizes, Kind, this)); } else { // In case of mismatching array sizes, we bail out by setting the run-time // context to false. @@ -2787,10 +2796,9 @@ Scop::getOrCreateScopArrayInfo(Value *BasePtr, Type *AccessType, return SAI.get(); } -const ScopArrayInfo *Scop::getScopArrayInfo(Value *BasePtr, bool IsScalar, - bool IsPHI) { - auto ScalarTypePair = std::make_pair(IsScalar, IsPHI); - auto *SAI = ScopArrayInfoMap[std::make_pair(BasePtr, ScalarTypePair)].get(); +const ScopArrayInfo *Scop::getScopArrayInfo(Value *BasePtr, + ScopArrayInfo::ARRAYKIND Kind) { + auto *SAI = ScopArrayInfoMap[std::make_pair(BasePtr, Kind)].get(); assert(SAI && "No ScopArrayInfo available for this base pointer"); return SAI; } diff --git a/polly/lib/CodeGen/IslNodeBuilder.cpp b/polly/lib/CodeGen/IslNodeBuilder.cpp index 37971ce6b63..639c29ce543 100644 --- a/polly/lib/CodeGen/IslNodeBuilder.cpp +++ b/polly/lib/CodeGen/IslNodeBuilder.cpp @@ -964,7 +964,7 @@ bool IslNodeBuilder::preloadInvariantEquivClass( // If the base pointer of this class is dependent on another one we have to // make sure it was preloaded already. - auto *SAI = S.getScopArrayInfo(MA->getBaseAddr(), false); + auto *SAI = S.getScopArrayInfo(MA->getBaseAddr(), ScopArrayInfo::KIND_ARRAY); if (const auto *BaseIAClass = S.lookupInvariantEquivClass(SAI->getBasePtr())) if (!preloadInvariantEquivClass(*BaseIAClass)) return false; |