summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Grosser <tobias@grosser.es>2015-11-12 14:07:09 +0000
committerTobias Grosser <tobias@grosser.es>2015-11-12 14:07:09 +0000
commite5a3514e4a9144481ab05786721eb95f1e566415 (patch)
treebc73f2f218ffb5f68e453855d12e77176d162c4f
parentbab2216dbb69386510505a398a60c108dfc2ceee (diff)
downloadbcm5719-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.h9
-rw-r--r--polly/lib/Analysis/ScopInfo.cpp61
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 {
OpenPOWER on IntegriCloud