diff options
| author | Tobias Grosser <tobias@grosser.es> | 2015-08-31 11:06:19 +0000 |
|---|---|---|
| committer | Tobias Grosser <tobias@grosser.es> | 2015-08-31 11:06:19 +0000 |
| commit | 9f3d55cf3dfec5f2353ac91e32ba9312b1a6fc70 (patch) | |
| tree | 06d56c71184d2511120d6e8a3dbb93dbea94075b | |
| parent | 5830b1991729774e812b9802880c377f784e77e7 (diff) | |
| download | bcm5719-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.cpp | 2 | ||||
| -rw-r--r-- | polly/test/Isl/CodeGen/OpenMP/single_loop_with_param.ll | 45 |
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 +} |

