Added base array id's to Memory Accesses

These id's allow us to cread id -> array base value mappings.

llvm-svn: 214169
This commit is contained in:
Johannes Doerfert 2014-07-29 08:37:55 +00:00
parent d9e1dbd376
commit 5d83f09cdd
2 changed files with 17 additions and 9 deletions

View File

@ -183,6 +183,9 @@ public:
/// @brief Get the base address of this access (e.g. A for A[i+j]). /// @brief Get the base address of this access (e.g. A for A[i+j]).
Value *getBaseAddr() const { return BaseAddr; } Value *getBaseAddr() const { return BaseAddr; }
/// @brief Get the base array isl_id for this access.
__isl_give isl_id *getArrayId() const;
const std::string &getBaseName() const { return BaseName; } const std::string &getBaseName() const { return BaseName; }
const Instruction *getAccessInstruction() const { return Inst; } const Instruction *getAccessInstruction() const { return Inst; }

View File

@ -309,6 +309,10 @@ MemoryAccess::~MemoryAccess() {
isl_map_free(newAccessRelation); isl_map_free(newAccessRelation);
} }
isl_id *MemoryAccess::getArrayId() const {
return isl_map_get_tuple_id(AccessRelation, isl_dim_out);
}
isl_map *MemoryAccess::getAccessRelation() const { isl_map *MemoryAccess::getAccessRelation() const {
return isl_map_copy(AccessRelation); return isl_map_copy(AccessRelation);
} }
@ -327,7 +331,6 @@ isl_map *MemoryAccess::getNewAccessRelation() const {
isl_basic_map *MemoryAccess::createBasicAccessMap(ScopStmt *Statement) { isl_basic_map *MemoryAccess::createBasicAccessMap(ScopStmt *Statement) {
isl_space *Space = isl_space_set_alloc(Statement->getIslCtx(), 0, 1); isl_space *Space = isl_space_set_alloc(Statement->getIslCtx(), 0, 1);
Space = isl_space_set_tuple_name(Space, isl_dim_set, getBaseName().c_str());
Space = isl_space_align_params(Space, Statement->getDomainSpace()); Space = isl_space_align_params(Space, Statement->getDomainSpace());
return isl_basic_map_from_domain_and_range( return isl_basic_map_from_domain_and_range(
@ -399,8 +402,10 @@ MemoryAccess::MemoryAccess(const IRAccess &Access, const Instruction *AccInst,
ScopStmt *Statement) ScopStmt *Statement)
: Statement(Statement), Inst(AccInst), newAccessRelation(nullptr) { : Statement(Statement), Inst(AccInst), newAccessRelation(nullptr) {
isl_ctx *Ctx = Statement->getIslCtx();
BaseAddr = Access.getBase(); BaseAddr = Access.getBase();
BaseName = getIslCompatibleName("MemRef_", getBaseAddr(), ""); BaseName = getIslCompatibleName("MemRef_", getBaseAddr(), "");
isl_id *BaseAddrId = isl_id_alloc(Ctx, getBaseName().c_str(), nullptr);
if (!Access.isAffine()) { if (!Access.isAffine()) {
// We overapproximate non-affine accesses with a possible access to the // We overapproximate non-affine accesses with a possible access to the
@ -408,14 +413,15 @@ MemoryAccess::MemoryAccess(const IRAccess &Access, const Instruction *AccInst,
// access must or may happen. However, for write accesses it is important to // access must or may happen. However, for write accesses it is important to
// differentiate between writes that must happen and writes that may happen. // differentiate between writes that must happen and writes that may happen.
AccessRelation = isl_map_from_basic_map(createBasicAccessMap(Statement)); 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; Type = Access.isRead() ? READ : MAY_WRITE;
return; return;
} }
Type = Access.isRead() ? READ : MUST_WRITE; Type = Access.isRead() ? READ : MUST_WRITE;
isl_space *Space = isl_space_alloc(Statement->getIslCtx(), 0, isl_space *Space = isl_space_alloc(Ctx, 0, Statement->getNumIterators(), 0);
Statement->getNumIterators(), 0);
AccessRelation = isl_map_universe(Space); AccessRelation = isl_map_universe(Space);
for (int i = 0, Size = Access.Subscripts.size(); i < Size; ++i) { for (int i = 0, Size = Access.Subscripts.size(); i < Size; ++i) {
@ -431,9 +437,7 @@ MemoryAccess::MemoryAccess(const IRAccess &Access, const Instruction *AccInst,
// two subsequent values of 'i' index two values that are stored next to // two subsequent values of 'i' index two values that are stored next to
// each other in memory. By this division we make this characteristic // each other in memory. By this division we make this characteristic
// obvious again. // obvious again.
isl_val *v; isl_val *v = isl_val_int_from_si(Ctx, Access.getElemSizeInBytes());
v = isl_val_int_from_si(isl_pw_aff_get_ctx(Affine),
Access.getElemSizeInBytes());
Affine = isl_pw_aff_scale_down_val(Affine, v); Affine = isl_pw_aff_scale_down_val(Affine, v);
} }
@ -445,10 +449,11 @@ MemoryAccess::MemoryAccess(const IRAccess &Access, const Instruction *AccInst,
Space = Statement->getDomainSpace(); Space = Statement->getDomainSpace();
AccessRelation = isl_map_set_tuple_id( AccessRelation = isl_map_set_tuple_id(
AccessRelation, isl_dim_in, isl_space_get_tuple_id(Space, isl_dim_set)); AccessRelation, isl_dim_in, isl_space_get_tuple_id(Space, isl_dim_set));
isl_space_free(Space); AccessRelation =
AccessRelation = isl_map_set_tuple_name(AccessRelation, isl_dim_out, isl_map_set_tuple_id(AccessRelation, isl_dim_out, BaseAddrId);
getBaseName().c_str());
assumeNoOutOfBound(Access); assumeNoOutOfBound(Access);
isl_space_free(Space);
} }
void MemoryAccess::realignParams() { void MemoryAccess::realignParams() {