summaryrefslogtreecommitdiffstats
path: root/polly/test/ScopInfo/redundant_parameter_constraint.ll
diff options
context:
space:
mode:
authorJohannes Doerfert <doerfert@cs.uni-saarland.de>2015-09-10 13:00:06 +0000
committerJohannes Doerfert <doerfert@cs.uni-saarland.de>2015-09-10 13:00:06 +0000
commit5b9ff8b667f932cb742c4b60f16a7ac39d8707dc (patch)
treeb231d1ccbbc6752597b67aeed95505cb57ccab0c /polly/test/ScopInfo/redundant_parameter_constraint.ll
parent171f07ed716862d67072507476d483fede3c58bf (diff)
downloadbcm5719-llvm-5b9ff8b667f932cb742c4b60f16a7ac39d8707dc.tar.gz
bcm5719-llvm-5b9ff8b667f932cb742c4b60f16a7ac39d8707dc.zip
Replace ScalarEvolution based domain generation
This patch replaces the last legacy part of the domain generation, namely the ScalarEvolution part that was used to obtain loop bounds. We now iterate over the loops in the region and propagate the back edge condition to the header blocks. Afterwards we propagate the new information once through the whole region. In this process we simply ignore unbounded parts of the domain and thereby assume the absence of infinite loops. + This patch already identified a couple of broken unit tests we had for years. + We allow more loops already and the step to multiple exit and multiple back edges is minimal. + It allows to model the overflow checks properly as we actually visit every block in the SCoP and know where which condition is evaluated. - It is currently not compatible with modulo constraints in the domain. Differential Revision: http://reviews.llvm.org/D12499 llvm-svn: 247279
Diffstat (limited to 'polly/test/ScopInfo/redundant_parameter_constraint.ll')
-rw-r--r--polly/test/ScopInfo/redundant_parameter_constraint.ll43
1 files changed, 43 insertions, 0 deletions
diff --git a/polly/test/ScopInfo/redundant_parameter_constraint.ll b/polly/test/ScopInfo/redundant_parameter_constraint.ll
new file mode 100644
index 00000000000..5da19c0fc1a
--- /dev/null
+++ b/polly/test/ScopInfo/redundant_parameter_constraint.ll
@@ -0,0 +1,43 @@
+; RUN: opt %loadPolly -polly-detect-unprofitable -polly-scops -analyze < %s | FileCheck %s
+;
+; The constraint that r2 has to be bigger than r1 is implicitly containted in
+; the domain, hence we do not want to see it explicitly.
+;
+; CHECK-NOT: r2 >= 1 + r1
+;
+; void wraps(int *A, int p, short q, char r1, char r2) {
+; for (char i = r1; i < r2; i++)
+; A[p + q] = A[(int)r1 + (int)r2];
+; }
+;
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+define void @wraps(i32* %A, i32 %p, i16 signext %q, i8 signext %r1, i8 signext %r2) {
+entry:
+ br label %for.cond
+
+for.cond: ; preds = %for.inc, %entry
+ %i.0 = phi i8 [ %r1, %entry ], [ %inc, %for.inc ]
+ %cmp = icmp slt i8 %i.0, %r2
+ br i1 %cmp, label %for.body, label %for.end
+
+for.body: ; preds = %for.cond
+ %conv3 = sext i8 %r1 to i64
+ %conv4 = sext i8 %r2 to i64
+ %add = add nsw i64 %conv3, %conv4
+ %arrayidx = getelementptr inbounds i32, i32* %A, i64 %add
+ %tmp = load i32, i32* %arrayidx, align 4
+ %conv5 = sext i16 %q to i32
+ %add6 = add nsw i32 %conv5, %p
+ %idxprom7 = sext i32 %add6 to i64
+ %arrayidx8 = getelementptr inbounds i32, i32* %A, i64 %idxprom7
+ store i32 %tmp, i32* %arrayidx8, align 4
+ br label %for.inc
+
+for.inc: ; preds = %for.body
+ %inc = add i8 %i.0, 1
+ br label %for.cond
+
+for.end: ; preds = %for.cond
+ ret void
+}
OpenPOWER on IntegriCloud