diff options
| author | Tobias Grosser <tobias@grosser.es> | 2015-11-12 14:07:09 +0000 |
|---|---|---|
| committer | Tobias Grosser <tobias@grosser.es> | 2015-11-12 14:07:09 +0000 |
| commit | e5a3514e4a9144481ab05786721eb95f1e566415 (patch) | |
| tree | bc73f2f218ffb5f68e453855d12e77176d162c4f | |
| parent | bab2216dbb69386510505a398a60c108dfc2ceee (diff) | |
| download | bcm5719-llvm-e5a3514e4a9144481ab05786721eb95f1e566415.tar.gz bcm5719-llvm-e5a3514e4a9144481ab05786721eb95f1e566415.zip | |
ScopInfo: Use lambda functions to reduce code duplication.
llvm-svn: 252893
| -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 { |

