Skip to content

Conversation

@ro-i
Copy link
Contributor

@ro-i ro-i commented Aug 28, 2025

Reverts #146405

Reverting for further investigation due to getelementptr index size mismatch on ARM buildbot:

/home/tcwg-buildbot/worker/clang-armv8-quick/llvm/clang/test/OpenMP/parallel_num_threads_codegen.cpp:86:11: error: OMP60: expected string not found in input // OMP60: [[ARRDECAY:%.+]] = getelementptr inbounds [4 x i8], ptr [[STR:%.+]], i64 0, i64 0 ^ <stdin>:55:51: note: scanning from here call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @1, i32 0, ptr @main.omp_outlined.1) ^ <stdin>:58:8: note: possible intended match here %arraydecay = getelementptr inbounds [4 x i8], ptr %str, i32 0, i32 0 ^ Input file: <stdin> Check file: /home/tcwg-buildbot/worker/clang-armv8-quick/llvm/clang/test/OpenMP/parallel_num_threads_codegen.cpp -dump-input=help explains the following input dump. Input was: <<<<<< . . . 50: call void @__kmpc_push_num_threads(ptr @1, i32 %0, i32 2) 51: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @1, i32 0, ptr @main.omp_outlined) 52: %1 = load i8, ptr %a, align 1 53: %2 = sext i8 %1 to i32 54: call void @__kmpc_push_num_threads(ptr @1, i32 %0, i32 %2) 55: call void (ptr, i32, ptr, ...) @__kmpc_fork_call(ptr @1, i32 0, ptr @main.omp_outlined.1) check:86'0 X~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ error: no match found 56: call void @llvm.memcpy.p0.p0.i32(ptr align 1 %str, ptr align 1 @__const.main.str, i32 4, i1 false) check:86'0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57: store ptr @.str, ptr %str1, align 4 check:86'0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58: %arraydecay = getelementptr inbounds [4 x i8], ptr %str, i32 0, i32 0 check:86'0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ check:86'1 ? possible intended match ... 
@llvmbot llvmbot added clang Clang issues not falling into any other category clang:frontend Language frontend issues, e.g. anything involving "Sema" clang:modules C++20 modules and Clang Header Modules clang:codegen IR generation bugs: mangling, exceptions, etc. flang:openmp clang:openmp OpenMP related changes to Clang openmp:libomp OpenMP host runtime labels Aug 28, 2025
@llvmbot
Copy link
Member

llvmbot commented Aug 28, 2025

@llvm/pr-subscribers-clang-modules
@llvm/pr-subscribers-clang-codegen

@llvm/pr-subscribers-flang-openmp

Author: Robert Imschweiler (ro-i)

Changes

Reverts llvm/llvm-project#146405

Reverting for further investigation due to getelementptr index size mismatch on ARM buildbot:

/home/tcwg-buildbot/worker/clang-armv8-quick/llvm/clang/test/OpenMP/parallel_num_threads_codegen.cpp:86:11: error: OMP60: expected string not found in input // OMP60: [[ARRDECAY:%.+]] = getelementptr inbounds [4 x i8], ptr [[STR:%.+]], i64 0, i64 0 ^ &lt;stdin&gt;:55:51: note: scanning from here call void (ptr, i32, ptr, ...) @<!-- -->__kmpc_fork_call(ptr @<!-- -->1, i32 0, ptr @<!-- -->main.omp_outlined.1) ^ &lt;stdin&gt;:58:8: note: possible intended match here %arraydecay = getelementptr inbounds [4 x i8], ptr %str, i32 0, i32 0 ^ Input file: &lt;stdin&gt; Check file: /home/tcwg-buildbot/worker/clang-armv8-quick/llvm/clang/test/OpenMP/parallel_num_threads_codegen.cpp -dump-input=help explains the following input dump. Input was: &lt;&lt;&lt;&lt;&lt;&lt; . . . 50: call void @<!-- -->__kmpc_push_num_threads(ptr @<!-- -->1, i32 %0, i32 2) 51: call void (ptr, i32, ptr, ...) @<!-- -->__kmpc_fork_call(ptr @<!-- -->1, i32 0, ptr @<!-- -->main.omp_outlined) 52: %1 = load i8, ptr %a, align 1 53: %2 = sext i8 %1 to i32 54: call void @<!-- -->__kmpc_push_num_threads(ptr @<!-- -->1, i32 %0, i32 %2) 55: call void (ptr, i32, ptr, ...) @<!-- -->__kmpc_fork_call(ptr @<!-- -->1, i32 0, ptr @<!-- -->main.omp_outlined.1) check:86'0 X~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ error: no match found 56: call void @<!-- -->llvm.memcpy.p0.p0.i32(ptr align 1 %str, ptr align 1 @<!-- -->__const.main.str, i32 4, i1 false) check:86'0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57: store ptr @.str, ptr %str1, align 4 check:86'0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58: %arraydecay = getelementptr inbounds [4 x i8], ptr %str, i32 0, i32 0 check:86'0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ check:86'1 ? possible intended match ... 

Patch is 1.38 MiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/155809.diff

30 Files Affected:

  • (modified) clang/include/clang/AST/OpenMPClause.h (+39-20)
  • (modified) clang/include/clang/Basic/DiagnosticParseKinds.td (+1-3)
  • (modified) clang/lib/AST/OpenMPClause.cpp (+3-6)
  • (modified) clang/lib/CodeGen/CGOpenMPRuntime.cpp (+26-61)
  • (modified) clang/lib/CodeGen/CGOpenMPRuntime.h (+10-53)
  • (modified) clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp (+26-27)
  • (modified) clang/lib/CodeGen/CGOpenMPRuntimeGPU.h (+5-21)
  • (modified) clang/lib/CodeGen/CGStmtOpenMP.cpp (+2-14)
  • (modified) clang/lib/Sema/SemaOpenMP.cpp (+12-36)
  • (modified) clang/lib/Sema/TreeTransform.h (+2-1)
  • (modified) clang/lib/Serialization/ASTReader.cpp (-1)
  • (modified) clang/lib/Serialization/ASTWriter.cpp (-1)
  • (removed) clang/test/OpenMP/amdgcn_target_parallel_num_threads_codegen.cpp (-1095)
  • (modified) clang/test/OpenMP/distribute_parallel_for_num_threads_codegen.cpp (+172-2708)
  • (removed) clang/test/OpenMP/distribute_parallel_for_simd_num_threads_strict_codegen.cpp (-3541)
  • (modified) clang/test/OpenMP/error_codegen.cpp (+33-701)
  • (modified) clang/test/OpenMP/error_message.cpp (+1-5)
  • (modified) clang/test/OpenMP/nvptx_target_codegen.cpp (+66-847)
  • (modified) clang/test/OpenMP/nvptx_target_parallel_num_threads_codegen.cpp (+35-725)
  • (modified) clang/test/OpenMP/parallel_generic_loop_codegen.cpp (+2-212)
  • (modified) clang/test/OpenMP/parallel_message_messages.cpp (+6-22)
  • (modified) clang/test/OpenMP/parallel_num_threads_codegen.cpp (-46)
  • (modified) clang/test/OpenMP/target_parallel_generic_loop_codegen.cpp (+18-418)
  • (modified) clang/test/OpenMP/target_parallel_num_threads_messages.cpp (+3-103)
  • (removed) clang/test/OpenMP/target_parallel_num_threads_strict_codegen.cpp (-2956)
  • (removed) clang/test/OpenMP/teams_distribute_parallel_for_num_threads_strict_codegen.cpp (-1447)
  • (removed) clang/test/OpenMP/teams_distribute_parallel_for_simd_num_threads_strict_codegen.cpp (-1911)
  • (modified) llvm/include/llvm/Frontend/OpenMP/OMP.td (+1-67)
  • (modified) llvm/include/llvm/Frontend/OpenMP/OMPKinds.def (-12)
  • (modified) openmp/runtime/src/kmp.h (-1)
diff --git a/clang/include/clang/AST/OpenMPClause.h b/clang/include/clang/AST/OpenMPClause.h index 72effbc3e02fc..1118d3e062e68 100644 --- a/clang/include/clang/AST/OpenMPClause.h +++ b/clang/include/clang/AST/OpenMPClause.h @@ -1865,43 +1865,62 @@ class OMPSeverityClause final : public OMPClause { /// \endcode /// In this example directive '#pragma omp error' has simple /// 'message' clause with user error message of "GNU compiler required.". -class OMPMessageClause final - : public OMPOneStmtClause<llvm::omp::OMPC_message, OMPClause>, - public OMPClauseWithPreInit { +class OMPMessageClause final : public OMPClause { friend class OMPClauseReader; + /// Location of '(' + SourceLocation LParenLoc; + + // Expression of the 'message' clause. + Stmt *MessageString = nullptr; + /// Set message string of the clause. - void setMessageString(Expr *MS) { setStmt(MS); } + void setMessageString(Expr *MS) { MessageString = MS; } + + /// Sets the location of '('. + void setLParenLoc(SourceLocation Loc) { LParenLoc = Loc; } public: /// Build 'message' clause with message string argument /// /// \param MS Argument of the clause (message string). - /// \param HelperMS Helper statement for the construct. - /// \param CaptureRegion Innermost OpenMP region where expressions in this - /// clause must be captured. /// \param StartLoc Starting location of the clause. /// \param LParenLoc Location of '('. /// \param EndLoc Ending location of the clause. - OMPMessageClause(Expr *MS, Stmt *HelperMS, OpenMPDirectiveKind CaptureRegion, - SourceLocation StartLoc, SourceLocation LParenLoc, + OMPMessageClause(Expr *MS, SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) - : OMPOneStmtClause(MS, StartLoc, LParenLoc, EndLoc), - OMPClauseWithPreInit(this) { - setPreInitStmt(HelperMS, CaptureRegion); - } + : OMPClause(llvm::omp::OMPC_message, StartLoc, EndLoc), + LParenLoc(LParenLoc), MessageString(MS) {} /// Build an empty clause. - OMPMessageClause() : OMPOneStmtClause(), OMPClauseWithPreInit(this) {} + OMPMessageClause() + : OMPClause(llvm::omp::OMPC_message, SourceLocation(), SourceLocation()) { + } + + /// Returns the locaiton of '('. + SourceLocation getLParenLoc() const { return LParenLoc; } /// Returns message string of the clause. - Expr *getMessageString() const { return getStmtAs<Expr>(); } + Expr *getMessageString() const { return cast_or_null<Expr>(MessageString); } + + child_range children() { + return child_range(&MessageString, &MessageString + 1); + } + + const_child_range children() const { + return const_child_range(&MessageString, &MessageString + 1); + } + + child_range used_children() { + return child_range(child_iterator(), child_iterator()); + } + + const_child_range used_children() const { + return const_child_range(const_child_iterator(), const_child_iterator()); + } - /// Try to evaluate the message string at compile time. - std::optional<std::string> tryEvaluateString(ASTContext &Ctx) const { - if (Expr *MessageExpr = getMessageString()) - return MessageExpr->tryEvaluateString(Ctx); - return std::nullopt; + static bool classof(const OMPClause *T) { + return T->getClauseKind() == llvm::omp::OMPC_message; } }; diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td index d1a60490b6517..3a6a9e582c7ca 100644 --- a/clang/include/clang/Basic/DiagnosticParseKinds.td +++ b/clang/include/clang/Basic/DiagnosticParseKinds.td @@ -1506,10 +1506,8 @@ def err_omp_unexpected_directive : Error< "unexpected OpenMP directive %select{|'#pragma omp %1'}0">; def err_omp_expected_punc : Error< "expected ',' or ')' in '%0' %select{clause|directive}1">; -def warn_clause_expected_string_literal : Warning< +def warn_clause_expected_string : Warning< "expected string literal in 'clause %0' - ignoring">, InGroup<IgnoredPragmas>; -def warn_clause_expected_string: Warning< - "expected string in 'clause %0' - ignoring">, InGroup<IgnoredPragmas>; def err_omp_unexpected_clause : Error< "unexpected OpenMP clause '%0' in directive '#pragma omp %1'">; def err_omp_unexpected_clause_extension_only : Error< diff --git a/clang/lib/AST/OpenMPClause.cpp b/clang/lib/AST/OpenMPClause.cpp index 0930ca27c29f8..588b0dcc6d7b8 100644 --- a/clang/lib/AST/OpenMPClause.cpp +++ b/clang/lib/AST/OpenMPClause.cpp @@ -104,8 +104,6 @@ const OMPClauseWithPreInit *OMPClauseWithPreInit::get(const OMPClause *C) { return static_cast<const OMPFilterClause *>(C); case OMPC_ompx_dyn_cgroup_mem: return static_cast<const OMPXDynCGroupMemClause *>(C); - case OMPC_message: - return static_cast<const OMPMessageClause *>(C); case OMPC_default: case OMPC_proc_bind: case OMPC_safelen: @@ -160,6 +158,7 @@ const OMPClauseWithPreInit *OMPClauseWithPreInit::get(const OMPClause *C) { case OMPC_self_maps: case OMPC_at: case OMPC_severity: + case OMPC_message: case OMPC_device_type: case OMPC_match: case OMPC_nontemporal: @@ -1964,10 +1963,8 @@ void OMPClausePrinter::VisitOMPSeverityClause(OMPSeverityClause *Node) { } void OMPClausePrinter::VisitOMPMessageClause(OMPMessageClause *Node) { - OS << "message("; - if (Expr *E = Node->getMessageString()) - E->printPretty(OS, nullptr, Policy); - OS << ")"; + OS << "message(\"" + << cast<StringLiteral>(Node->getMessageString())->getString() << "\")"; } void OMPClausePrinter::VisitOMPScheduleClause(OMPScheduleClause *Node) { diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp index b38eb54036e60..b66608319bb51 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, OpenMPNumThreadsClauseModifier NumThreadsModifier, - OpenMPSeverityClauseKind Severity, const Expr *Message) { +void CGOpenMPRuntime::emitParallelCall(CodeGenFunction &CGF, SourceLocation Loc, + llvm::Function *OutlinedFn, + ArrayRef<llvm::Value *> CapturedVars, + const Expr *IfCond, + llvm::Value *NumThreads) { if (!CGF.HaveInsertPoint()) return; llvm::Value *RTLoc = emitUpdateLocation(CGF, Loc); @@ -2372,8 +2372,9 @@ void CGOpenMPRuntime::emitBarrierCall(CodeGenFunction &CGF, SourceLocation Loc, void CGOpenMPRuntime::emitErrorCall(CodeGenFunction &CGF, SourceLocation Loc, Expr *ME, bool IsFatal) { - llvm::Value *MVL = ME ? CGF.EmitScalarExpr(ME) - : llvm::ConstantPointerNull::get(CGF.VoidPtrTy); + llvm::Value *MVL = + ME ? CGF.EmitStringLiteralLValue(cast<StringLiteral>(ME)).getPointer(CGF) + : llvm::ConstantPointerNull::get(CGF.VoidPtrTy); // Build call void __kmpc_error(ident_t *loc, int severity, const char // *message) llvm::Value *Args[] = { @@ -2698,54 +2699,18 @@ llvm::Value *CGOpenMPRuntime::emitForNext(CodeGenFunction &CGF, CGF.getContext().BoolTy, Loc); } -llvm::Value *CGOpenMPRuntime::emitMessageClause(CodeGenFunction &CGF, - const Expr *Message) { - if (!Message) - return llvm::ConstantPointerNull::get(CGF.VoidPtrTy); - return CGF.EmitScalarExpr(Message); -} - -llvm::Value * -CGOpenMPRuntime::emitMessageClause(CodeGenFunction &CGF, - const OMPMessageClause *MessageClause) { - return emitMessageClause( - CGF, MessageClause ? MessageClause->getMessageString() : nullptr); -} - -llvm::Value * -CGOpenMPRuntime::emitSeverityClause(OpenMPSeverityClauseKind Severity) { - // OpenMP 6.0, 10.4: "If no severity clause is specified then the effect is - // as if sev-level is fatal." - return llvm::ConstantInt::get(CGM.Int32Ty, - Severity == OMPC_SEVERITY_warning ? 1 : 2); -} - -llvm::Value * -CGOpenMPRuntime::emitSeverityClause(const OMPSeverityClause *SeverityClause) { - return emitSeverityClause(SeverityClause ? SeverityClause->getSeverityKind() - : OMPC_SEVERITY_unknown); -} - -void CGOpenMPRuntime::emitNumThreadsClause( - CodeGenFunction &CGF, llvm::Value *NumThreads, SourceLocation Loc, - OpenMPNumThreadsClauseModifier Modifier, OpenMPSeverityClauseKind Severity, - const Expr *Message) { +void CGOpenMPRuntime::emitNumThreadsClause(CodeGenFunction &CGF, + llvm::Value *NumThreads, + SourceLocation Loc) { 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) - // 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; - Args.push_back(emitSeverityClause(Severity)); - Args.push_back(emitMessageClause(CGF, Message)); - } - CGF.EmitRuntimeCall( - OMPBuilder.getOrCreateRuntimeFunction(CGM.getModule(), FnID), Args); + 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); } void CGOpenMPRuntime::emitProcBindClause(CodeGenFunction &CGF, @@ -12149,11 +12114,12 @@ 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, OpenMPNumThreadsClauseModifier NumThreadsModifier, - OpenMPSeverityClauseKind Severity, const Expr *Message) { +void CGOpenMPSIMDRuntime::emitParallelCall(CodeGenFunction &CGF, + SourceLocation Loc, + llvm::Function *OutlinedFn, + ArrayRef<llvm::Value *> CapturedVars, + const Expr *IfCond, + llvm::Value *NumThreads) { llvm_unreachable("Not supported in SIMD-only mode"); } @@ -12256,10 +12222,9 @@ llvm::Value *CGOpenMPSIMDRuntime::emitForNext(CodeGenFunction &CGF, llvm_unreachable("Not supported in SIMD-only mode"); } -void CGOpenMPSIMDRuntime::emitNumThreadsClause( - CodeGenFunction &CGF, llvm::Value *NumThreads, SourceLocation Loc, - OpenMPNumThreadsClauseModifier Modifier, OpenMPSeverityClauseKind Severity, - const Expr *Message) { +void CGOpenMPSIMDRuntime::emitNumThreadsClause(CodeGenFunction &CGF, + llvm::Value *NumThreads, + SourceLocation Loc) { llvm_unreachable("Not supported in SIMD-only mode"); } diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.h b/clang/lib/CodeGen/CGOpenMPRuntime.h index eb04eceee236c..5be48b439f4fd 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntime.h +++ b/clang/lib/CodeGen/CGOpenMPRuntime.h @@ -777,22 +777,11 @@ 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, - OpenMPNumThreadsClauseModifier NumThreadsModifier = - OMPC_NUMTHREADS_unknown, - OpenMPSeverityClauseKind Severity = OMPC_SEVERITY_fatal, - const Expr *Message = nullptr); + virtual void emitParallelCall(CodeGenFunction &CGF, SourceLocation Loc, + llvm::Function *OutlinedFn, + ArrayRef<llvm::Value *> CapturedVars, + const Expr *IfCond, llvm::Value *NumThreads); /// Emits a critical region. /// \param CriticalName Name of the critical region. @@ -1048,28 +1037,13 @@ class CGOpenMPRuntime { Address IL, Address LB, Address UB, Address ST); - virtual llvm::Value *emitMessageClause(CodeGenFunction &CGF, - const Expr *Message); - virtual llvm::Value *emitMessageClause(CodeGenFunction &CGF, - const OMPMessageClause *MessageClause); - - virtual llvm::Value *emitSeverityClause(OpenMPSeverityClauseKind Severity); - virtual llvm::Value * - emitSeverityClause(const OMPSeverityClause *SeverityClause); - /// 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, - OpenMPNumThreadsClauseModifier Modifier = OMPC_NUMTHREADS_unknown, - OpenMPSeverityClauseKind Severity = OMPC_SEVERITY_fatal, - const Expr *Message = nullptr); + virtual void emitNumThreadsClause(CodeGenFunction &CGF, + llvm::Value *NumThreads, + SourceLocation Loc); /// 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. @@ -1763,21 +1737,11 @@ 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, - OpenMPNumThreadsClauseModifier NumThreadsModifier = - OMPC_NUMTHREADS_unknown, - OpenMPSeverityClauseKind Severity = OMPC_SEVERITY_fatal, - const Expr *Message = nullptr) override; + const Expr *IfCond, llvm::Value *NumThreads) override; /// Emits a critical region. /// \param CriticalName Name of the critical region. @@ -1947,16 +1911,9 @@ 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, - OpenMPNumThreadsClauseModifier Modifier = OMPC_NUMTHREADS_unknown, - OpenMPSeverityClauseKind Severity = OMPC_SEVERITY_fatal, - const Expr *Message = nullptr) override; + void emitNumThreadsClause(CodeGenFunction &CGF, llvm::Value *NumThreads, + SourceLocation Loc) 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 a80d9fd68ef2f..cff1071dd1c2e 100644 --- a/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp +++ b/clang/lib/CodeGen/CGOpenMPRuntimeGPU.cpp @@ -899,10 +899,9 @@ void CGOpenMPRuntimeGPU::emitProcBindClause(CodeGenFunction &CGF, // Nothing to do. } -void CGOpenMPRuntimeGPU::emitNumThreadsClause( - CodeGenFunction &CGF, llvm::Value *NumThreads, SourceLocation Loc, - OpenMPNumThreadsClauseModifier Modifier, OpenMPSeverityClauseKind Severity, - const Expr *Message) { +void CGOpenMPRuntimeGPU::emitNumThreadsClause(CodeGenFunction &CGF, + llvm::Value *NumThreads, + SourceLocation Loc) { // Nothing to do. } @@ -1202,17 +1201,18 @@ 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, OpenMPNumThreadsClauseModifier NumThreadsModifier, - OpenMPSeverityClauseKind Severity, const Expr *Message) { +void CGOpenMPRuntimeGPU::emitParallelCall(CodeGenFunction &CGF, + SourceLocation Loc, + llvm::Function *OutlinedFn, + ArrayRef<llvm::Value *> CapturedVars, + const Expr *IfCond, + llvm::Value *NumThreads) { if (!CGF.HaveInsertPoint()) return; - auto &&ParallelGen = [this, Loc, OutlinedFn, CapturedVars, IfCond, NumThreads, - NumThreadsModifier, Severity, Message]( - CodeGenFunction &CGF, PrePostActionTy &Action) { + auto &&ParallelGen = [this, Loc, OutlinedFn, CapturedVars, IfCond, + NumThreads](CodeGenFunction &CGF, + PrePostActionTy &Action) { CGBuilderTy &Bld = CGF.Builder; llvm::Value *NumThreadsVal = NumThreads; llvm::Function *WFn = WrapperFunctionsMap[OutlinedFn]; @@ -1260,22 +1260,21 @@ void CGOpenMPRuntimeGPU::emitParallelCall( NumThreadsVal = Bld.CreateZExtOrTrunc(NumThreadsVal, CGF.Int32Ty); assert(IfCondVal && "Expected a value"); - RuntimeFunction FnID = OMPRTL___kmpc_parallel_51; llvm::Value *RTLoc = emitUpdateLocation(CGF, Loc); - llvm::SmallVector<llvm::Value *, 10> Args( - {RTLoc, getThreadID(CGF, Loc), IfCondVal, NumThreadsVal, - llvm::ConstantInt::get(CGF.Int32Ty, -1), FnPtr, ID, - Bld.CreateBitOrPointerCast(CapturedVarsAd... [truncated] 
@ro-i ro-i merged commit 9d7e436 into main Aug 28, 2025
14 of 17 checks passed
@ro-i ro-i deleted the revert-146405-users/ro-i/omp-runtime-nt-strict_3 branch August 28, 2025 10:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

clang:codegen IR generation bugs: mangling, exceptions, etc. clang:frontend Language frontend issues, e.g. anything involving "Sema" clang:modules C++20 modules and Clang Header Modules clang:openmp OpenMP related changes to Clang clang Clang issues not falling into any other category flang:openmp openmp:libomp OpenMP host runtime

3 participants