Before this change wrapping range metadata resulted in exponential growth of the context, which made context construction of large scops very slow. Instead, we now just do not model the range information precisely, in case the number of disjuncts in the context has already reached a certain limit. llvm-svn: 295360
208 lines
6.7 KiB
LLVM
208 lines
6.7 KiB
LLVM
; RUN: opt %loadPolly -polly-scops -analyze < %s | FileCheck %s
|
|
;
|
|
; Check that the context is built fast and does not explode due to us
|
|
; combining a large number of non-convex ranges. Instead, after a certain
|
|
; time, we store range information with reduced precision.
|
|
;
|
|
; CHECK: Context:
|
|
; CHECK: [tmp_0, tmp_1, tmp_2, tmp_3, tmp_4, tmp_5, tmp_6, tmp_7, tmp_8,
|
|
; CHECK: tmp_9, tmp_10, tmp_11, tmp_12, tmp_13, tmp_14, tmp_15] -> { :
|
|
; CHECK: -2147483648 <= tmp_0 <= 2147483647 and
|
|
; CHECK: -2147483648 <= tmp_1 <= 2147483647 and
|
|
; CHECK: -2147483648 <= tmp_2 <= 2147483647 and
|
|
; CHECK: -2147483648 <= tmp_3 <= 2147483647 and
|
|
; CHECK: -2147483648 <= tmp_4 <= 2147483647 and
|
|
; CHECK: -2147483648 <= tmp_5 <= 2147483647 and
|
|
; CHECK: -2147483648 <= tmp_6 <= 2147483647 and
|
|
; CHECK: -2147483648 <= tmp_7 <= 2147483647 and
|
|
; CHECK: -2147483648 <= tmp_8 <= 2147483647 and
|
|
; CHECK: -2147483648 <= tmp_9 <= 2147483647 and
|
|
; CHECK: -2147483648 <= tmp_10 <= 2147483647 and
|
|
; CHECK: -2147483648 <= tmp_11 <= 2147483647 and
|
|
; CHECK: -2147483648 <= tmp_12 <= 2147483647 and
|
|
; CHECK: -2147483648 <= tmp_13 <= 2147483647 and
|
|
; CHECK: -2147483648 <= tmp_14 <= 2147483647 and
|
|
; CHECK: -2147483648 <= tmp_15 <= 2147483647 and
|
|
; CHECK: ((tmp_0 >= 256 and tmp_1 >= 256 and tmp_2 >= 256) or
|
|
; CHECK: (tmp_0 >= 256 and tmp_1 >= 256 and tmp_2 < 0) or
|
|
; CHECK: (tmp_0 >= 256 and tmp_1 < 0 and tmp_2 >= 256) or
|
|
; CHECK: (tmp_0 >= 256 and tmp_1 < 0 and tmp_2 < 0) or
|
|
; CHECK: (tmp_0 < 0 and tmp_1 >= 256 and tmp_2 >= 256) or
|
|
; CHECK: (tmp_0 < 0 and tmp_1 >= 256 and tmp_2 < 0) or
|
|
; CHECK: (tmp_0 < 0 and tmp_1 < 0 and tmp_2 >= 256) or
|
|
; CHECK: (tmp_0 < 0 and tmp_1 < 0 and tmp_2 < 0)) }
|
|
;
|
|
; void jd(int *A, int *p /* in [256, 0) */) {
|
|
; for (int i = 0; i < 1024; i++)
|
|
; A[i + *p] = i;
|
|
; }
|
|
;
|
|
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
|
|
|
|
define void @jd(i32* %A,
|
|
i32* %p_0,
|
|
i32* %p_1,
|
|
i32* %p_2,
|
|
i32* %p_3,
|
|
i32* %p_4,
|
|
i32* %p_5,
|
|
i32* %p_6,
|
|
i32* %p_7,
|
|
i32* %p_8,
|
|
i32* %p_9,
|
|
i32* %p_10,
|
|
i32* %p_11,
|
|
i32* %p_12,
|
|
i32* %p_13,
|
|
i32* %p_14,
|
|
i32* %p_15
|
|
) {
|
|
entry:
|
|
%tmp_0 = load i32, i32* %p_0, !range !0
|
|
%tmp_1 = load i32, i32* %p_1, !range !0
|
|
%tmp_2 = load i32, i32* %p_2, !range !0
|
|
%tmp_3 = load i32, i32* %p_3, !range !0
|
|
%tmp_4 = load i32, i32* %p_4, !range !0
|
|
%tmp_5 = load i32, i32* %p_5, !range !0
|
|
%tmp_6 = load i32, i32* %p_6, !range !0
|
|
%tmp_7 = load i32, i32* %p_7, !range !0
|
|
%tmp_8 = load i32, i32* %p_8, !range !0
|
|
%tmp_9 = load i32, i32* %p_9, !range !0
|
|
%tmp_10 = load i32, i32* %p_10, !range !0
|
|
%tmp_11 = load i32, i32* %p_11, !range !0
|
|
%tmp_12 = load i32, i32* %p_12, !range !0
|
|
%tmp_13 = load i32, i32* %p_13, !range !0
|
|
%tmp_14 = load i32, i32* %p_14, !range !0
|
|
%tmp_15 = load i32, i32* %p_15, !range !0
|
|
br label %for.cond
|
|
|
|
for.cond: ; preds = %for.inc, %entry
|
|
%i.0 = phi i32 [ 0, %entry ], [ %inc, %for.inc ]
|
|
%exitcond = icmp ne i32 %i.0, 1024
|
|
br i1 %exitcond, label %for.body_0, label %for.end
|
|
|
|
for.body_0:
|
|
%add_0 = add i32 %i.0, %tmp_0
|
|
%idxprom_0 = sext i32 %add_0 to i64
|
|
%arrayidx_0 = getelementptr inbounds i32, i32* %A, i64 %idxprom_0
|
|
store i32 %i.0, i32* %arrayidx_0, align 4
|
|
br label %for.body_1
|
|
|
|
for.body_1:
|
|
%add_1 = add i32 %i.0, %tmp_1
|
|
%idxprom_1 = sext i32 %add_1 to i64
|
|
%arrayidx_1 = getelementptr inbounds i32, i32* %A, i64 %idxprom_1
|
|
store i32 %i.0, i32* %arrayidx_1, align 4
|
|
br label %for.body_2
|
|
|
|
for.body_2:
|
|
%add_2 = add i32 %i.0, %tmp_2
|
|
%idxprom_2 = sext i32 %add_2 to i64
|
|
%arrayidx_2 = getelementptr inbounds i32, i32* %A, i64 %idxprom_2
|
|
store i32 %i.0, i32* %arrayidx_2, align 4
|
|
br label %for.body_3
|
|
|
|
for.body_3:
|
|
%add_3 = add i32 %i.0, %tmp_3
|
|
%idxprom_3 = sext i32 %add_3 to i64
|
|
%arrayidx_3 = getelementptr inbounds i32, i32* %A, i64 %idxprom_3
|
|
store i32 %i.0, i32* %arrayidx_3, align 4
|
|
br label %for.body_4
|
|
|
|
for.body_4:
|
|
%add_4 = add i32 %i.0, %tmp_4
|
|
%idxprom_4 = sext i32 %add_4 to i64
|
|
%arrayidx_4 = getelementptr inbounds i32, i32* %A, i64 %idxprom_4
|
|
store i32 %i.0, i32* %arrayidx_4, align 4
|
|
br label %for.body_5
|
|
|
|
for.body_5:
|
|
%add_5 = add i32 %i.0, %tmp_5
|
|
%idxprom_5 = sext i32 %add_5 to i64
|
|
%arrayidx_5 = getelementptr inbounds i32, i32* %A, i64 %idxprom_5
|
|
store i32 %i.0, i32* %arrayidx_5, align 4
|
|
br label %for.body_6
|
|
|
|
for.body_6:
|
|
%add_6 = add i32 %i.0, %tmp_6
|
|
%idxprom_6 = sext i32 %add_6 to i64
|
|
%arrayidx_6 = getelementptr inbounds i32, i32* %A, i64 %idxprom_6
|
|
store i32 %i.0, i32* %arrayidx_6, align 4
|
|
br label %for.body_7
|
|
|
|
for.body_7:
|
|
%add_7 = add i32 %i.0, %tmp_7
|
|
%idxprom_7 = sext i32 %add_7 to i64
|
|
%arrayidx_7 = getelementptr inbounds i32, i32* %A, i64 %idxprom_7
|
|
store i32 %i.0, i32* %arrayidx_7, align 4
|
|
br label %for.body_8
|
|
|
|
for.body_8:
|
|
%add_8 = add i32 %i.0, %tmp_8
|
|
%idxprom_8 = sext i32 %add_8 to i64
|
|
%arrayidx_8 = getelementptr inbounds i32, i32* %A, i64 %idxprom_8
|
|
store i32 %i.0, i32* %arrayidx_8, align 4
|
|
br label %for.body_9
|
|
|
|
for.body_9:
|
|
%add_9 = add i32 %i.0, %tmp_9
|
|
%idxprom_9 = sext i32 %add_9 to i64
|
|
%arrayidx_9 = getelementptr inbounds i32, i32* %A, i64 %idxprom_9
|
|
store i32 %i.0, i32* %arrayidx_9, align 4
|
|
br label %for.body_10
|
|
|
|
for.body_10:
|
|
%add_10 = add i32 %i.0, %tmp_10
|
|
%idxprom_10 = sext i32 %add_10 to i64
|
|
%arrayidx_10 = getelementptr inbounds i32, i32* %A, i64 %idxprom_10
|
|
store i32 %i.0, i32* %arrayidx_10, align 4
|
|
br label %for.body_11
|
|
|
|
for.body_11:
|
|
%add_11 = add i32 %i.0, %tmp_11
|
|
%idxprom_11 = sext i32 %add_11 to i64
|
|
%arrayidx_11 = getelementptr inbounds i32, i32* %A, i64 %idxprom_11
|
|
store i32 %i.0, i32* %arrayidx_11, align 4
|
|
br label %for.body_12
|
|
|
|
for.body_12:
|
|
%add_12 = add i32 %i.0, %tmp_12
|
|
%idxprom_12 = sext i32 %add_12 to i64
|
|
%arrayidx_12 = getelementptr inbounds i32, i32* %A, i64 %idxprom_12
|
|
store i32 %i.0, i32* %arrayidx_12, align 4
|
|
br label %for.body_13
|
|
|
|
for.body_13:
|
|
%add_13 = add i32 %i.0, %tmp_13
|
|
%idxprom_13 = sext i32 %add_13 to i64
|
|
%arrayidx_13 = getelementptr inbounds i32, i32* %A, i64 %idxprom_13
|
|
store i32 %i.0, i32* %arrayidx_13, align 4
|
|
br label %for.body_14
|
|
|
|
for.body_14:
|
|
%add_14 = add i32 %i.0, %tmp_14
|
|
%idxprom_14 = sext i32 %add_14 to i64
|
|
%arrayidx_14 = getelementptr inbounds i32, i32* %A, i64 %idxprom_14
|
|
store i32 %i.0, i32* %arrayidx_14, align 4
|
|
br label %for.body_15
|
|
|
|
for.body_15:
|
|
%add_15 = add i32 %i.0, %tmp_15
|
|
%idxprom_15 = sext i32 %add_15 to i64
|
|
%arrayidx_15 = getelementptr inbounds i32, i32* %A, i64 %idxprom_15
|
|
store i32 %i.0, i32* %arrayidx_15, align 4
|
|
br label %for.body_end
|
|
|
|
for.body_end:
|
|
br label %for.inc
|
|
|
|
for.inc:
|
|
%inc = add nsw i32 %i.0, 1
|
|
br label %for.cond
|
|
|
|
for.end: ; preds = %for.cond
|
|
ret void
|
|
}
|
|
|
|
!0 = !{ i32 256, i32 0 }
|