Files
clang-p2996/polly/test/ScopInfo/multidim_single_and_multidim_array.ll
Tobias Grosser b3a85884f7 Do not use wrapping ranges to bound non-affine accesses
When deriving the range of valid values of a scalar evolution expression might
be a range [12, 8), where the upper bound is smaller than the lower bound and
where the range is expected to possibly wrap around. We theoretically could
model such a range as a union of two non-wrapping ranges, but do not do this
as of yet. Instead, we just do not derive any bounds. Before this change,
we could have obtained bounds where the maximal possible value is strictly
smaller than the minimal possible value, which is incorrect and also caused
assertions during scop modeling.

llvm-svn: 294891
2017-02-12 08:11:12 +00:00

93 lines
4.0 KiB
LLVM

; RUN: opt %loadPolly -polly-scops -polly-delinearize=false -analyze < %s | FileCheck %s
; RUN: opt %loadPolly -polly-scops -polly-delinearize=false -polly-allow-nonaffine -analyze < %s | FileCheck %s --check-prefix=NONAFFINE
; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s --check-prefix=DELIN
; RUN: opt %loadPolly -polly-scops -polly-allow-nonaffine -analyze < %s | FileCheck %s --check-prefix=DELIN
; RUN: opt %loadPolly -polly-function-scops -polly-delinearize=false -analyze < %s | FileCheck %s
; RUN: opt %loadPolly -polly-function-scops -polly-delinearize=false -polly-allow-nonaffine -analyze < %s | FileCheck %s --check-prefix=NONAFFINE
; RUN: opt %loadPolly -polly-function-scops -analyze < %s | FileCheck %s --check-prefix=DELIN
; RUN: opt %loadPolly -polly-function-scops -polly-allow-nonaffine -analyze < %s | FileCheck %s --check-prefix=DELIN
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
; void single-and-multi-dimensional-array(long n,float X[n][n]) {
; for (long i1 = 0; i1 < n; i1++)
; X[i1][0] = 1;
;
; for (long i2 = 0; i2 < n; i2++)
; X[n-1][i2] = 1;
; }
;
; In previous versions of Polly, the second access was detected as single
; dimensional access whereas the first one was detected as multi-dimensional.
; This test case checks that we now consistently delinearize the array accesses.
; CHECK-NOT: Stmt_for_i_1
; NONAFFINE: p0: %n
; NONAFFINE-NEXT: p1: ((-1 + %n) * %n)
;
; NONAFFINE: Statements {
; NONAFFINE-NEXT: Stmt_for_i_1
; NONAFFINE-NEXT: Domain :=
; NONAFFINE-NEXT: [n, p_1] -> { Stmt_for_i_1[i0] : 0 <= i0 < n };
; NONAFFINE-NEXT: Schedule :=
; NONAFFINE-NEXT: [n, p_1] -> { Stmt_for_i_1[i0] -> [0, i0] };
; NONAFFINE-NEXT: MayWriteAccess := [Reduction Type: NONE] [Scalar: 0]
; NONAFFINE-NEXT: [n, p_1] -> { Stmt_for_i_1[i0] -> MemRef_X[o0] };
; NONAFFINE-NEXT: Stmt_for_i_2
; NONAFFINE-NEXT: Domain :=
; NONAFFINE-NEXT: [n, p_1] -> { Stmt_for_i_2[i0] : 0 <= i0 < n };
; NONAFFINE-NEXT: Schedule :=
; NONAFFINE-NEXT: [n, p_1] -> { Stmt_for_i_2[i0] -> [1, i0] };
; NONAFFINE-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
; NONAFFINE-NEXT: [n, p_1] -> { Stmt_for_i_2[i0] -> MemRef_X[p_1 + i0] };
; NONAFFINE-NEXT: }
; DELIN: Statements {
; DELIN-NEXT: Stmt_for_i_1
; DELIN-NEXT: Domain :=
; DELIN-NEXT: [n] -> { Stmt_for_i_1[i0] : 0 <= i0 < n };
; DELIN-NEXT: Schedule :=
; DELIN-NEXT: [n] -> { Stmt_for_i_1[i0] -> [0, i0] };
; DELIN-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
; DELIN-NEXT: [n] -> { Stmt_for_i_1[i0] -> MemRef_X[i0, 0] };
; DELIN-NEXT: Stmt_for_i_2
; DELIN-NEXT: Domain :=
; DELIN-NEXT: [n] -> { Stmt_for_i_2[i0] : 0 <= i0 < n };
; DELIN-NEXT: Schedule :=
; DELIN-NEXT: [n] -> { Stmt_for_i_2[i0] -> [1, i0] };
; DELIN-NEXT: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
; DELIN-NEXT: [n] -> { Stmt_for_i_2[i0] -> MemRef_X[-1 + n, i0] };
; DELIN-NEXT: }
define void @single-and-multi-dimensional-array(i64 %n, float* %X) {
entry:
br label %for.i.1
for.i.1:
%indvar.1 = phi i64 [ 0, %entry ], [ %indvar.next.1, %for.i.1 ]
%offset.1 = mul i64 %n, %indvar.1
%arrayidx.1 = getelementptr float, float* %X, i64 %offset.1
store float 1.000000e+00, float* %arrayidx.1
%indvar.next.1 = add nsw i64 %indvar.1, 1
%exitcond.1 = icmp ne i64 %indvar.next.1, %n
br i1 %exitcond.1, label %for.i.1, label %next
next:
br label %for.i.2
for.i.2:
%indvar.2 = phi i64 [ 0, %next ], [ %indvar.next.2, %for.i.2 ]
%offset.2.a = add i64 %n, -1
%offset.2.b = mul i64 %n, %offset.2.a
%offset.2.c = add i64 %offset.2.b, %indvar.2
%arrayidx.2 = getelementptr float, float* %X, i64 %offset.2.c
store float 1.000000e+00, float* %arrayidx.2
%indvar.next.2 = add nsw i64 %indvar.2, 1
%exitcond.2 = icmp ne i64 %indvar.next.2, %n
br i1 %exitcond.2, label %for.i.2, label %exit
exit:
ret void
}