diff options
| -rw-r--r-- | polly/include/polly/ScopInfo.h | 9 | ||||
| -rw-r--r-- | polly/lib/Analysis/ScopInfo.cpp | 61 |
2 files changed, 22 insertions, 48 deletions
diff --git a/polly/include/polly/ScopInfo.h b/polly/include/polly/ScopInfo.h index b1c4eacb3fe..c5ff7f6e005 100644 --- a/polly/include/polly/ScopInfo.h +++ b/polly/include/polly/ScopInfo.h @@ -1332,6 +1332,15 @@ private: Region *R, DenseMap<Loop *, std::pair<isl_schedule *, unsigned>> &LoopSchedules); + /// @brief Collect all memory access relations of a given type. + /// + /// @param Predicate A predicate function that returns true if an access is + /// of a given type. + /// + /// @returns The set of memory accesses in the scop that match the predicate. + __isl_give isl_union_map * + getAccessesOfType(std::function<bool(MemoryAccess &)> Predicate); + /// @name Helper function for printing the Scop. /// ///{ diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index c3d66df69be..47fffc3b982 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -3119,73 +3119,38 @@ __isl_give isl_union_set *Scop::getDomains() const { return Domain; } -__isl_give isl_union_map *Scop::getMustWrites() { - isl_union_map *Write = isl_union_map_empty(getParamSpace()); +__isl_give isl_union_map * +Scop::getAccessesOfType(std::function<bool(MemoryAccess &)> Predicate) { + isl_union_map *Accesses = isl_union_map_empty(getParamSpace()); for (ScopStmt &Stmt : *this) { for (MemoryAccess *MA : Stmt) { - if (!MA->isMustWrite()) + if (!Predicate(*MA)) continue; isl_set *Domain = Stmt.getDomain(); isl_map *AccessDomain = MA->getAccessRelation(); AccessDomain = isl_map_intersect_domain(AccessDomain, Domain); - Write = isl_union_map_add_map(Write, AccessDomain); + Accesses = isl_union_map_add_map(Accesses, AccessDomain); } } - return isl_union_map_coalesce(Write); + return isl_union_map_coalesce(Accesses); } -__isl_give isl_union_map *Scop::getMayWrites() { - isl_union_map *Write = isl_union_map_empty(getParamSpace()); - - for (ScopStmt &Stmt : *this) { - for (MemoryAccess *MA : Stmt) { - if (!MA->isMayWrite()) - continue; +__isl_give isl_union_map *Scop::getMustWrites() { + return getAccessesOfType([](MemoryAccess &MA) { return MA.isMustWrite(); }); +} - isl_set *Domain = Stmt.getDomain(); - isl_map *AccessDomain = MA->getAccessRelation(); - AccessDomain = isl_map_intersect_domain(AccessDomain, Domain); - Write = isl_union_map_add_map(Write, AccessDomain); - } - } - return isl_union_map_coalesce(Write); +__isl_give isl_union_map *Scop::getMayWrites() { + return getAccessesOfType([](MemoryAccess &MA) { return MA.isMayWrite(); }); } __isl_give isl_union_map *Scop::getWrites() { - isl_union_map *Write = isl_union_map_empty(getParamSpace()); - - for (ScopStmt &Stmt : *this) { - for (MemoryAccess *MA : Stmt) { - if (!MA->isWrite()) - continue; - - isl_set *Domain = Stmt.getDomain(); - isl_map *AccessDomain = MA->getAccessRelation(); - AccessDomain = isl_map_intersect_domain(AccessDomain, Domain); - Write = isl_union_map_add_map(Write, AccessDomain); - } - } - return isl_union_map_coalesce(Write); + return getAccessesOfType([](MemoryAccess &MA) { return MA.isWrite(); }); } __isl_give isl_union_map *Scop::getReads() { - isl_union_map *Read = isl_union_map_empty(getParamSpace()); - - for (ScopStmt &Stmt : *this) { - for (MemoryAccess *MA : Stmt) { - if (!MA->isRead()) - continue; - - isl_set *Domain = Stmt.getDomain(); - isl_map *AccessDomain = MA->getAccessRelation(); - - AccessDomain = isl_map_intersect_domain(AccessDomain, Domain); - Read = isl_union_map_add_map(Read, AccessDomain); - } - } - return isl_union_map_coalesce(Read); + return getAccessesOfType([](MemoryAccess &MA) { return MA.isRead(); }); } __isl_give isl_union_map *Scop::getSchedule() const { |

