[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