diff options
-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. |