aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Doerfert <doerfert@cs.uni-saarland.de>2014-09-12 11:00:49 +0000
committerJohannes Doerfert <doerfert@cs.uni-saarland.de>2014-09-12 11:00:49 +0000
commit8f7124ceb9524708bbae045a168cd5e083d596b5 (patch)
tree8701abd30092173e1b75237c5be5d41f6d087f1d
parent3762bd34e7661e23dd43d78a82b2b81e3123e9e5 (diff)
downloadllvm-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.h7
-rw-r--r--polly/lib/Analysis/ScopInfo.cpp18
-rw-r--r--polly/lib/Analysis/TempScopInfo.cpp13
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));
}