summaryrefslogtreecommitdiffstats
path: root/polly
diff options
context:
space:
mode:
authorMichael Kruse <llvm@meinersbur.de>2017-10-31 10:28:22 +0000
committerMichael Kruse <llvm@meinersbur.de>2017-10-31 10:28:22 +0000
commit06618bf71aa80466cc50181f16f0f5c1ba71e91a (patch)
treebb7183fcd328dabcb8cb4c7d788ba0761230f14b /polly
parent64325c51ada0d3a49773e530b47d605bb7528314 (diff)
downloadbcm5719-llvm-06618bf71aa80466cc50181f16f0f5c1ba71e91a.tar.gz
bcm5719-llvm-06618bf71aa80466cc50181f16f0f5c1ba71e91a.zip
[OpenMP] Fix reference collection of latest base ptrs.
When collecting base pointers that need to be made available in parallel subfunctions, use the base pointer associated with the latest ScopArrayInfo, instead of the original one. llvm-svn: 316983
Diffstat (limited to 'polly')
-rw-r--r--polly/lib/CodeGen/IslNodeBuilder.cpp2
-rw-r--r--polly/test/Isl/CodeGen/OpenMP/mapped-phi-access.ll6
-rw-r--r--polly/test/Isl/CodeGen/OpenMP/reference_latest.ll44
3 files changed, 48 insertions, 4 deletions
diff --git a/polly/lib/CodeGen/IslNodeBuilder.cpp b/polly/lib/CodeGen/IslNodeBuilder.cpp
index d6dafcbcb4a..381195d48ee 100644
--- a/polly/lib/CodeGen/IslNodeBuilder.cpp
+++ b/polly/lib/CodeGen/IslNodeBuilder.cpp
@@ -263,7 +263,7 @@ isl_stat addReferencesFromStmt(const ScopStmt *Stmt, void *UserPtr,
}
if (Access->isLatestArrayKind()) {
- auto *BasePtr = Access->getScopArrayInfo()->getBasePtr();
+ auto *BasePtr = Access->getLatestScopArrayInfo()->getBasePtr();
if (Instruction *OpInst = dyn_cast<Instruction>(BasePtr))
if (Stmt->getParent()->contains(OpInst))
continue;
diff --git a/polly/test/Isl/CodeGen/OpenMP/mapped-phi-access.ll b/polly/test/Isl/CodeGen/OpenMP/mapped-phi-access.ll
index 8065c31fb3e..5968840136e 100644
--- a/polly/test/Isl/CodeGen/OpenMP/mapped-phi-access.ll
+++ b/polly/test/Isl/CodeGen/OpenMP/mapped-phi-access.ll
@@ -53,6 +53,6 @@ attributes #0 = { nounwind uwtable "correctly-rounded-divide-sqrt-fp-math"="fals
; CHECK-LABEL: define internal void @main_polly_subfn(i8* %polly.par.userContext)
;
; CHECK: polly.stmt.for.body65.i226:
-; CHECK-NEXT: %polly.access.cast.polly.subfunc.arg.2 = bitcast i8* %polly.subfunc.arg.2 to double*
-; CHECK-NEXT: %polly.access.polly.subfunc.arg.2 = getelementptr double, double* %polly.access.cast.polly.subfunc.arg.2, i64 %polly.indvar
-; CHECK-NEXT: store double undef, double* %polly.access.polly.subfunc.arg.2
+; CHECK-NEXT: %polly.access.cast.polly.subfunc.arg.[[R0:[0-9]*]] = bitcast i8* %polly.subfunc.arg.{{[0-9]*}} to double*
+; CHECK-NEXT: %polly.access.polly.subfunc.arg.[[R1:[0-9]*]] = getelementptr double, double* %polly.access.cast.polly.subfunc.arg.[[R0]], i64 %polly.indvar
+; CHECK-NEXT: store double undef, double* %polly.access.polly.subfunc.arg.[[R1]]
diff --git a/polly/test/Isl/CodeGen/OpenMP/reference_latest.ll b/polly/test/Isl/CodeGen/OpenMP/reference_latest.ll
new file mode 100644
index 00000000000..4622fbf2e0b
--- /dev/null
+++ b/polly/test/Isl/CodeGen/OpenMP/reference_latest.ll
@@ -0,0 +1,44 @@
+; RUN: opt %loadPolly -polly-delicm -polly-simplify -polly-parallel -polly-codegen -S < %s | FileCheck %s
+;
+; Test that parallel codegen handles scalars mapped to other arrays.
+; After mapping "store double %add10" references the array "MemRef2".
+; Its base pointer therefore needs to be made available in the subfunction.
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+define void @reference_latest(float* nocapture readonly %data, i32 %n, i32 %m) {
+entry:
+ %0 = alloca double, i64 undef, align 16
+ %conv1 = sext i32 %m to i64
+ br label %while.body
+
+while.body:
+ %indvars.iv211 = phi i64 [ %conv1, %entry ], [ %indvars.iv.next212, %for.end ]
+ br label %for.body
+
+for.body:
+ %indvars.iv207 = phi i64 [ %indvars.iv211, %while.body ], [ %indvars.iv.next208, %for.body ]
+ %arrayidx7 = getelementptr inbounds float, float* %data, i64 0
+ %1 = load float, float* %arrayidx7, align 4
+ %add10 = fadd double undef, undef
+ %indvars.iv.next208 = add nsw i64 %indvars.iv207, 1
+ %lftr.wideiv = trunc i64 %indvars.iv.next208 to i32
+ %exitcond210 = icmp eq i32 %lftr.wideiv, %n
+ br i1 %exitcond210, label %for.end, label %for.body
+
+for.end:
+ %arrayidx12 = getelementptr inbounds double, double* %0, i64 %indvars.iv211
+ store double %add10, double* %arrayidx12, align 8
+ %indvars.iv.next212 = add nsw i64 %indvars.iv211, -1
+ %2 = trunc i64 %indvars.iv211 to i32
+ %tobool = icmp eq i32 %2, 0
+ br i1 %tobool, label %while.end, label %while.body
+
+while.end:
+ ret void
+}
+
+; CHECK-LABEL: define internal void @reference_latest_polly_subfn(i8* %polly.par.userContext)
+
+; CHECK: %polly.access.polly.subfunc.arg. = getelementptr double, double* %polly.subfunc.arg., i64 %{{[0-9]+}}
+; CHECK-NEXT: store double %p_add{{[0-9]*}}, double* %polly.access.polly.subfunc.arg.
OpenPOWER on IntegriCloud