llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-flang-openmp @llvm/pr-subscribers-clang Author: Robert Imschweiler (ro-i) <details> <summary>Changes</summary> OpenMP 6.0 12.1.2 specifies the behavior of the strict modifier for the num_threads clause on parallel directives, along with the message and severity clauses. This commit implements necessary codegen and runtime changes. --- Patch is 231.11 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/146346.diff 14 Files Affected: - (modified) clang/lib/CodeGen/CGOpenMPRuntime.cpp (+38-23) - (modified) clang/lib/CodeGen/CGOpenMPRuntime.h (+44-10) - (modified) clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp (+35-26) - (modified) clang/lib/CodeGen/CGOpenMPRuntimeGPU.h (+21-5) - (modified) clang/lib/CodeGen/CGStmtOpenMP.cpp (+9-1) - (modified) clang/test/OpenMP/nvptx_target_parallel_num_threads_codegen.cpp (+703-35) - (modified) clang/test/OpenMP/parallel_num_threads_codegen.cpp (+33) - (modified) clang/test/OpenMP/target_parallel_num_threads_messages.cpp (+72-3) - (added) clang/test/OpenMP/target_parallel_num_threads_strict_codegen.cpp (+1642) - (modified) llvm/include/llvm/Frontend/OpenMP/OMPKinds.def (+12) - (modified) offload/DeviceRTL/include/DeviceTypes.h (+6) - (modified) offload/DeviceRTL/src/Parallelism.cpp (+60-18) - (modified) openmp/runtime/src/kmp.h (+1) - (modified) openmp/runtime/src/kmp_runtime.cpp (+6) ``````````diff diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp index 8ccc37ef98a74..13a2d77bc156a 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp @@ -1845,11 +1845,11 @@ void CGOpenMPRuntime::emitIfClause(CodeGenFunction &CGF, const Expr *Cond, CGF.EmitBlock(ContBlock, /*IsFinished=*/true); } -void CGOpenMPRuntime::emitParallelCall(CodeGenFunction &CGF, SourceLocation Loc, - llvm::Function *OutlinedFn, - ArrayRef<llvm::Value *> CapturedVars, - const Expr *IfCond, - llvm::Value *NumThreads) { +void CGOpenMPRuntime::emitParallelCall( + CodeGenFunction &CGF, SourceLocation Loc, llvm::Function *OutlinedFn, + ArrayRef<llvm::Value *> CapturedVars, const Expr *IfCond, + llvm::Value *NumThreads, OpenMPNumThreadsClauseModifier NumThreadsModifier, + OpenMPSeverityClauseKind Severity, const Expr *Message) { if (!CGF.HaveInsertPoint()) return; llvm::Value *RTLoc = emitUpdateLocation(CGF, Loc); @@ -2699,18 +2699,33 @@ llvm::Value *CGOpenMPRuntime::emitForNext(CodeGenFunction &CGF, CGF.getContext().BoolTy, Loc); } -void CGOpenMPRuntime::emitNumThreadsClause(CodeGenFunction &CGF, - llvm::Value *NumThreads, - SourceLocation Loc) { +void CGOpenMPRuntime::emitNumThreadsClause( + CodeGenFunction &CGF, llvm::Value *NumThreads, SourceLocation Loc, + OpenMPNumThreadsClauseModifier Modifier, OpenMPSeverityClauseKind Severity, + const Expr *Message) { if (!CGF.HaveInsertPoint()) return; + llvm::SmallVector<llvm::Value *, 4> Args( + {emitUpdateLocation(CGF, Loc), getThreadID(CGF, Loc), + CGF.Builder.CreateIntCast(NumThreads, CGF.Int32Ty, /*isSigned*/ true)}); // Build call __kmpc_push_num_threads(&loc, global_tid, num_threads) - llvm::Value *Args[] = { - emitUpdateLocation(CGF, Loc), getThreadID(CGF, Loc), - CGF.Builder.CreateIntCast(NumThreads, CGF.Int32Ty, /*isSigned*/ true)}; - CGF.EmitRuntimeCall(OMPBuilder.getOrCreateRuntimeFunction( - CGM.getModule(), OMPRTL___kmpc_push_num_threads), - Args); + // or __kmpc_push_num_threads_strict(&loc, global_tid, num_threads, severity, + // messsage) if strict modifier is used. + RuntimeFunction FnID = OMPRTL___kmpc_push_num_threads; + if (Modifier == OMPC_NUMTHREADS_strict) { + FnID = OMPRTL___kmpc_push_num_threads_strict; + // OpenMP 6.0, 10.4: "If no severity clause is specified then the effect is + // as if sev-level is fatal." + Args.push_back(llvm::ConstantInt::get( + CGM.Int32Ty, Severity == OMPC_SEVERITY_warning ? 1 : 2)); + if (Message) + Args.push_back(CGF.EmitStringLiteralLValue(cast<StringLiteral>(Message)) + .getPointer(CGF)); + else + Args.push_back(llvm::ConstantPointerNull::get(CGF.VoidPtrTy)); + } + CGF.EmitRuntimeCall( + OMPBuilder.getOrCreateRuntimeFunction(CGM.getModule(), FnID), Args); } void CGOpenMPRuntime::emitProcBindClause(CodeGenFunction &CGF, @@ -11986,12 +12001,11 @@ llvm::Function *CGOpenMPSIMDRuntime::emitTaskOutlinedFunction( llvm_unreachable("Not supported in SIMD-only mode"); } -void CGOpenMPSIMDRuntime::emitParallelCall(CodeGenFunction &CGF, - SourceLocation Loc, - llvm::Function *OutlinedFn, - ArrayRef<llvm::Value *> CapturedVars, - const Expr *IfCond, - llvm::Value *NumThreads) { +void CGOpenMPSIMDRuntime::emitParallelCall( + CodeGenFunction &CGF, SourceLocation Loc, llvm::Function *OutlinedFn, + ArrayRef<llvm::Value *> CapturedVars, const Expr *IfCond, + llvm::Value *NumThreads, OpenMPNumThreadsClauseModifier NumThreadsModifier, + OpenMPSeverityClauseKind Severity, const Expr *Message) { llvm_unreachable("Not supported in SIMD-only mode"); } @@ -12094,9 +12108,10 @@ llvm::Value *CGOpenMPSIMDRuntime::emitForNext(CodeGenFunction &CGF, llvm_unreachable("Not supported in SIMD-only mode"); } -void CGOpenMPSIMDRuntime::emitNumThreadsClause(CodeGenFunction &CGF, - llvm::Value *NumThreads, - SourceLocation Loc) { +void CGOpenMPSIMDRuntime::emitNumThreadsClause( + CodeGenFunction &CGF, llvm::Value *NumThreads, SourceLocation Loc, + OpenMPNumThreadsClauseModifier Modifier, OpenMPSeverityClauseKind Severity, + const Expr *Message) { llvm_unreachable("Not supported in SIMD-only mode"); } diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.h b/clang/lib/CodeGen/CGOpenMPRuntime.h index 5be48b439f4fd..8f97dd70116c3 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.h +++ b/clang/lib/CodeGen/CGOpenMPRuntime.h @@ -777,11 +777,22 @@ class CGOpenMPRuntime { /// specified, nullptr otherwise. /// \param NumThreads The value corresponding to the num_threads clause, if /// any, or nullptr. + /// \param NumThreadsModifier The modifier of the num_threads clause, if + /// any, ignored otherwise. + /// \param Severity The severity corresponding to the num_threads clause, if + /// any, ignored otherwise. + /// \param Message The message string corresponding to the num_threads clause, + /// if any, or nullptr. /// - virtual void emitParallelCall(CodeGenFunction &CGF, SourceLocation Loc, - llvm::Function *OutlinedFn, - ArrayRef<llvm::Value *> CapturedVars, - const Expr *IfCond, llvm::Value *NumThreads); + virtual void + emitParallelCall(CodeGenFunction &CGF, SourceLocation Loc, + llvm::Function *OutlinedFn, + ArrayRef<llvm::Value *> CapturedVars, const Expr *IfCond, + llvm::Value *NumThreads, + OpenMPNumThreadsClauseModifier NumThreadsModifier = + OMPC_NUMTHREADS_unknown, + OpenMPSeverityClauseKind Severity = OMPC_SEVERITY_fatal, + const Expr *Message = nullptr); /// Emits a critical region. /// \param CriticalName Name of the critical region. @@ -1040,10 +1051,16 @@ class CGOpenMPRuntime { /// Emits call to void __kmpc_push_num_threads(ident_t *loc, kmp_int32 /// global_tid, kmp_int32 num_threads) to generate code for 'num_threads' /// clause. + /// If the modifier 'strict' is given: + /// Emits call to void __kmpc_push_num_threads_strict(ident_t *loc, kmp_int32 + /// global_tid, kmp_int32 num_threads, int severity, const char *message) to + /// generate code for 'num_threads' clause with 'strict' modifier. /// \param NumThreads An integer value of threads. - virtual void emitNumThreadsClause(CodeGenFunction &CGF, - llvm::Value *NumThreads, - SourceLocation Loc); + virtual void emitNumThreadsClause( + CodeGenFunction &CGF, llvm::Value *NumThreads, SourceLocation Loc, + OpenMPNumThreadsClauseModifier Modifier = OMPC_NUMTHREADS_unknown, + OpenMPSeverityClauseKind Severity = OMPC_SEVERITY_fatal, + const Expr *Message = nullptr); /// Emit call to void __kmpc_push_proc_bind(ident_t *loc, kmp_int32 /// global_tid, int proc_bind) to generate code for 'proc_bind' clause. @@ -1737,11 +1754,21 @@ class CGOpenMPSIMDRuntime final : public CGOpenMPRuntime { /// specified, nullptr otherwise. /// \param NumThreads The value corresponding to the num_threads clause, if /// any, or nullptr. + /// \param NumThreadsModifier The modifier of the num_threads clause, if + /// any, ignored otherwise. + /// \param Severity The severity corresponding to the num_threads clause, if + /// any, ignored otherwise. + /// \param Message The message string corresponding to the num_threads clause, + /// if any, or nullptr. /// void emitParallelCall(CodeGenFunction &CGF, SourceLocation Loc, llvm::Function *OutlinedFn, ArrayRef<llvm::Value *> CapturedVars, - const Expr *IfCond, llvm::Value *NumThreads) override; + const Expr *IfCond, llvm::Value *NumThreads, + OpenMPNumThreadsClauseModifier NumThreadsModifier = + OMPC_NUMTHREADS_unknown, + OpenMPSeverityClauseKind Severity = OMPC_SEVERITY_fatal, + const Expr *Message = nullptr) override; /// Emits a critical region. /// \param CriticalName Name of the critical region. @@ -1911,9 +1938,16 @@ class CGOpenMPSIMDRuntime final : public CGOpenMPRuntime { /// Emits call to void __kmpc_push_num_threads(ident_t *loc, kmp_int32 /// global_tid, kmp_int32 num_threads) to generate code for 'num_threads' /// clause. + /// If the modifier 'strict' is given: + /// Emits call to void __kmpc_push_num_threads_strict(ident_t *loc, kmp_int32 + /// global_tid, kmp_int32 num_threads, int severity, const char *message) to + /// generate code for 'num_threads' clause with 'strict' modifier. /// \param NumThreads An integer value of threads. - void emitNumThreadsClause(CodeGenFunction &CGF, llvm::Value *NumThreads, - SourceLocation Loc) override; + void emitNumThreadsClause( + CodeGenFunction &CGF, llvm::Value *NumThreads, SourceLocation Loc, + OpenMPNumThreadsClauseModifier Modifier = OMPC_NUMTHREADS_unknown, + OpenMPSeverityClauseKind Severity = OMPC_SEVERITY_fatal, + const Expr *Message = nullptr) override; /// Emit call to void __kmpc_push_proc_bind(ident_t *loc, kmp_int32 /// global_tid, int proc_bind) to generate code for 'proc_bind' clause. diff --git a/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp b/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp index e25b6948d30f8..7e4f47dc05329 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp @@ -899,9 +899,10 @@ void CGOpenMPRuntimeGPU::emitProcBindClause(CodeGenFunction &CGF, // Nothing to do. } -void CGOpenMPRuntimeGPU::emitNumThreadsClause(CodeGenFunction &CGF, - llvm::Value *NumThreads, - SourceLocation Loc) { +void CGOpenMPRuntimeGPU::emitNumThreadsClause( + CodeGenFunction &CGF, llvm::Value *NumThreads, SourceLocation Loc, + OpenMPNumThreadsClauseModifier Modifier, OpenMPSeverityClauseKind Severity, + const Expr *Message) { // Nothing to do. } @@ -1201,18 +1202,17 @@ void CGOpenMPRuntimeGPU::emitTeamsCall(CodeGenFunction &CGF, emitOutlinedFunctionCall(CGF, Loc, OutlinedFn, OutlinedFnArgs); } -void CGOpenMPRuntimeGPU::emitParallelCall(CodeGenFunction &CGF, - SourceLocation Loc, - llvm::Function *OutlinedFn, - ArrayRef<llvm::Value *> CapturedVars, - const Expr *IfCond, - llvm::Value *NumThreads) { +void CGOpenMPRuntimeGPU::emitParallelCall( + CodeGenFunction &CGF, SourceLocation Loc, llvm::Function *OutlinedFn, + ArrayRef<llvm::Value *> CapturedVars, const Expr *IfCond, + llvm::Value *NumThreads, OpenMPNumThreadsClauseModifier NumThreadsModifier, + OpenMPSeverityClauseKind Severity, const Expr *Message) { if (!CGF.HaveInsertPoint()) return; - auto &&ParallelGen = [this, Loc, OutlinedFn, CapturedVars, IfCond, - NumThreads](CodeGenFunction &CGF, - PrePostActionTy &Action) { + auto &&ParallelGen = [this, Loc, OutlinedFn, CapturedVars, IfCond, NumThreads, + NumThreadsModifier, Severity, Message]( + CodeGenFunction &CGF, PrePostActionTy &Action) { CGBuilderTy &Bld = CGF.Builder; llvm::Value *NumThreadsVal = NumThreads; llvm::Function *WFn = WrapperFunctionsMap[OutlinedFn]; @@ -1260,21 +1260,30 @@ void CGOpenMPRuntimeGPU::emitParallelCall(CodeGenFunction &CGF, NumThreadsVal = Bld.CreateZExtOrTrunc(NumThreadsVal, CGF.Int32Ty); assert(IfCondVal && "Expected a value"); + RuntimeFunction FnID = OMPRTL___kmpc_parallel_51; llvm::Value *RTLoc = emitUpdateLocation(CGF, Loc); - llvm::Value *Args[] = { - RTLoc, - getThreadID(CGF, Loc), - IfCondVal, - NumThreadsVal, - llvm::ConstantInt::get(CGF.Int32Ty, -1), - FnPtr, - ID, - Bld.CreateBitOrPointerCast(CapturedVarsAddrs.emitRawPointer(CGF), - CGF.VoidPtrPtrTy), - llvm::ConstantInt::get(CGM.SizeTy, CapturedVars.size())}; - CGF.EmitRuntimeCall(OMPBuilder.getOrCreateRuntimeFunction( - CGM.getModule(), OMPRTL___kmpc_parallel_51), - Args); + llvm::SmallVector<llvm::Value *, 10> Args( + {RTLoc, getThreadID(CGF, Loc), IfCondVal, NumThreadsVal, + llvm::ConstantInt::get(CGF.Int32Ty, -1), FnPtr, ID, + Bld.CreateBitOrPointerCast(CapturedVarsAddrs.emitRawPointer(CGF), + CGF.VoidPtrPtrTy), + llvm::ConstantInt::get(CGM.SizeTy, CapturedVars.size())}); + if (NumThreadsModifier == OMPC_NUMTHREADS_strict) { + FnID = OMPRTL___kmpc_parallel_60; + // OpenMP 6.0, 10.4: "If no severity clause is specified then the effect + // is as if sev-level is fatal." + Args.append( + {llvm::ConstantInt::get(CGM.Int32Ty, true), + llvm::ConstantInt::get(CGM.Int32Ty, + Severity == OMPC_SEVERITY_warning ? 1 : 2)}); + if (Message) + Args.push_back(CGF.EmitStringLiteralLValue(cast<StringLiteral>(Message)) + .getPointer(CGF)); + else + Args.push_back(llvm::ConstantPointerNull::get(CGF.VoidPtrTy)); + } + CGF.EmitRuntimeCall( + OMPBuilder.getOrCreateRuntimeFunction(CGM.getModule(), FnID), Args); }; RegionCodeGenTy RCG(ParallelGen); diff --git a/clang/lib/CodeGen/CGOpenMPRuntimeGPU.h b/clang/lib/CodeGen/CGOpenMPRuntimeGPU.h index b59f43a6915dd..3e367088a47f8 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntimeGPU.h +++ b/clang/lib/CodeGen/CGOpenMPRuntimeGPU.h @@ -165,9 +165,16 @@ class CGOpenMPRuntimeGPU : public CGOpenMPRuntime { /// Emits call to void __kmpc_push_num_threads(ident_t *loc, kmp_int32 /// global_tid, kmp_int32 num_threads) to generate code for 'num_threads' /// clause. + /// If the modifier 'strict' is given: + /// Emits call to void __kmpc_push_num_threads_strict(ident_t *loc, kmp_int32 + /// global_tid, kmp_int32 num_threads, int severity, const char *message) to + /// generate code for 'num_threads' clause with 'strict' modifier. /// \param NumThreads An integer value of threads. - void emitNumThreadsClause(CodeGenFunction &CGF, llvm::Value *NumThreads, - SourceLocation Loc) override; + void emitNumThreadsClause( + CodeGenFunction &CGF, llvm::Value *NumThreads, SourceLocation Loc, + OpenMPNumThreadsClauseModifier Modifier = OMPC_NUMTHREADS_unknown, + OpenMPSeverityClauseKind Severity = OMPC_SEVERITY_fatal, + const Expr *Message = nullptr) override; /// This function ought to emit, in the general case, a call to // the openmp runtime kmpc_push_num_teams. In NVPTX backend it is not needed @@ -229,12 +236,21 @@ class CGOpenMPRuntimeGPU : public CGOpenMPRuntime { /// \param IfCond Condition in the associated 'if' clause, if it was /// specified, nullptr otherwise. /// \param NumThreads The value corresponding to the num_threads clause, if - /// any, - /// or nullptr. + /// any, or nullptr. + /// \param NumThreadsModifier The modifier of the num_threads clause, if + /// any, ignored otherwise. + /// \param Severity The severity corresponding to the num_threads clause, if + /// any, ignored otherwise. + /// \param Message The message string corresponding to the num_threads clause, + /// if any, or nullptr. void emitParallelCall(CodeGenFunction &CGF, SourceLocation Loc, llvm::Function *OutlinedFn, ArrayRef<llvm::Value *> CapturedVars, - const Expr *IfCond, llvm::Value *NumThreads) override; + const Expr *IfCond, llvm::Value *NumThreads, + OpenMPNumThreadsClauseModifier NumThreadsModifier = + OMPC_NUMTHREADS_unknown, + OpenMPSeverityClauseKind Severity = OMPC_SEVERITY_fatal, + const Expr *Message = nullptr) override; /// Emit an implicit/explicit barrier for OpenMP threads. /// \param Kind Directive for which this implicit barrier call must be diff --git a/clang/lib/CodeGen/CGStmtOpenMP.cpp b/clang/lib/CodeGen/CGStmtOpenMP.cpp index d9195d749e056..e666c252b8885 100644 --- a/clang/lib/CodeGen/CGStmtOpenMP.cpp +++ b/clang/lib/CodeGen/CGStmtOpenMP.cpp @@ -1616,8 +1616,16 @@ static void emitCommonOMPParallelDirective( CodeGenFunction::RunCleanupsScope NumThreadsScope(CGF); NumThreads = CGF.EmitScalarExpr(NumThreadsClause->getNumThreads(), /*IgnoreResultAssign=*/true); + OpenMPNumThreadsClauseModifier Modifier = NumThreadsClause->getModifier(); + OpenMPSeverityClauseKind Severity = OMPC_SEVERITY_fatal; + clang::Expr *Message = nullptr; + if (const auto *MessageClause = S.getSingleClause<OMPMessageClause>()) + Message = MessageClause->getMessageString(); + if (const auto *SeverityClause = S.getSingleClause<OMPSeverityClause>()) + Severity = SeverityClause->getSeverityKind(); CGF.CGM.getOpenMPRuntime().emitNumThreadsClause( - CGF, NumThreads, NumThreadsClause->getBeginLoc()); + CGF, NumThreads, NumThreadsClause->getBeginLoc(), Modifier, Severity, + Message); } if (const auto *ProcBindClause = S.getSingleClause<OMPProcBindClause>()) { CodeGenFunction::RunCleanupsScope ProcBindScope(CGF); diff --git a/clang/test/OpenMP/nvptx_target_parallel_num_threads_codegen.cpp b/clang/test/OpenMP/nvptx_target_parallel_num_threads_codegen.cpp index f92ce4e89464b..7de49fed0ca65 100644 --- a/clang/test/OpenMP/nvptx_target_parallel_num_threads_codegen.cpp +++ b/clang/test/OpenMP/nvptx_target_parallel_num_threads_codegen.cpp @@ -1,10 +1,16 @@ // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --function-signature --include-generated-funcs --replace-value-regex "__omp_offloading_[0-9a-z]+_[0-9a-z]+" "reduction_size[.].+[.]" "pl_cond[.].+[.|,]" --prefix-filecheck-ir-name _ // Test target codegen - host bc file has to be created first. // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -fopenmp-cuda-mode -x c++ -triple powerpc64le-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm-bc %s -o %t-ppc-host.bc -// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -fopenmp-cuda-mode -x c++ -triple nvptx64-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - -disable-llvm-optzns | FileCheck %s --check-prefix=CHECK1 +// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -fopenmp-cuda-mode -x c++ -triple nvptx64-unknown-unknown -fopenmp-targets=nvptx64-nvidia-cuda -emit-llvm %s -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-ppc-host.bc -o - -disable-llvm-optzns | FileCheck %s --check-prefix=OMP45_1 // RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -fopenmp-cuda-mode -x c++ -triple i386-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm-bc %s -o %t-x86-host.bc -// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -fopenmp-cuda-mode -x c++ -triple nvptx-unknown-unknown -fopenmp-targets=nvptx-nvidia-cuda -emit-llvm %s -fopenmp-is-target-device -fopenmp-host-ir-file-path %t-x86-host.bc -o - -disable-llvm-optzns | FileCheck %s --check-prefix=CHECK2 -// RUN: %clang_cc1 -verify -fopenmp -fopenmp-version=45 -fopenmp-c... [truncated] `````````` </details> https://github.com/llvm/llvm-project/pull/146346 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits