[Mlir-commits] [mlir] 01b363c - [llvm][OpenMP] Use vector for number of threads and teams (#211453)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Thu Aug 20 10:50:52 PDT 2026
Author: Kevin Sala Penades
Date: 2026-08-20T10:50:44-07:00
New Revision: 01b363c49104985f4f746d09094505d362e0253c
URL: https://github.com/llvm/llvm-project/commit/01b363c49104985f4f746d09094505d362e0253c
DIFF: https://github.com/llvm/llvm-project/commit/01b363c49104985f4f746d09094505d362e0253c.diff
LOG: [llvm][OpenMP] Use vector for number of threads and teams (#211453)
Changes necessary to support the `dims` modifier (OpenMP 6.1) in future PRs.
Added:
Modified:
clang/lib/CodeGen/CGOpenMPRuntime.cpp
llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h
llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp
mlir/lib/Target/LLVMIR/Dialect/OpenMP/OpenMPToLLVMIRTranslation.cpp
Removed:
################################################################################
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 707cb4bfed06a..6f097fa205c34 100644
--- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
+++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp
@@ -8565,8 +8565,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.
@@ -8575,18 +8576,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);
@@ -10142,7 +10145,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