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(); _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
