[polly] r295360 - [ScopInfo] Bound the number of disjuncts in context
Tobias Grosser via llvm-commits
llvm-commits at lists.llvm.org
Thu Feb 16 11:11:26 PST 2017
Author: grosser
Date: Thu Feb 16 13:11:25 2017
New Revision: 295360
URL: http://llvm.org/viewvc/llvm-project?rev=295360&view=rev
Log:
[ScopInfo] Bound the number of disjuncts in context
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.
Added:
polly/trunk/test/ScopInfo/ranged_parameter_wrap_2.ll
Modified:
polly/trunk/lib/Analysis/ScopInfo.cpp
Modified: polly/trunk/lib/Analysis/ScopInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/Analysis/ScopInfo.cpp?rev=295360&r1=295359&r2=295360&view=diff
==============================================================================
--- polly/trunk/lib/Analysis/ScopInfo.cpp (original)
+++ polly/trunk/lib/Analysis/ScopInfo.cpp Thu Feb 16 13:11:25 2017
@@ -79,6 +79,11 @@ STATISTIC(AssumptionsDelinearization,
// are also unlikely to result in good code
static int const MaxDisjunctionsInDomain = 20;
+// The number of disjunct in the context after which we stop to add more
+// disjuncts. This parameter is there to avoid exponential growth in the
+// number of disjunct when adding non-convex sets to the context.
+static int const MaxDisjunctsInContext = 4;
+
static cl::opt<bool> PollyRemarksMinimal(
"polly-remarks-minimal",
cl::desc("Do not emit remarks about assumptions that are known"),
@@ -156,6 +161,9 @@ static __isl_give isl_set *addRangeBound
if (Range.isFullSet())
return S;
+ if (isl_set_n_basic_set(S) > MaxDisjunctsInContext)
+ return S;
+
// In case of signed wrapping, we can refine the set of valid values by
// excluding the part not covered by the wrapping range.
if (Range.isSignWrappedSet()) {
Added: polly/trunk/test/ScopInfo/ranged_parameter_wrap_2.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/ScopInfo/ranged_parameter_wrap_2.ll?rev=295360&view=auto
==============================================================================
--- polly/trunk/test/ScopInfo/ranged_parameter_wrap_2.ll (added)
+++ polly/trunk/test/ScopInfo/ranged_parameter_wrap_2.ll Thu Feb 16 13:11:25 2017
@@ -0,0 +1,207 @@
+; 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 }
More information about the llvm-commits
mailing list