[polly] r212198 - Derive run-time conditions for delinearization
Johannes Doerfert
jdoerfert at codeaurora.org
Sun Aug 3 14:09:11 PDT 2014
LGTM.
On 08/03, Tobias Grosser wrote:
> On 03/08/2014 04:20, Johannes Doerfert wrote:
> >Hey Tobias,
> >
> >I think this change introduces an unwanted effect.
> >
> >For one dimensional parametric array accesses we add assumptions about the
> >parameters to ensure we access the array only in a positive range. Is this
> >intended? I see the point for multidimensional array accesses but why do we
> >enforce this for one dimensional accesses too?
>
> What about the attached patch?
>
> Tobias
>
> From fa0bb6d3c91730219e0bc6b5a8dcbd2a8b06bb19 Mon Sep 17 00:00:00 2001
> From: Tobias Grosser <tobias at grosser.es>
> Date: Sun, 3 Aug 2014 09:00:50 +0200
> Subject: [PATCH] Do allow negative offsets in the outermost array dimension
>
> There is no needed for neither 1-dimensional nor higher dimensional arrays to
> require positive offsets in the outermost array dimension.
>
> We originally introduced this assumption with the support for delinearizing
> multi-dimensional arrays.
> ---
> lib/Analysis/ScopInfo.cpp | 35 ++++++--------
> test/Isl/Ast/simple-run-time-condition.ll | 2 +-
> .../ScopInfo/multidim_2d_outer_larger_than_zero.ll | 53 ----------------------
> .../multidim_2d_outer_parametric_offset.ll | 53 ++++++++++++++++++++++
> .../multidim_ivs_and_parameteric_offsets_3d.ll | 2 +-
> 5 files changed, 70 insertions(+), 75 deletions(-)
> delete mode 100644 test/ScopInfo/multidim_2d_outer_larger_than_zero.ll
> create mode 100644 test/ScopInfo/multidim_2d_outer_parametric_offset.ll
>
> diff --git a/lib/Analysis/ScopInfo.cpp b/lib/Analysis/ScopInfo.cpp
> index aa63e24..1382c1d 100644
> --- a/lib/Analysis/ScopInfo.cpp
> +++ b/lib/Analysis/ScopInfo.cpp
> @@ -366,9 +366,9 @@ isl_basic_map *MemoryAccess::createBasicAccessMap(ScopStmt *Statement) {
> // expression of each array evaluates for each statement instance that is
> // executed to a value that is larger than zero and strictly smaller than the
> // size of the corresponding dimension). The only exception is the outermost
> -// dimension for which we do not assume any upper bound. At this point we
> -// formalize this assumption to ensure that at code generation time the relevant
> -// run-time checks can be generated.
> +// dimension for which we do not need to assume any upper bound. At this point
> +// we formalize this assumption to ensure that at code generation time the
> +// relevant run-time checks can be generated.
> //
> // To find the set of constraints necessary to avoid out of bound accesses, we
> // first build the set of data locations that are not within array bounds. We
> @@ -383,7 +383,7 @@ isl_basic_map *MemoryAccess::createBasicAccessMap(ScopStmt *Statement) {
> void MemoryAccess::assumeNoOutOfBound(const IRAccess &Access) {
> isl_space *Space = isl_space_range(getAccessRelationSpace());
> isl_set *Outside = isl_set_empty(isl_space_copy(Space));
> - for (int i = 0, Size = Access.Subscripts.size(); i < Size; ++i) {
> + for (int i = 1, Size = Access.Subscripts.size(); i < Size; ++i) {
> isl_local_space *LS = isl_local_space_from_space(isl_space_copy(Space));
> isl_pw_aff *Var =
> isl_pw_aff_var_on_domain(isl_local_space_copy(LS), isl_dim_set, i);
> @@ -391,22 +391,17 @@ void MemoryAccess::assumeNoOutOfBound(const IRAccess &Access) {
>
> isl_set *DimOutside;
>
> - if (i == 0) {
> - DimOutside = isl_pw_aff_lt_set(Var, Zero);
> - } else {
> - DimOutside = isl_pw_aff_lt_set(isl_pw_aff_copy(Var), Zero);
> - isl_pw_aff *SizeE =
> - SCEVAffinator::getPwAff(Statement, Access.Sizes[i - 1]);
> -
> - SizeE = isl_pw_aff_drop_dims(SizeE, isl_dim_in, 0,
> - Statement->getNumIterators());
> - SizeE = isl_pw_aff_add_dims(SizeE, isl_dim_in,
> - isl_space_dim(Space, isl_dim_set));
> - SizeE = isl_pw_aff_set_tuple_id(
> - SizeE, isl_dim_in, isl_space_get_tuple_id(Space, isl_dim_set));
> -
> - DimOutside = isl_set_union(DimOutside, isl_pw_aff_le_set(SizeE, Var));
> - }
> + DimOutside = isl_pw_aff_lt_set(isl_pw_aff_copy(Var), Zero);
> + isl_pw_aff *SizeE = SCEVAffinator::getPwAff(Statement, Access.Sizes[i - 1]);
> +
> + SizeE = isl_pw_aff_drop_dims(SizeE, isl_dim_in, 0,
> + Statement->getNumIterators());
> + SizeE = isl_pw_aff_add_dims(SizeE, isl_dim_in,
> + isl_space_dim(Space, isl_dim_set));
> + SizeE = isl_pw_aff_set_tuple_id(SizeE, isl_dim_in,
> + isl_space_get_tuple_id(Space, isl_dim_set));
> +
> + DimOutside = isl_set_union(DimOutside, isl_pw_aff_le_set(SizeE, Var));
>
> Outside = isl_set_union(Outside, DimOutside);
> }
> diff --git a/test/Isl/Ast/simple-run-time-condition.ll b/test/Isl/Ast/simple-run-time-condition.ll
> index 592a72b..8eff8be 100644
> --- a/test/Isl/Ast/simple-run-time-condition.ll
> +++ b/test/Isl/Ast/simple-run-time-condition.ll
> @@ -18,7 +18,7 @@ target triple = "x86_64-unknown-linux-gnu"
> ; for the delinearization is simplified such that conditions that would not
> ; cause any code to be executed are not generated.
>
> -; CHECK: if ((q == 100 && o <= 0 && p >= 0) || (q == 0 && o >= 1 && p >= 0) ? 1 : 0)
> +; CHECK: if ((q == 100 && o <= 0) || (q == 0 && o >= 1) ? 1 : 0)
>
> ; CHECK: if (o >= 1) {
> ; CHECK: for (int c1 = 0; c1 < n; c1 += 1)
> diff --git a/test/ScopInfo/multidim_2d_outer_larger_than_zero.ll b/test/ScopInfo/multidim_2d_outer_larger_than_zero.ll
> deleted file mode 100644
> index 0735446..0000000
> --- a/test/ScopInfo/multidim_2d_outer_larger_than_zero.ll
> +++ /dev/null
> @@ -1,53 +0,0 @@
> -; RUN: opt %loadPolly -polly-scops -analyze -polly-delinearize < %s | 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"
> -target triple = "x86_64-unknown-linux-gnu"
> -
> -; Derived from the following code:
> -;
> -; void foo(long n, long m, long p, double A[n][m]) {
> -; for (long i = 0; i < 100; i++)
> -; for (long j = 0; j < m; j++)
> -; A[i+p][j] = 1.0;
> -; }
> -
> -; CHECK: Assumed Context:
> -; CHECK: [m, p] -> { : p >= 0 }
> -; CHECK: p0: %m
> -; CHECK: p1: %p
> -; CHECK: Statements {
> -; CHECK: Stmt_for_j
> -; CHECK: Domain :=
> -; CHECK: [m, p] -> { Stmt_for_j[i0, i1] : i0 >= 0 and i0 <= 99 and i1 >= 0 and i1 <= -1 + m };
> -; CHECK: Scattering :=
> -; CHECK: [m, p] -> { Stmt_for_j[i0, i1] -> scattering[0, i0, 0, i1, 0] };
> -; CHECK: MustWriteAccess := [Reduction Type: NONE]
> -; CHECK: [m, p] -> { Stmt_for_j[i0, i1] -> MemRef_A[p + i0, i1] };
> -; CHECK: }
> -
> -define void @foo(i64 %n, i64 %m, i64 %p, double* %A) {
> -entry:
> - br label %for.i
> -
> -for.i:
> - %i = phi i64 [ 0, %entry ], [ %i.inc, %for.i.inc ]
> - %add = add nsw i64 %i, %p
> - %tmp = mul nsw i64 %add, %m
> - br label %for.j
> -
> -for.j:
> - %j = phi i64 [ 0, %for.i ], [ %j.inc, %for.j ]
> - %vlaarrayidx.sum = add i64 %j, %tmp
> - %arrayidx = getelementptr inbounds double* %A, i64 %vlaarrayidx.sum
> - store double 1.0, double* %arrayidx
> - %j.inc = add nsw i64 %j, 1
> - %j.exitcond = icmp eq i64 %j.inc, %m
> - br i1 %j.exitcond, label %for.i.inc, label %for.j
> -
> -for.i.inc:
> - %i.inc = add nsw i64 %i, 1
> - %i.exitcond = icmp eq i64 %i.inc, 100
> - br i1 %i.exitcond, label %end, label %for.i
> -
> -end:
> - ret void
> -}
> diff --git a/test/ScopInfo/multidim_2d_outer_parametric_offset.ll b/test/ScopInfo/multidim_2d_outer_parametric_offset.ll
> new file mode 100644
> index 0000000..2c281d0
> --- /dev/null
> +++ b/test/ScopInfo/multidim_2d_outer_parametric_offset.ll
> @@ -0,0 +1,53 @@
> +; RUN: opt %loadPolly -polly-scops -analyze -polly-delinearize < %s | 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"
> +target triple = "x86_64-unknown-linux-gnu"
> +
> +; Derived from the following code:
> +;
> +; void foo(long n, long m, long p, double A[n][m]) {
> +; for (long i = 0; i < 100; i++)
> +; for (long j = 0; j < m; j++)
> +; A[i+p][j] = 1.0;
> +; }
> +
> +; CHECK: Assumed Context:
> +; CHECK: [m, p] -> { : }
> +; CHECK: p0: %m
> +; CHECK: p1: %p
> +; CHECK: Statements {
> +; CHECK: Stmt_for_j
> +; CHECK: Domain :=
> +; CHECK: [m, p] -> { Stmt_for_j[i0, i1] : i0 >= 0 and i0 <= 99 and i1 >= 0 and i1 <= -1 + m };
> +; CHECK: Scattering :=
> +; CHECK: [m, p] -> { Stmt_for_j[i0, i1] -> scattering[0, i0, 0, i1, 0] };
> +; CHECK: MustWriteAccess := [Reduction Type: NONE]
> +; CHECK: [m, p] -> { Stmt_for_j[i0, i1] -> MemRef_A[p + i0, i1] };
> +; CHECK: }
> +
> +define void @foo(i64 %n, i64 %m, i64 %p, double* %A) {
> +entry:
> + br label %for.i
> +
> +for.i:
> + %i = phi i64 [ 0, %entry ], [ %i.inc, %for.i.inc ]
> + %add = add nsw i64 %i, %p
> + %tmp = mul nsw i64 %add, %m
> + br label %for.j
> +
> +for.j:
> + %j = phi i64 [ 0, %for.i ], [ %j.inc, %for.j ]
> + %vlaarrayidx.sum = add i64 %j, %tmp
> + %arrayidx = getelementptr inbounds double* %A, i64 %vlaarrayidx.sum
> + store double 1.0, double* %arrayidx
> + %j.inc = add nsw i64 %j, 1
> + %j.exitcond = icmp eq i64 %j.inc, %m
> + br i1 %j.exitcond, label %for.i.inc, label %for.j
> +
> +for.i.inc:
> + %i.inc = add nsw i64 %i, 1
> + %i.exitcond = icmp eq i64 %i.inc, 100
> + br i1 %i.exitcond, label %end, label %for.i
> +
> +end:
> + ret void
> +}
> diff --git a/test/ScopInfo/multidim_ivs_and_parameteric_offsets_3d.ll b/test/ScopInfo/multidim_ivs_and_parameteric_offsets_3d.ll
> index 7acb778..d77eb9c 100644
> --- a/test/ScopInfo/multidim_ivs_and_parameteric_offsets_3d.ll
> +++ b/test/ScopInfo/multidim_ivs_and_parameteric_offsets_3d.ll
> @@ -15,7 +15,7 @@ target triple = "x86_64-unknown-linux-gnu"
> ; (8 * %o)}<%for.j>,+,8}<%for.k>
>
> ; CHECK: Assumed Context:
> -; CHECK: [n, m, o, p, q, r] -> { : q = 0 and r = 0 and p >= 0 }
> +; CHECK: [n, m, o, p, q, r] -> { : q = 0 and r = 0 }
> ;
> ; CHECK: p0: %n
> ; CHECK: p1: %m
> --
> 1.8.3.2
>
--
Johannes Doerfert
Researcher / PhD Student
Compiler Design Lab (Prof. Hack)
Saarland University, Computer Science
Building E1.3, Room 4.26
Tel. +49 (0)681 302-57521 : doerfert at cs.uni-saarland.de
Fax. +49 (0)681 302-3065 : http://www.cdl.uni-saarland.de/people/doerfert
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 213 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20140803/a25df709/attachment.sig>
More information about the llvm-commits
mailing list