aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Grosser <grosser@fim.uni-passau.de>2012-11-01 05:34:55 +0000
committerTobias Grosser <grosser@fim.uni-passau.de>2012-11-01 05:34:55 +0000
commitebe8c8cea23a138441ab5ab08fe62cf47a09e9d0 (patch)
tree979673ff59e56756a6cf8b5f93b676e209acf715
parent177982c478bd1344e68937a10082fd698b42a106 (diff)
downloadllvm-ebe8c8cea23a138441ab5ab08fe62cf47a09e9d0.zip
llvm-ebe8c8cea23a138441ab5ab08fe62cf47a09e9d0.tar.gz
llvm-ebe8c8cea23a138441ab5ab08fe62cf47a09e9d0.tar.bz2
Codegen: Selectively copy in array addresses for OpenMP code
The detection of values that need to be copied in to the generated OpenMP subfunction also detects the array base addresses needed in the SCoP. Hence, it is not necessary to unconditionally copy all the base addresses to the generated function. Test cases are modified to reflect this change. Arrays which are global variables do not occur in the struct passed to the subfunction anymore. A test case for base address copy-in is added in copy_in_array.{c,ll}. Committed with slight modifications Contributed by: Armin Groesslinger <armin.groesslinger@uni-passau.de> llvm-svn: 167215
-rw-r--r--polly/lib/CodeGen/CodeGeneration.cpp10
-rw-r--r--polly/test/CodeGen/OpenMP/copy_in_argument.ll2
-rw-r--r--polly/test/CodeGen/OpenMP/copy_in_temporary.ll2
-rw-r--r--polly/test/CodeGen/OpenMP/simple_nested_loop.ll8
-rw-r--r--polly/test/CodeGen/OpenMP/structnames.ll4
5 files changed, 7 insertions, 19 deletions
diff --git a/polly/lib/CodeGen/CodeGeneration.cpp b/polly/lib/CodeGen/CodeGeneration.cpp
index bac2427..84eafd8 100644
--- a/polly/lib/CodeGen/CodeGeneration.cpp
+++ b/polly/lib/CodeGen/CodeGeneration.cpp
@@ -504,16 +504,6 @@ SetVector<Value*> ClastStmtCodeGen::getOMPValues(const clast_stmt *Body) {
I != E; I++)
Values.insert(I->second);
- // The memory reference base addresses
- for (Scop::iterator SI = S->begin(), SE = S->end(); SI != SE; ++SI) {
- ScopStmt *Stmt = *SI;
- for (SmallVector<MemoryAccess*, 8>::iterator I = Stmt->memacc_begin(),
- E = Stmt->memacc_end(); I != E; ++I) {
- Value *BaseAddr = const_cast<Value*>((*I)->getBaseAddr());
- Values.insert((BaseAddr));
- }
- }
-
// Find the temporaries that are referenced in the clast statements'
// basic blocks but are not defined by these blocks (e.g., references
// to function arguments or temporaries defined before the start of
diff --git a/polly/test/CodeGen/OpenMP/copy_in_argument.ll b/polly/test/CodeGen/OpenMP/copy_in_argument.ll
index cc45cf6..34e691e 100644
--- a/polly/test/CodeGen/OpenMP/copy_in_argument.ll
+++ b/polly/test/CodeGen/OpenMP/copy_in_argument.ll
@@ -31,4 +31,4 @@ for.end: ; preds = %for.body
ret void
}
-; CHECK: %omp.userContext = alloca { [100 x float]*, float }
+; CHECK: %omp.userContext = alloca { float }
diff --git a/polly/test/CodeGen/OpenMP/copy_in_temporary.ll b/polly/test/CodeGen/OpenMP/copy_in_temporary.ll
index 1bd2352..f84edf8 100644
--- a/polly/test/CodeGen/OpenMP/copy_in_temporary.ll
+++ b/polly/test/CodeGen/OpenMP/copy_in_temporary.ll
@@ -32,4 +32,4 @@ for.end: ; preds = %for.body
ret void
}
-; CHECK: %omp.userContext = alloca { [100 x float]*, float }
+; CHECK: %omp.userContext = alloca { float }
diff --git a/polly/test/CodeGen/OpenMP/simple_nested_loop.ll b/polly/test/CodeGen/OpenMP/simple_nested_loop.ll
index 66877b2..5ef6bb1 100644
--- a/polly/test/CodeGen/OpenMP/simple_nested_loop.ll
+++ b/polly/test/CodeGen/OpenMP/simple_nested_loop.ll
@@ -55,12 +55,10 @@ entry:
declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind
-; CHECK: %omp.userContext = alloca { i32, [10 x double]* }
-; CHECK: getelementptr inbounds { i32, [10 x double]* }* %omp.userContext, i32 0, i32 0
+; CHECK: %omp.userContext = alloca { i32 }
+; CHECK: getelementptr inbounds { i32 }* %omp.userContext, i32 0, i32 0
; CHECK: store i32 %polly.loopiv, i32* %1
-; CHECK: getelementptr inbounds { i32, [10 x double]* }* %omp.userContext, i32 0, i32 1
-; CHECK: store [10 x double]* @A, [10 x double]** %2
-; CHECK: %omp_data = bitcast { i32, [10 x double]* }* %omp.userContext to i8*
+; CHECK: %omp_data = bitcast { i32 }* %omp.userContext to i8*
; CHECK: call void @GOMP_parallel_loop_runtime_start(void (i8*)* @loop_openmp.omp_subfn, i8* %omp_data, i32 0, i32 0, i32 10, i32 1)
; CHECK: call void @loop_openmp.omp_subfn(i8* %omp_data)
; CHECK: call void @GOMP_parallel_end()
diff --git a/polly/test/CodeGen/OpenMP/structnames.ll b/polly/test/CodeGen/OpenMP/structnames.ll
index 5ce7132..3e17e24 100644
--- a/polly/test/CodeGen/OpenMP/structnames.ll
+++ b/polly/test/CodeGen/OpenMP/structnames.ll
@@ -72,6 +72,6 @@ entry:
declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind
-; CHECK: %omp.userContext = alloca { [5 x float]*, [5 x float]* }
-; CHECK: %omp.userContext1 = alloca { i32, [5 x float]*, [5 x float]* }
+; CHECK: %omp.userContext = alloca {}
+; CHECK: %omp.userContext1 = alloca { i32 }