diff options
author | Johannes Doerfert <doerfert@cs.uni-saarland.de> | 2014-09-12 11:00:49 +0000 |
---|---|---|
committer | Johannes Doerfert <doerfert@cs.uni-saarland.de> | 2014-09-12 11:00:49 +0000 |
commit | 8f7124ceb9524708bbae045a168cd5e083d596b5 (patch) | |
tree | 8701abd30092173e1b75237c5be5d41f6d087f1d | |
parent | 3762bd34e7661e23dd43d78a82b2b81e3123e9e5 (diff) | |
download | llvm-8f7124ceb9524708bbae045a168cd5e083d596b5.zip llvm-8f7124ceb9524708bbae045a168cd5e083d596b5.tar.gz llvm-8f7124ceb9524708bbae045a168cd5e083d596b5.tar.bz2 |
[Polly] Move MAY/MUST write property to IRAccess
Differential Revision: http://reviews.llvm.org/D5223
llvm-svn: 217665
-rw-r--r-- | polly/include/polly/TempScopInfo.h | 7 | ||||
-rw-r--r-- | polly/lib/Analysis/ScopInfo.cpp | 18 | ||||
-rw-r--r-- | polly/lib/Analysis/TempScopInfo.cpp | 13 |
3 files changed, 28 insertions, 10 deletions
diff --git a/polly/include/polly/TempScopInfo.h b/polly/include/polly/TempScopInfo.h index e67ba40..eb57c1f 100644 --- a/polly/include/polly/TempScopInfo.h +++ b/polly/include/polly/TempScopInfo.h @@ -42,7 +42,8 @@ public: // The type of the scev affine function enum TypeKind { READ = 0x1, - WRITE = 0x2, + MUST_WRITE = 0x2, + MAY_WRITE = 0x3, }; private: @@ -72,7 +73,9 @@ public: bool isRead() const { return Type == READ; } - bool isWrite() const { return Type == WRITE; } + bool isWrite() const { return Type == MUST_WRITE; } + + bool isMayWrite() const { return Type == MAY_WRITE; } bool isScalar() const { return Subscripts.size() == 0; } diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index e7b4d44..3d7428b 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -330,6 +330,18 @@ MemoryAccess::~MemoryAccess() { isl_map_free(newAccessRelation); } +static MemoryAccess::AccessType getMemoryAccessType(const IRAccess &Access) { + switch (Access.getType()) { + case IRAccess::READ: + return MemoryAccess::READ; + case IRAccess::MUST_WRITE: + return MemoryAccess::MUST_WRITE; + case IRAccess::MAY_WRITE: + return MemoryAccess::MAY_WRITE; + } + llvm_unreachable("Unknown IRAccess type!"); +} + isl_id *MemoryAccess::getArrayId() const { return isl_map_get_tuple_id(AccessRelation, isl_dim_out); } @@ -416,7 +428,8 @@ void MemoryAccess::assumeNoOutOfBound(const IRAccess &Access) { MemoryAccess::MemoryAccess(const IRAccess &Access, Instruction *AccInst, ScopStmt *Statement) - : Statement(Statement), Inst(AccInst), newAccessRelation(nullptr) { + : Type(getMemoryAccessType(Access)), Statement(Statement), Inst(AccInst), + newAccessRelation(nullptr) { isl_ctx *Ctx = Statement->getIslCtx(); BaseAddr = Access.getBase(); @@ -431,12 +444,9 @@ MemoryAccess::MemoryAccess(const IRAccess &Access, Instruction *AccInst, AccessRelation = isl_map_from_basic_map(createBasicAccessMap(Statement)); AccessRelation = isl_map_set_tuple_id(AccessRelation, isl_dim_out, BaseAddrId); - Type = Access.isRead() ? READ : MAY_WRITE; return; } - Type = Access.isRead() ? READ : MUST_WRITE; - isl_space *Space = isl_space_alloc(Ctx, 0, Statement->getNumIterators(), 0); AccessRelation = isl_map_universe(Space); diff --git a/polly/lib/Analysis/TempScopInfo.cpp b/polly/lib/Analysis/TempScopInfo.cpp index 5dd34239..befb731f 100644 --- a/polly/lib/Analysis/TempScopInfo.cpp +++ b/polly/lib/Analysis/TempScopInfo.cpp @@ -41,9 +41,11 @@ using namespace polly; void IRAccess::print(raw_ostream &OS) const { if (isRead()) OS << "Read "; - else + else { + if (isMayWrite()) + OS << "May"; OS << "Write "; - + } OS << BaseAddress->getName() << '[' << *Offset << "]\n"; } @@ -160,7 +162,7 @@ IRAccess TempScopInfo::buildIRAccess(Instruction *Inst, Loop *L, Region *R) { StoreInst *Store = cast<StoreInst>(Inst); SizeType = Store->getValueOperand()->getType(); Size = TD->getTypeStoreSize(SizeType); - Type = IRAccess::WRITE; + Type = IRAccess::MUST_WRITE; } const SCEV *AccessFunction = SE->getSCEVAtScope(getPointerOperand(*Inst), L); @@ -178,6 +180,9 @@ IRAccess TempScopInfo::buildIRAccess(Instruction *Inst, Loop *L, Region *R) { bool IsAffine = isAffineExpr(R, AccessFunction, *SE, BasePointer->getValue()); Subscripts.push_back(AccessFunction); + if (!IsAffine && Type == IRAccess::MUST_WRITE) + Type = IRAccess::MAY_WRITE; + Sizes.push_back(SE->getConstant(ZeroOffset->getType(), Size)); return IRAccess(Type, BasePointer->getValue(), AccessFunction, Size, IsAffine, Subscripts, Sizes); @@ -196,7 +201,7 @@ void TempScopInfo::buildAccessFunctions(Region &R, BasicBlock &BB) { // If the Instruction is used outside the statement, we need to build the // write access. SmallVector<const SCEV *, 4> Subscripts, Sizes; - IRAccess ScalarAccess(IRAccess::WRITE, Inst, ZeroOffset, 1, true, + IRAccess ScalarAccess(IRAccess::MUST_WRITE, Inst, ZeroOffset, 1, true, Subscripts, Sizes); Functions.push_back(std::make_pair(ScalarAccess, Inst)); } |