From 9a092a4f6770425dfd72c755bc5e0718ccfc9a65 Mon Sep 17 00:00:00 2001 From: Michael Kruse Date: Wed, 7 Dec 2016 17:47:57 +0000 Subject: [PATCH] Add more ISL foreachElt functions. NFC. Add and implement foreachElt for isl_map, isl_set and isl_union_set. These are used by an out-of-tree patch which is in process of being upstreamed. git-svn-id: https://llvm.org/svn/llvm-project/polly/trunk@288924 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/polly/Support/GICHelper.h | 21 ++++++++++++++++++++ lib/Support/GICHelper.cpp | 41 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/include/polly/Support/GICHelper.h b/include/polly/Support/GICHelper.h index dc9a01c4..29b7b546 100644 --- a/include/polly/Support/GICHelper.h +++ b/include/polly/Support/GICHelper.h @@ -365,6 +365,20 @@ static llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, return OS; } +/// Enumerate all isl_basic_maps of an isl_map. +/// +/// This basically wraps isl_map_foreach_basic_map() and allows to call back +/// C++11 closures. +void foreachElt(NonowningIslPtr Map, + const std::function)> &F); + +/// Enumerate all isl_basic_sets of an isl_set. +/// +/// This basically wraps isl_set_foreach_basic_set() and allows to call back +/// C++11 closures. +void foreachElt(NonowningIslPtr Set, + const std::function)> &F); + /// Enumerate all isl_maps of an isl_union_map. /// /// This basically wraps isl_union_map_foreach_map() and allows to call back @@ -372,6 +386,13 @@ static llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, void foreachElt(NonowningIslPtr UMap, const std::function Map)> &F); +/// Enumerate all isl_sets of an isl_union_set. +/// +/// This basically wraps isl_union_set_foreach_set() and allows to call back +/// C++11 closures. +void foreachElt(NonowningIslPtr USet, + const std::function Set)> &F); + /// Enumerate all isl_pw_aff of an isl_union_pw_aff. /// /// This basically wraps isl_union_pw_aff(), but also allows to call back C++11 diff --git a/lib/Support/GICHelper.cpp b/lib/Support/GICHelper.cpp index 833cb032..5b3fe30d 100644 --- a/lib/Support/GICHelper.cpp +++ b/lib/Support/GICHelper.cpp @@ -225,6 +225,34 @@ DEFINE_ISLPTR(multi_union_pw_aff) DEFINE_ISLPTR(union_pw_multi_aff) } +void polly::foreachElt(NonowningIslPtr Map, + const std::function)> &F) { + isl_map_foreach_basic_map( + Map.keep(), + [](__isl_take isl_basic_map *BMap, void *User) -> isl_stat { + auto &F = + *static_cast)> *>( + User); + F(give(BMap)); + return isl_stat_ok; + }, + const_cast(static_cast(&F))); +} + +void polly::foreachElt(NonowningIslPtr Set, + const std::function)> &F) { + isl_set_foreach_basic_set( + Set.keep(), + [](__isl_take isl_basic_set *BSet, void *User) -> isl_stat { + auto &F = + *static_cast)> *>( + User); + F(give(BSet)); + return isl_stat_ok; + }, + const_cast(static_cast(&F))); +} + void polly::foreachElt(NonowningIslPtr UMap, const std::function Map)> &F) { isl_union_map_foreach_map( @@ -238,6 +266,19 @@ void polly::foreachElt(NonowningIslPtr UMap, const_cast(static_cast(&F))); } +void polly::foreachElt(NonowningIslPtr USet, + const std::function Set)> &F) { + isl_union_set_foreach_set( + USet.keep(), + [](__isl_take isl_set *Set, void *User) -> isl_stat { + auto &F = + *static_cast)> *>(User); + F(give(Set)); + return isl_stat_ok; + }, + const_cast(static_cast(&F))); +} + void polly::foreachElt(NonowningIslPtr UPwAff, const std::function)> &F) { isl_union_pw_aff_foreach_pw_aff( -- 2.11.4.GIT