summaryrefslogtreecommitdiffstats
path: root/polly/test
diff options
context:
space:
mode:
authorTobias Grosser <tobias@grosser.es>2015-09-05 10:32:56 +0000
committerTobias Grosser <tobias@grosser.es>2015-09-05 10:32:56 +0000
commit0d8874c0f6e1a57224ce3d67cfd88ac1d3d9ae51 (patch)
treeeb69c7248695c94399eeb8404f9e2e7c3ae607b5 /polly/test
parent5cce4381abfaa2e21010a016a225a3ff6886022a (diff)
downloadbcm5719-llvm-0d8874c0f6e1a57224ce3d67cfd88ac1d3d9ae51.tar.gz
bcm5719-llvm-0d8874c0f6e1a57224ce3d67cfd88ac1d3d9ae51.zip
OpenMP codegen: support generation of multi-dimensional access functions
When computing the index expressions for new, multi-dimensional memory accesses these new index expressions may reference original llvm::Values that are not transfered into the OpenMP subfunction. Using GlobalMap we now replace references to such values with the rewritten values that have e.g. been passed to the OpenMP subfunction. llvm-svn: 246923
Diffstat (limited to 'polly/test')
-rw-r--r--polly/test/Isl/CodeGen/OpenMP/new_multidim_access.ll78
1 files changed, 78 insertions, 0 deletions
diff --git a/polly/test/Isl/CodeGen/OpenMP/new_multidim_access.ll b/polly/test/Isl/CodeGen/OpenMP/new_multidim_access.ll
new file mode 100644
index 00000000000..bba5f0c3642
--- /dev/null
+++ b/polly/test/Isl/CodeGen/OpenMP/new_multidim_access.ll
@@ -0,0 +1,78 @@
+; RUN: opt %loadPolly -polly-import-jscop -polly-import-jscop-dir=%S \
+; RUN: -analyze < %s | FileCheck %s
+
+; RUN: opt %loadPolly -polly-import-jscop -polly-import-jscop-dir=%S \
+; RUN: -polly-codegen -polly-no-early-exit -S < %s \
+; RUN: -polly-parallel \
+; RUN: | FileCheck %s -check-prefix=IR
+
+; void new_multidim_access(long n, long m, float A[][m]) {
+; for (long i = 0; i < n; i++)
+; for (long j = 0; j < 100; j++)
+; A[i][2 * j] += i + j;
+; }
+
+; CHECK: ReadAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK: [n, m] -> { Stmt_bb4[i0, i1] -> MemRef_A[i0, 2i1] };
+; CHECK: new: [n, m] -> { Stmt_bb4[i0, i1] -> MemRef_A[i0, 13 + i1] };
+; CHECK: MustWriteAccess := [Reduction Type: NONE] [Scalar: 0]
+; CHECK: [n, m] -> { Stmt_bb4[i0, i1] -> MemRef_A[i0, 2i1] };
+; CHECK: new: [n, m] -> { Stmt_bb4[i0, i1] -> MemRef_A[i0, 43 + i1] };
+
+; IR: %polly.access.mul. = mul i64 %polly.indvar, %3
+; IR: %11 = add nsw i64 %polly.indvar5, 13
+; IR: %polly.access.add. = add i64 %polly.access.mul., %11
+; IR: %polly.access. = getelementptr float, float* %5, i64 %polly.access.add.
+; IR: %tmp10_p_scalar_ = load float, float* %polly.access., align 4, !alias.scope !0, !noalias !2, !llvm.mem.parallel_loop_access !3
+
+; IR: %polly.access.mul.9 = mul i64 %polly.indvar, %3
+; IR: %12 = add nsw i64 %polly.indvar5, 43
+; IR: %polly.access.add.10 = add i64 %polly.access.mul.9, %12
+; IR: %polly.access.11 = getelementptr float, float* %5, i64 %polly.access.add.10
+; IR: store float %p_tmp11, float* %polly.access.11, align 4, !alias.scope !0, !noalias !2, !llvm.mem.parallel_loop_access !3
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+
+define void @new_multidim_access(i64 %n, i64 %m, float* %A) {
+bb:
+ br label %bb1
+
+bb1: ; preds = %bb15, %bb
+ %i.0 = phi i64 [ 0, %bb ], [ %tmp16, %bb15 ]
+ %tmp = icmp slt i64 %i.0, %n
+ br i1 %tmp, label %bb2, label %bb17
+
+bb2: ; preds = %bb1
+ br label %bb3
+
+bb3: ; preds = %bb12, %bb2
+ %j.0 = phi i64 [ 0, %bb2 ], [ %tmp13, %bb12 ]
+ %exitcond = icmp ne i64 %j.0, 100
+ br i1 %exitcond, label %bb4, label %bb14
+
+bb4: ; preds = %bb3
+ %tmp5 = add nsw i64 %i.0, %j.0
+ %tmp6 = sitofp i64 %tmp5 to float
+ %tmp7 = shl nsw i64 %j.0, 1
+ %tmp8 = mul nsw i64 %i.0, %m
+ %.sum = add i64 %tmp8, %tmp7
+ %tmp9 = getelementptr inbounds float, float* %A, i64 %.sum
+ %tmp10 = load float, float* %tmp9, align 4
+ %tmp11 = fadd float %tmp10, %tmp6
+ store float %tmp11, float* %tmp9, align 4
+ br label %bb12
+
+bb12: ; preds = %bb4
+ %tmp13 = add nsw i64 %j.0, 1
+ br label %bb3
+
+bb14: ; preds = %bb3
+ br label %bb15
+
+bb15: ; preds = %bb14
+ %tmp16 = add nsw i64 %i.0, 1
+ br label %bb1
+
+bb17: ; preds = %bb1
+ ret void
+}
OpenPOWER on IntegriCloud