summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Grosser <tobias@grosser.es>2015-08-31 11:06:19 +0000
committerTobias Grosser <tobias@grosser.es>2015-08-31 11:06:19 +0000
commit9f3d55cf3dfec5f2353ac91e32ba9312b1a6fc70 (patch)
tree06d56c71184d2511120d6e8a3dbb93dbea94075b
parent5830b1991729774e812b9802880c377f784e77e7 (diff)
downloadbcm5719-llvm-9f3d55cf3dfec5f2353ac91e32ba9312b1a6fc70.tar.gz
bcm5719-llvm-9f3d55cf3dfec5f2353ac91e32ba9312b1a6fc70.zip
Generate scalar initialization loads at the beginning of the start BB
Our OpenMP code generation generated part of its launching code directly into the start basic block and without this change the scalar initialization was run _after_ the OpenMP threads have been launched. This resulted in uninitialized scalar values to be used. llvm-svn: 246427
-rw-r--r--polly/lib/CodeGen/BlockGenerators.cpp2
-rw-r--r--polly/test/Isl/CodeGen/OpenMP/single_loop_with_param.ll45
2 files changed, 46 insertions, 1 deletions
diff --git a/polly/lib/CodeGen/BlockGenerators.cpp b/polly/lib/CodeGen/BlockGenerators.cpp
index 2f18e29481f..81b470fb505 100644
--- a/polly/lib/CodeGen/BlockGenerators.cpp
+++ b/polly/lib/CodeGen/BlockGenerators.cpp
@@ -486,7 +486,7 @@ void BlockGenerator::createScalarInitialization(Scop &S) {
if (StartBB == R.getEntry())
StartBB = SplitBBTerm->getSuccessor(1);
- Builder.SetInsertPoint(StartBB->getTerminator());
+ Builder.SetInsertPoint(StartBB->begin());
for (auto &Pair : S.arrays()) {
auto &Array = Pair.second;
diff --git a/polly/test/Isl/CodeGen/OpenMP/single_loop_with_param.ll b/polly/test/Isl/CodeGen/OpenMP/single_loop_with_param.ll
new file mode 100644
index 00000000000..535af3a9c73
--- /dev/null
+++ b/polly/test/Isl/CodeGen/OpenMP/single_loop_with_param.ll
@@ -0,0 +1,45 @@
+; RUN: opt %loadPolly -polly-detect-unprofitable -polly-parallel \
+; RUN: -polly-parallel-force -polly-codegen -S -verify-dom-info < %s \
+; RUN: | FileCheck %s -check-prefix=IR
+
+; #define N 1024
+; float A[N];
+;
+; void single_parallel_loop(float alpha) {
+; for (long i = 0; i < N; i++)
+; A[i] = alpha;
+; }
+
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
+
+; Ensure the scalars are initialized before the OpenMP code is launched.
+
+; IR-LABEL: polly.start:
+; IR-NEXT: store float %alpha, float* %alpha.s2a
+
+; IR: GOMP_parallel_loop_runtime_start
+
+@A = common global [1024 x float] zeroinitializer, align 16
+
+define void @single_parallel_loop(float %alpha) nounwind {
+entry:
+ br label %for.i
+
+for.i:
+ %indvar = phi i64 [ %indvar.next, %for.inc], [ 0, %entry ]
+ %scevgep = getelementptr [1024 x float], [1024 x float]* @A, i64 0, i64 %indvar
+ %exitcond = icmp ne i64 %indvar, 1024
+ br i1 %exitcond, label %S, label %exit
+
+S:
+ %alphaplus = fadd float 1.0, %alpha
+ store float %alphaplus, float* %scevgep
+ br label %for.inc
+
+for.inc:
+ %indvar.next = add i64 %indvar, 1
+ br label %for.i
+
+exit:
+ ret void
+}
OpenPOWER on IntegriCloud