diff options
author | Michael Kruse <llvm@meinersbur.de> | 2017-10-31 10:28:22 +0000 |
---|---|---|
committer | Michael Kruse <llvm@meinersbur.de> | 2017-10-31 10:28:22 +0000 |
commit | 06618bf71aa80466cc50181f16f0f5c1ba71e91a (patch) | |
tree | bb7183fcd328dabcb8cb4c7d788ba0761230f14b /polly | |
parent | 64325c51ada0d3a49773e530b47d605bb7528314 (diff) | |
download | bcm5719-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.cpp | 2 | ||||
-rw-r--r-- | polly/test/Isl/CodeGen/OpenMP/mapped-phi-access.ll | 6 | ||||
-rw-r--r-- | polly/test/Isl/CodeGen/OpenMP/reference_latest.ll | 44 |
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. |