diff options
5 files changed, 25 insertions, 2 deletions
diff --git a/polly/lib/Analysis/ScopInfo.cpp b/polly/lib/Analysis/ScopInfo.cpp index 5cc84e09683..5930380cc0b 100644 --- a/polly/lib/Analysis/ScopInfo.cpp +++ b/polly/lib/Analysis/ScopInfo.cpp @@ -142,6 +142,11 @@ static cl::opt<bool> PollyPreciseInbounds( cl::desc("Take more precise inbounds assumptions (do not scale well)"), cl::Hidden, cl::init(false), cl::cat(PollyCategory)); +static cl::opt<bool> PollyPreciseFoldAccesses( + "polly-precise-fold-accesses", + cl::desc("Fold memory accesses to modele more possible delinearizations " + "(do not scale well)"), + cl::Hidden, cl::init(false), cl::cat(PollyCategory)); //===----------------------------------------------------------------------===// // Create a sequence of two schedules. Either argument may be null and is @@ -790,6 +795,8 @@ void MemoryAccess::foldAccessRelation() { int Size = Subscripts.size(); + isl_map *OldAccessRelation = isl_map_copy(AccessRelation); + for (int i = Size - 2; i >= 0; --i) { isl_space *Space; isl_map *MapOne, *MapTwo; @@ -841,6 +848,18 @@ void MemoryAccess::foldAccessRelation() { AccessRelation = isl_map_set_tuple_id(AccessRelation, isl_dim_out, BaseAddrId); AccessRelation = isl_map_gist_domain(AccessRelation, Statement->getDomain()); + + // Access dimension folding might in certain cases increase the number of + // disjuncts in the memory access, which can possibly complicate the generated + // run-time checks and can lead to costly compilation. + if (!PollyPreciseFoldAccesses && isl_map_n_basic_map(AccessRelation) > + isl_map_n_basic_map(OldAccessRelation)) { + isl_map_free(AccessRelation); + AccessRelation = OldAccessRelation; + } else { + isl_map_free(OldAccessRelation); + } + isl_space_free(Space); } diff --git a/polly/test/Isl/Ast/simple-run-time-condition.ll b/polly/test/Isl/Ast/simple-run-time-condition.ll index b02db7b1d3a..aba5d9e34f5 100644 --- a/polly/test/Isl/Ast/simple-run-time-condition.ll +++ b/polly/test/Isl/Ast/simple-run-time-condition.ll @@ -1,4 +1,5 @@ ; RUN: opt %loadPolly -polly-ast -analyze -polly-precise-inbounds < %s \ +; RUN: -polly-precise-fold-accesses \ ; RUN: | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" diff --git a/polly/test/ScopInfo/multidim_fortran_2d_params.ll b/polly/test/ScopInfo/multidim_fortran_2d_params.ll index cc3082ce330..d4fa53d8ca4 100644 --- a/polly/test/ScopInfo/multidim_fortran_2d_params.ll +++ b/polly/test/ScopInfo/multidim_fortran_2d_params.ll @@ -1,4 +1,5 @@ ; RUN: opt %loadPolly -polly-scops -analyze \ +; RUN: -polly-precise-fold-accesses \ ; RUN: -polly-invariant-load-hoisting=true < %s | FileCheck %s ; subroutine init_array(ni, nj, pi, pj, a) diff --git a/polly/test/ScopInfo/multidim_ivs_and_parameteric_offsets_3d.ll b/polly/test/ScopInfo/multidim_ivs_and_parameteric_offsets_3d.ll index 8ce6bad1b1f..22bfbab4e58 100644 --- a/polly/test/ScopInfo/multidim_ivs_and_parameteric_offsets_3d.ll +++ b/polly/test/ScopInfo/multidim_ivs_and_parameteric_offsets_3d.ll @@ -1,4 +1,5 @@ -; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s +; RUN: opt %loadPolly -polly-scops -analyze < %s \ +; RUN: -polly-precise-fold-accesses | FileCheck %s target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128" ; void foo(long n, long m, long o, double A[n][m][o], long p, long q, long r) { diff --git a/polly/test/ScopInfo/multidim_param_in_subscript-2.ll b/polly/test/ScopInfo/multidim_param_in_subscript-2.ll index 303d9130ac7..b6c43e9b977 100644 --- a/polly/test/ScopInfo/multidim_param_in_subscript-2.ll +++ b/polly/test/ScopInfo/multidim_param_in_subscript-2.ll @@ -1,4 +1,5 @@ -; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s +; RUN: opt %loadPolly -polly-scops -analyze \ +; RUN: -polly-precise-fold-accesses < %s | FileCheck %s ; ; void foo(long n, long m, float A[][n][m]) { ; for (long i = 0; i < 100; i++) |