From b9a683d75df4172ba827400cb8861f875c7a7d33 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. llvm-svn: 288924 --- polly/include/polly/Support/GICHelper.h | 21 +++++++++++++ polly/lib/Support/GICHelper.cpp | 41 +++++++++++++++++++++++++ 2 files changed, 62 insertions(+) diff --git a/polly/include/polly/Support/GICHelper.h b/polly/include/polly/Support/GICHelper.h index dc9a01c468d8..29b7b546fce2 100644 --- a/polly/include/polly/Support/GICHelper.h +++ b/polly/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/polly/lib/Support/GICHelper.cpp b/polly/lib/Support/GICHelper.cpp index 833cb032c631..5b3fe30db2f9 100644 --- a/polly/lib/Support/GICHelper.cpp +++ b/polly/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(