[Mlir-commits] [clang] [llvm] [mlir] [llvm][OpenMP] Use vector for number of threads and teams (PR #211453)
Kevin Sala Penades
llvmlistbot at llvm.org
Wed Aug 19 23:58:56 PDT 2026
https://github.com/kevinsala updated https://github.com/llvm/llvm-project/pull/211453
>From 0d15a07a7cba7c1a9f38af9e2f170899266b6992 Mon Sep 17 00:00:00 2001
From: Kevin Sala <salapenades1 at llnl.gov>
Date: Wed, 22 Jul 2026 18:47:13 -0700
Subject: [PATCH] [llvm][OpenMP] Use vector for number of threads and teams
---
clang/lib/CodeGen/CGOpenMPRuntime.cpp | 9 ++++++---
.../llvm/Frontend/OpenMP/OMPIRBuilder.h | 8 ++++----
llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp | 19 ++++++++++--------
.../Frontend/OpenMPIRBuilderTest.cpp | 20 ++++++++++++-------
.../OpenMP/OpenMPToLLVMIRTranslation.cpp | 8 ++++----
5 files changed, 38 insertions(+), 26 deletions(-)
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
index 62d763b3b8ff9..5f85c2d97ad50 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -6353,7 +6353,8 @@ void CGOpenMPRuntime::computeMinAndMaxThreadsAndTeams(
int32_t &MaxTeamsVal = Attrs.MaxTeams.front();
int32_t &MaxThreadsVal = Attrs.MaxThreads.front();
- getNumTeamsExprForTargetDirective(CGF, D, Attrs.MinTeams, MaxTeamsVal);
+ getNumTeamsExprForTargetDirective(CGF, D, Attrs.MinTeams.front(),
+ MaxTeamsVal);
getNumThreadsExprForTargetDirective(CGF, D, MaxThreadsVal,
/*UpperBoundOnly=*/true);
@@ -6371,12 +6372,14 @@ void CGOpenMPRuntime::computeMinAndMaxThreadsAndTeams(
else
continue;
- Attrs.MinThreads = std::max(Attrs.MinThreads, AttrMinThreadsVal);
+ Attrs.MinThreads.front() =
+ std::max(Attrs.MinThreads.front(), AttrMinThreadsVal);
if (AttrMaxThreadsVal > 0)
MaxThreadsVal = MaxThreadsVal > 0
? std::min(MaxThreadsVal, AttrMaxThreadsVal)
: AttrMaxThreadsVal;
- Attrs.MinTeams = std::max(Attrs.MinTeams, AttrMinBlocksVal);
+ Attrs.MinTeams.front() =
+ std::max(Attrs.MinTeams.front(), AttrMinBlocksVal);
if (AttrMaxBlocksVal > 0)
MaxTeamsVal = MaxTeamsVal > 0 ? std::min(MaxTeamsVal, AttrMaxBlocksVal)
: AttrMaxBlocksVal;
diff --git a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
index f932224eed661..d65924f2a8b3b 100644
--- a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
+++ b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
@@ -2842,9 +2842,9 @@ class OpenMPIRBuilder {
omp::OMPTgtExecModeFlags ExecFlags =
omp::OMPTgtExecModeFlags::OMP_TGT_EXEC_MODE_GENERIC;
SmallVector<int32_t, 3> MaxTeams = {-1};
- int32_t MinTeams = 1;
+ SmallVector<int32_t, 3> MinTeams = {1};
SmallVector<int32_t, 3> MaxThreads = {-1};
- int32_t MinThreads = 1;
+ SmallVector<int32_t, 3> MinThreads = {1};
int32_t ReductionDataSize = 0;
};
@@ -2855,13 +2855,13 @@ class OpenMPIRBuilder {
/// launch OpenMP RTL function.
struct TargetKernelRuntimeAttrs {
SmallVector<Value *, 3> MaxTeams = {nullptr};
- Value *MinTeams = nullptr;
+ SmallVector<Value *, 3> MinTeams = {nullptr};
SmallVector<Value *, 3> TargetThreadLimit = {nullptr};
SmallVector<Value *, 3> TeamsThreadLimit = {nullptr};
/// 'parallel' construct 'num_threads' clause value, if present and it is an
/// SPMD kernel.
- Value *MaxThreads = nullptr;
+ SmallVector<Value *> MaxThreads = {nullptr};
/// Total number of iterations of the SPMD or Generic-SPMD kernel or null if
/// it is a generic kernel.
diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
index e6fac2744a8ae..6693a185aa100 100644
--- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
@@ -8561,8 +8561,9 @@ OpenMPIRBuilder::InsertPointTy OpenMPIRBuilder::createTargetInit(
// Manifest the launch configuration in the metadata matching the kernel
// environment.
- if (Attrs.MinTeams > 1 || Attrs.MaxTeams.front() > 0)
- writeTeamsForKernel(T, *Kernel, Attrs.MinTeams, Attrs.MaxTeams.front());
+ if (Attrs.MinTeams.front() > 1 || Attrs.MaxTeams.front() > 0)
+ writeTeamsForKernel(T, *Kernel, Attrs.MinTeams.front(),
+ Attrs.MaxTeams.front());
// If MaxThreads is not set and needs adjustment, select the maximum between
// the default workgroup size and the MinThreads value.
@@ -8571,18 +8572,20 @@ OpenMPIRBuilder::InsertPointTy OpenMPIRBuilder::createTargetInit(
if (hasGridValue(T)) {
MaxThreadsVal =
std::max(int32_t(getGridValue(T, Kernel).GV_Default_WG_Size),
- Attrs.MinThreads);
+ Attrs.MinThreads.front());
} else {
- MaxThreadsVal = Attrs.MinThreads;
+ MaxThreadsVal = Attrs.MinThreads.front();
}
}
if (MaxThreadsVal > 0)
- writeThreadBoundsForKernel(T, *Kernel, Attrs.MinThreads, MaxThreadsVal);
+ writeThreadBoundsForKernel(T, *Kernel, Attrs.MinThreads.front(),
+ MaxThreadsVal);
- Constant *MinThreads = ConstantInt::getSigned(Int32, Attrs.MinThreads);
+ Constant *MinThreads =
+ ConstantInt::getSigned(Int32, Attrs.MinThreads.front());
Constant *MaxThreads = ConstantInt::getSigned(Int32, MaxThreadsVal);
- Constant *MinTeams = ConstantInt::getSigned(Int32, Attrs.MinTeams);
+ Constant *MinTeams = ConstantInt::getSigned(Int32, Attrs.MinTeams.front());
Constant *MaxTeams = ConstantInt::getSigned(Int32, Attrs.MaxTeams.front());
Constant *ReductionDataSize =
ConstantInt::getSigned(Int32, Attrs.ReductionDataSize);
@@ -10138,7 +10141,7 @@ static void emitTargetCall(
SmallVector<Value *, 3> NumThreadsC;
Value *MaxThreadsClause =
RuntimeAttrs.TeamsThreadLimit.size() == 1
- ? InitMaxThreadsClause(RuntimeAttrs.MaxThreads)
+ ? InitMaxThreadsClause(RuntimeAttrs.MaxThreads.front())
: nullptr;
for (auto [TeamsVal, TargetVal] : zip_equal(
diff --git a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
index 084dcb0a5847f..5ecf397e24994 100644
--- a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
+++ b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
@@ -6491,10 +6491,11 @@ TEST_F(OpenMPIRBuilderTest, TargetRegion) {
OpenMPIRBuilder::TargetKernelRuntimeAttrs RuntimeAttrs;
OpenMPIRBuilder::TargetKernelDefaultAttrs DefaultAttrs = {
/*ExecFlags=*/omp::OMPTgtExecModeFlags::OMP_TGT_EXEC_MODE_GENERIC,
- /*MaxTeams=*/{10}, /*MinTeams=*/0, /*MaxThreads=*/{0}, /*MinThreads=*/0};
+ /*MaxTeams=*/{10}, /*MinTeams=*/{0}, /*MaxThreads=*/{0},
+ /*MinThreads=*/{0}};
RuntimeAttrs.TargetThreadLimit[0] = Builder.getInt32(20);
RuntimeAttrs.TeamsThreadLimit[0] = Builder.getInt32(30);
- RuntimeAttrs.MaxThreads = Builder.getInt32(40);
+ RuntimeAttrs.MaxThreads[0] = Builder.getInt32(40);
RuntimeAttrs.DeviceID = Builder.getInt64(llvm::omp::OMP_DEVICEID_UNDEF);
ASSERT_EXPECTED_INIT(
@@ -6668,7 +6669,8 @@ TEST_F(OpenMPIRBuilderTest, TargetRegionDevice) {
OpenMPIRBuilder::TargetKernelRuntimeAttrs RuntimeAttrs;
OpenMPIRBuilder::TargetKernelDefaultAttrs DefaultAttrs = {
/*ExecFlags=*/omp::OMPTgtExecModeFlags::OMP_TGT_EXEC_MODE_GENERIC,
- /*MaxTeams=*/{-1}, /*MinTeams=*/0, /*MaxThreads=*/{0}, /*MinThreads=*/0};
+ /*MaxTeams=*/{-1}, /*MinTeams=*/{0}, /*MaxThreads=*/{0},
+ /*MinThreads=*/{0}};
llvm::OpenMPIRBuilder::TargetDataInfo Info(
/*RequiresDevicePointerInfo=*/false,
/*SeparateBeginEndCalls=*/true);
@@ -6837,7 +6839,8 @@ TEST_F(OpenMPIRBuilderTest, TargetRegionSPMD) {
OpenMPIRBuilder::TargetKernelRuntimeAttrs RuntimeAttrs;
OpenMPIRBuilder::TargetKernelDefaultAttrs DefaultAttrs = {
/*ExecFlags=*/omp::OMPTgtExecModeFlags::OMP_TGT_EXEC_MODE_SPMD,
- /*MaxTeams=*/{-1}, /*MinTeams=*/0, /*MaxThreads=*/{0}, /*MinThreads=*/0};
+ /*MaxTeams=*/{-1}, /*MinTeams=*/{0}, /*MaxThreads=*/{0},
+ /*MinThreads=*/{0}};
RuntimeAttrs.LoopTripCount = Builder.getInt64(1000);
RuntimeAttrs.DeviceID = Builder.getInt64(llvm::omp::OMP_DEVICEID_UNDEF);
llvm::OpenMPIRBuilder::TargetDataInfo Info(
@@ -6949,7 +6952,8 @@ TEST_F(OpenMPIRBuilderTest, TargetRegionDeviceSPMD) {
OpenMPIRBuilder::TargetKernelRuntimeAttrs RuntimeAttrs;
OpenMPIRBuilder::TargetKernelDefaultAttrs DefaultAttrs = {
/*ExecFlags=*/omp::OMPTgtExecModeFlags::OMP_TGT_EXEC_MODE_SPMD,
- /*MaxTeams=*/{-1}, /*MinTeams=*/0, /*MaxThreads=*/{0}, /*MinThreads=*/0};
+ /*MaxTeams=*/{-1}, /*MinTeams=*/{0}, /*MaxThreads=*/{0},
+ /*MinThreads=*/{0}};
llvm::OpenMPIRBuilder::TargetDataInfo Info(
/*RequiresDevicePointerInfo=*/false,
/*SeparateBeginEndCalls=*/true);
@@ -7075,7 +7079,8 @@ TEST_F(OpenMPIRBuilderTest, ConstantAllocaRaise) {
OpenMPIRBuilder::TargetKernelRuntimeAttrs RuntimeAttrs;
OpenMPIRBuilder::TargetKernelDefaultAttrs DefaultAttrs = {
/*ExecFlags=*/omp::OMPTgtExecModeFlags::OMP_TGT_EXEC_MODE_GENERIC,
- /*MaxTeams=*/{-1}, /*MinTeams=*/0, /*MaxThreads=*/{0}, /*MinThreads=*/0};
+ /*MaxTeams=*/{-1}, /*MinTeams=*/{0}, /*MaxThreads=*/{0},
+ /*MinThreads=*/{0}};
llvm::OpenMPIRBuilder::TargetDataInfo Info(
/*RequiresDevicePointerInfo=*/false,
/*SeparateBeginEndCalls=*/true);
@@ -7293,7 +7298,8 @@ TEST_F(OpenMPIRBuilderTest, DebugRecordLoc) {
OpenMPIRBuilder::TargetKernelRuntimeAttrs RuntimeAttrs;
OpenMPIRBuilder::TargetKernelDefaultAttrs DefaultAttrs = {
/*ExecFlags=*/omp::OMPTgtExecModeFlags::OMP_TGT_EXEC_MODE_GENERIC,
- /*MaxTeams=*/{-1}, /*MinTeams=*/0, /*MaxThreads=*/{0}, /*MinThreads=*/0};
+ /*MaxTeams=*/{-1}, /*MinTeams=*/{0}, /*MaxThreads=*/{0},
+ /*MinThreads=*/{0}};
llvm::OpenMPIRBuilder::TargetDataInfo Info(
/*RequiresDevicePointerInfo=*/false,
/*SeparateBeginEndCalls=*/true);
diff --git a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
index 1a861767b5512..47a8493708d0f 100644
--- a/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
+++ b/mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
@@ -9160,9 +9160,9 @@ initTargetDefaultAttrs(omp::TargetOp targetOp, Operation *capturedOp,
attrs.ExecFlags = llvm::omp::OMP_TGT_EXEC_MODE_SPMD_NO_LOOP;
break;
}
- attrs.MinTeams = minTeamsVal;
+ attrs.MinTeams.front() = minTeamsVal;
attrs.MaxTeams.front() = maxTeamsVal;
- attrs.MinThreads = 1;
+ attrs.MinThreads.front() = 1;
attrs.MaxThreads.front() = combinedMaxThreadsVal;
attrs.ReductionDataSize = reductionDataSize;
}
@@ -9198,7 +9198,7 @@ initTargetRuntimeAttrs(llvm::IRBuilderBase &builder,
// truncate or sign extend lower and upper num_teams bounds as well as
// thread_limit to match int32 ABI requirements for the OpenMP runtime.
if (numTeamsLower)
- attrs.MinTeams = builder.CreateSExtOrTrunc(
+ attrs.MinTeams.front() = builder.CreateSExtOrTrunc(
moduleTranslation.lookupValue(numTeamsLower), builder.getInt32Ty());
if (numTeamsUpper)
@@ -9210,7 +9210,7 @@ initTargetRuntimeAttrs(llvm::IRBuilderBase &builder,
moduleTranslation.lookupValue(teamsThreadLimit), builder.getInt32Ty());
if (numThreads)
- attrs.MaxThreads = moduleTranslation.lookupValue(numThreads);
+ attrs.MaxThreads.front() = moduleTranslation.lookupValue(numThreads);
if (targetOp.hasHostEvalTripCount()) {
llvm::OpenMPIRBuilder *ompBuilder = moduleTranslation.getOpenMPBuilder();
More information about the Mlir-commits
mailing list