From a29eb97db38c5cc56c1f8d5bc168f1b51c4824fa Mon Sep 17 00:00:00 2001 From: Alexey Bataev Date: Fri, 15 Dec 2017 16:28:31 +0000 Subject: [PATCH] [OPENMP] Codegen `declare simd` for function declarations. Previously the attributes were emitted only for function definitions. Patch adds emission of the attributes for function declarations. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@320826 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CodeGenFunction.cpp | 4 ---- lib/CodeGen/CodeGenModule.cpp | 3 +++ test/OpenMP/declare_simd_codegen.cpp | 29 ++++++++++++++++++++++++++++ 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/lib/CodeGen/CodeGenFunction.cpp b/lib/CodeGen/CodeGenFunction.cpp index a8dac422a6..f9155b2ba3 100644 --- a/lib/CodeGen/CodeGenFunction.cpp +++ b/lib/CodeGen/CodeGenFunction.cpp @@ -899,10 +899,6 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, } } - if (const FunctionDecl *FD = dyn_cast_or_null(D)) - if (CGM.getLangOpts().OpenMP && FD->hasAttr()) - CGM.getOpenMPRuntime().emitDeclareSimdFunction(FD, Fn); - // Add no-jump-tables value. Fn->addFnAttr("no-jump-tables", llvm::toStringRef(CGM.getCodeGenOpts().NoUseJumpTables)); diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 421a1ad3d0..c59dc71da5 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -1238,6 +1238,9 @@ void CodeGenModule::SetFunctionAttributes(GlobalDecl GD, llvm::Function *F, // is handled with better precision by the receiving DSO. if (!CodeGenOpts.SanitizeCfiCrossDso) CreateFunctionTypeMetadata(FD, F); + + if (getLangOpts().OpenMP && FD->hasAttr()) + getOpenMPRuntime().emitDeclareSimdFunction(FD, F); } void CodeGenModule::addUsedGlobal(llvm::GlobalValue *GV) { diff --git a/test/OpenMP/declare_simd_codegen.cpp b/test/OpenMP/declare_simd_codegen.cpp index 47e951999b..9ae476677c 100644 --- a/test/OpenMP/declare_simd_codegen.cpp +++ b/test/OpenMP/declare_simd_codegen.cpp @@ -5,14 +5,25 @@ #ifndef HEADER #define HEADER +#pragma omp declare simd linear(d : 8) +#pragma omp declare simd inbranch simdlen(32) +#pragma omp declare simd notinbranch +void add_1(float *d); + #pragma omp declare simd linear(d : 8) #pragma omp declare simd inbranch simdlen(32) #pragma omp declare simd notinbranch void add_1(float *d) {} +#pragma omp declare simd linear(d : 8) +#pragma omp declare simd inbranch simdlen(32) +#pragma omp declare simd notinbranch +void add_2(float *d); + #pragma omp declare simd aligned(hp, hp2) template void h(C *hp, C *hp2, C *hq, C *lin) { + add_2(0); } // Explicit specialization with . @@ -110,6 +121,7 @@ double foo(double x) { return 0; } // CHECK-DAG: define {{.+}}@_Z3bax2VVPdi( // CHECK-DAG: define {{.+}}@_Z3fooPffi( // CHECK-DAG: define {{.+}}@_Z3food( +// CHECK-DAG: declare {{.+}}@_Z5add_2Pf( // CHECK-DAG: "_ZGVbM4l8__Z5add_1Pf" // CHECK-DAG: "_ZGVbN4l8__Z5add_1Pf" @@ -277,6 +289,23 @@ double foo(double x) { return 0; } // CHECK-DAG: "_ZGVeM16ua16vl1__Z3fooPffi" // CHECK-DAG: "_ZGVeN16ua16vl1__Z3fooPffi" +// CHECK-DAG: "_ZGVbM4l8__Z5add_2Pf" +// CHECK-DAG: "_ZGVbN4l8__Z5add_2Pf" +// CHECK-DAG: "_ZGVcM8l8__Z5add_2Pf" +// CHECK-DAG: "_ZGVcN8l8__Z5add_2Pf" +// CHECK-DAG: "_ZGVdM8l8__Z5add_2Pf" +// CHECK-DAG: "_ZGVdN8l8__Z5add_2Pf" +// CHECK-DAG: "_ZGVeM16l8__Z5add_2Pf" +// CHECK-DAG: "_ZGVeN16l8__Z5add_2Pf" +// CHECK-DAG: "_ZGVbM32v__Z5add_2Pf" +// CHECK-DAG: "_ZGVcM32v__Z5add_2Pf" +// CHECK-DAG: "_ZGVdM32v__Z5add_2Pf" +// CHECK-DAG: "_ZGVeM32v__Z5add_2Pf" +// CHECK-DAG: "_ZGVbN2v__Z5add_2Pf" +// CHECK-DAG: "_ZGVcN4v__Z5add_2Pf" +// CHECK-DAG: "_ZGVdN4v__Z5add_2Pf" +// CHECK-DAG: "_ZGVeN8v__Z5add_2Pf" + // CHECK-DAG: "_ZGVbN2v__Z3food" // CHECK-DAG: "_ZGVcN4v__Z3food" // CHECK-DAG: "_ZGVdN4v__Z3food" -- 2.50.1