[polly] r246427 - Generate scalar initialization loads at the beginning of the start BB
Tobias Grosser via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 31 04:06:20 PDT 2015
Author: grosser
Date: Mon Aug 31 06:06:19 2015
New Revision: 246427
URL: http://llvm.org/viewvc/llvm-project?rev=246427&view=rev
Log:
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.
Added:
polly/trunk/test/Isl/CodeGen/OpenMP/single_loop_with_param.ll
Modified:
polly/trunk/lib/CodeGen/BlockGenerators.cpp
Modified: polly/trunk/lib/CodeGen/BlockGenerators.cpp
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/lib/CodeGen/BlockGenerators.cpp?rev=246427&r1=246426&r2=246427&view=diff
==============================================================================
--- polly/trunk/lib/CodeGen/BlockGenerators.cpp (original)
+++ polly/trunk/lib/CodeGen/BlockGenerators.cpp Mon Aug 31 06:06:19 2015
@@ -486,7 +486,7 @@ void BlockGenerator::createScalarInitial
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;
Added: polly/trunk/test/Isl/CodeGen/OpenMP/single_loop_with_param.ll
URL: http://llvm.org/viewvc/llvm-project/polly/trunk/test/Isl/CodeGen/OpenMP/single_loop_with_param.ll?rev=246427&view=auto
==============================================================================
--- polly/trunk/test/Isl/CodeGen/OpenMP/single_loop_with_param.ll (added)
+++ polly/trunk/test/Isl/CodeGen/OpenMP/single_loop_with_param.ll Mon Aug 31 06:06:19 2015
@@ -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
+
+ at 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
+}
More information about the llvm-commits
mailing list