summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--polly/lib/Analysis/ScopInfo.cpp19
-rw-r--r--polly/test/Isl/Ast/simple-run-time-condition.ll1
-rw-r--r--polly/test/ScopInfo/multidim_fortran_2d_params.ll1
-rw-r--r--polly/test/ScopInfo/multidim_ivs_and_parameteric_offsets_3d.ll3
-rw-r--r--polly/test/ScopInfo/multidim_param_in_subscript-2.ll3
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++)
OpenPOWER on IntegriCloud