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
93 lines
4.0 KiB
LLVM
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
|
|
}
|