diff options
-rw-r--r-- | clang/lib/CodeGen/CodeGenFunction.cpp | 4 | ||||
-rw-r--r-- | clang/lib/CodeGen/CodeGenModule.cpp | 3 | ||||
-rw-r--r-- | clang/test/OpenMP/declare_simd_codegen.cpp | 29 |
3 files changed, 32 insertions, 4 deletions
diff --git a/clang/lib/CodeGen/CodeGenFunction.cpp b/clang/lib/CodeGen/CodeGenFunction.cpp index a8dac422a6e..f9155b2ba32 100644 --- a/clang/lib/CodeGen/CodeGenFunction.cpp +++ b/clang/lib/CodeGen/CodeGenFunction.cpp @@ -899,10 +899,6 @@ void CodeGenFunction::StartFunction(GlobalDecl GD, } } - if (const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D)) - if (CGM.getLangOpts().OpenMP && FD->hasAttr<OMPDeclareSimdDeclAttr>()) - CGM.getOpenMPRuntime().emitDeclareSimdFunction(FD, Fn); - // Add no-jump-tables value. Fn->addFnAttr("no-jump-tables", llvm::toStringRef(CGM.getCodeGenOpts().NoUseJumpTables)); diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 421a1ad3d0d..c59dc71da59 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/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<OMPDeclareSimdDeclAttr>()) + getOpenMPRuntime().emitDeclareSimdFunction(FD, F); } void CodeGenModule::addUsedGlobal(llvm::GlobalValue *GV) { diff --git a/clang/test/OpenMP/declare_simd_codegen.cpp b/clang/test/OpenMP/declare_simd_codegen.cpp index 47e951999b6..9ae476677c4 100644 --- a/clang/test/OpenMP/declare_simd_codegen.cpp +++ b/clang/test/OpenMP/declare_simd_codegen.cpp @@ -8,11 +8,22 @@ #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 <class C> void h(C *hp, C *hp2, C *hq, C *lin) { + add_2(0); } // Explicit specialization with <C=int>. @@ -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" |