diff options
author | Tobias Grosser <tobias@grosser.es> | 2017-06-23 08:05:20 +0000 |
---|---|---|
committer | Tobias Grosser <tobias@grosser.es> | 2017-06-23 08:05:20 +0000 |
commit | 8f23fb8486c89b261c65a16ddcb51a0d50810c7e (patch) | |
tree | ccfc1d256cb4294b3d39beda1588456874e4a343 /polly/lib | |
parent | 2c20c42cb6b7383d041631e05c74a4f882c78b8a (diff) | |
download | llvm-8f23fb8486c89b261c65a16ddcb51a0d50810c7e.zip llvm-8f23fb8486c89b261c65a16ddcb51a0d50810c7e.tar.gz llvm-8f23fb8486c89b261c65a16ddcb51a0d50810c7e.tar.bz2 |
[islpp] Move buildMinMaxAccess[es] to C++ [NFC]
llvm-svn: 306086
Diffstat (limited to 'polly/lib')
-rw-r--r-- | polly/lib/Analysis/ScopInfo.cpp | 111 |
1 files changed, 48 insertions, 63 deletions
diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index 5b11ccf..2d2d9a1 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -2409,27 +2409,19 @@ void Scop::simplifyContexts() { InvalidContext = isl_set_align_params(InvalidContext, getParamSpace()); } -struct MinMaxData { - Scop::MinMaxVectorTy &MinMaxAccesses; - Scop &S; -}; - /// Add the minimal/maximal access in @p Set to @p User. -static isl_stat buildMinMaxAccess(__isl_take isl_set *Set, void *User) { - auto Data = (struct MinMaxData *)User; - Scop::MinMaxVectorTy *MinMaxAccesses = &Data->MinMaxAccesses; - isl_pw_multi_aff *MinPMA, *MaxPMA; - isl_pw_aff *LastDimAff; - isl_aff *OneAff; +static isl::stat +buildMinMaxAccess(isl::set Set, Scop::MinMaxVectorTy &MinMaxAccesses, Scop &S) { + isl::pw_multi_aff MinPMA, MaxPMA; + isl::pw_aff LastDimAff; + isl::aff OneAff; unsigned Pos; - isl_ctx *Ctx = isl_set_get_ctx(Set); + isl::ctx Ctx = Set.get_ctx(); - Set = isl_set_remove_divs(Set); + Set = Set.remove_divs(); - if (isl_set_n_basic_set(Set) >= MaxDisjunctsInDomain) { - isl_set_free(Set); - return isl_stat_error; - } + if (isl_set_n_basic_set(Set.get()) >= MaxDisjunctsInDomain) + return isl::stat::error; // Restrict the number of parameters involved in the access as the lexmin/ // lexmax computation will take too long if this number is high. @@ -2445,53 +2437,45 @@ static isl_stat buildMinMaxAccess(__isl_take isl_set *Set, void *User) { // 11 | 6.78 // 12 | 30.38 // - if (isl_set_n_param(Set) > RunTimeChecksMaxParameters) { + if (isl_set_n_param(Set.get()) > RunTimeChecksMaxParameters) { unsigned InvolvedParams = 0; - for (unsigned u = 0, e = isl_set_n_param(Set); u < e; u++) - if (isl_set_involves_dims(Set, isl_dim_param, u, 1)) + for (unsigned u = 0, e = isl_set_n_param(Set.get()); u < e; u++) + if (Set.involves_dims(isl::dim::param, u, 1)) InvolvedParams++; - if (InvolvedParams > RunTimeChecksMaxParameters) { - isl_set_free(Set); - return isl_stat_error; - } + if (InvolvedParams > RunTimeChecksMaxParameters) + return isl::stat::error; } { - IslMaxOperationsGuard MaxOpGuard(isl_set_get_ctx(Set), OptComputeOut); - MinPMA = isl_set_lexmin_pw_multi_aff(isl_set_copy(Set)); - MaxPMA = isl_set_lexmax_pw_multi_aff(isl_set_copy(Set)); + IslMaxOperationsGuard MaxOpGuard(Ctx.get(), OptComputeOut); + MinPMA = Set.lexmin_pw_multi_aff(); + MaxPMA = Set.lexmax_pw_multi_aff(); } - if (isl_ctx_last_error(Ctx) == isl_error_quota) { - MinPMA = isl_pw_multi_aff_free(MinPMA); - MaxPMA = isl_pw_multi_aff_free(MaxPMA); - Set = isl_set_free(Set); - Data->S.invalidate(COMPLEXITY, DebugLoc()); - return isl_stat_error; + if (isl_ctx_last_error(Ctx.get()) == isl_error_quota) { + S.invalidate(COMPLEXITY, DebugLoc()); + return isl::stat::error; } - MinPMA = isl_pw_multi_aff_coalesce(MinPMA); - MaxPMA = isl_pw_multi_aff_coalesce(MaxPMA); + MinPMA = MinPMA.coalesce(); + MaxPMA = MaxPMA.coalesce(); // Adjust the last dimension of the maximal access by one as we want to // enclose the accessed memory region by MinPMA and MaxPMA. The pointer // we test during code generation might now point after the end of the // allocated array but we will never dereference it anyway. - assert(isl_pw_multi_aff_dim(MaxPMA, isl_dim_out) && - "Assumed at least one output dimension"); - Pos = isl_pw_multi_aff_dim(MaxPMA, isl_dim_out) - 1; - LastDimAff = isl_pw_multi_aff_get_pw_aff(MaxPMA, Pos); - OneAff = isl_aff_zero_on_domain( - isl_local_space_from_space(isl_pw_aff_get_domain_space(LastDimAff))); - OneAff = isl_aff_add_constant_si(OneAff, 1); - LastDimAff = isl_pw_aff_add(LastDimAff, isl_pw_aff_from_aff(OneAff)); - MaxPMA = isl_pw_multi_aff_set_pw_aff(MaxPMA, Pos, LastDimAff); - - MinMaxAccesses->push_back(std::make_pair(MinPMA, MaxPMA)); - - isl_set_free(Set); - return isl_stat_ok; + assert(MaxPMA.dim(isl::dim::out) && "Assumed at least one output dimension"); + Pos = MaxPMA.dim(isl::dim::out) - 1; + LastDimAff = MaxPMA.get_pw_aff(Pos); + OneAff = isl::aff(isl::local_space(LastDimAff.get_domain_space())); + OneAff = OneAff.add_constant_si(1); + LastDimAff = LastDimAff.add(OneAff); + MaxPMA = MaxPMA.set_pw_aff(Pos, LastDimAff); + + MinMaxAccesses.push_back(std::make_pair(MinPMA.copy(), MaxPMA.copy())); + + return isl::stat::ok; } static __isl_give isl_set *getAccessDomain(MemoryAccess *MA) { @@ -2504,23 +2488,24 @@ static __isl_give isl_set *getAccessDomain(MemoryAccess *MA) { static bool calculateMinMaxAccess(Scop::AliasGroupTy AliasGroup, Scop &S, Scop::MinMaxVectorTy &MinMaxAccesses) { - struct MinMaxData Data = {MinMaxAccesses, S}; - Data.MinMaxAccesses.reserve(AliasGroup.size()); + MinMaxAccesses.reserve(AliasGroup.size()); - isl_union_set *Domains = S.getDomains(); - isl_union_map *Accesses = isl_union_map_empty(S.getParamSpace()); + isl::union_set Domains = give(S.getDomains()); + isl::union_map Accesses = isl::union_map::empty(give(S.getParamSpace())); for (MemoryAccess *MA : AliasGroup) - Accesses = isl_union_map_add_map(Accesses, MA->getAccessRelation()); - - Accesses = isl_union_map_intersect_domain(Accesses, Domains); - isl_union_set *Locations = isl_union_map_range(Accesses); - Locations = isl_union_set_coalesce(Locations); - Locations = isl_union_set_detect_equalities(Locations); - bool Valid = - (0 == isl_union_set_foreach_set(Locations, buildMinMaxAccess, &Data)); - isl_union_set_free(Locations); - return Valid; + Accesses = Accesses.add_map(give(MA->getAccessRelation())); + + Accesses = Accesses.intersect_domain(Domains); + isl::union_set Locations = Accesses.range(); + Locations = Locations.coalesce(); + Locations = Locations.detect_equalities(); + ; + + auto Lambda = [&MinMaxAccesses, &S](isl::set Set) -> isl::stat { + return buildMinMaxAccess(Set, MinMaxAccesses, S); + }; + return Locations.foreach_set(Lambda) == isl::stat::ok; } /// Helper to treat non-affine regions and basic blocks the same. |