diff --git a/clang/test/OpenMP/thread_limit_nvptx.c b/clang/test/OpenMP/thread_limit_nvptx.c index 2132e1aa7834a..8444e77662d2f 100644 --- a/clang/test/OpenMP/thread_limit_nvptx.c +++ b/clang/test/OpenMP/thread_limit_nvptx.c @@ -7,7 +7,7 @@ #define HEADER void foo(int N) { -// CHECK: l11, !"maxntidx", i32 128} +// CHECK-NOT: l11, !"maxntidx", i32 128} #pragma omp target teams distribute parallel for simd for (int i = 0; i < N; ++i) ; diff --git a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h index c9ee0c25194c2..cc02b90cd8d21 100644 --- a/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h +++ b/llvm/include/llvm/Frontend/OpenMP/OMPIRBuilder.h @@ -2107,7 +2107,7 @@ class OpenMPIRBuilder { static std::pair readTeamBoundsForKernel(const Triple &T, Function &Kernel); static void writeTeamsForKernel(const Triple &T, Function &Kernel, int32_t LB, - int32_t UB); + int32_t UB, int32_t NTid); ///} private: diff --git a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp index 16507a69ea850..5791275a29201 100644 --- a/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp +++ b/llvm/lib/Frontend/OpenMP/OMPIRBuilder.cpp @@ -4554,16 +4554,16 @@ OpenMPIRBuilder::createTargetInit(const LocationDescription &Loc, bool IsSPMD, // Manifest the launch configuration in the metadata matching the kernel // environment. if (MinTeamsVal > 1 || MaxTeamsVal > 0) - writeTeamsForKernel(T, *Kernel, MinTeamsVal, MaxTeamsVal); + writeTeamsForKernel(T, *Kernel, MinTeamsVal, MaxTeamsVal, MaxThreadsVal); + + if (MaxThreadsVal > 0) + writeThreadBoundsForKernel(T, *Kernel, MinThreadsVal, MaxThreadsVal); // For max values, < 0 means unset, == 0 means set but unknown. if (MaxThreadsVal < 0) MaxThreadsVal = std::max( int32_t(getGridValue(T, Kernel).GV_Default_WG_Size), MinThreadsVal); - if (MaxThreadsVal > 0) - writeThreadBoundsForKernel(T, *Kernel, MinThreadsVal, MaxThreadsVal); - Constant *MinThreads = ConstantInt::getSigned(Int32, MinThreadsVal); Constant *MaxThreads = ConstantInt::getSigned(Int32, MaxThreadsVal); Constant *MinTeams = ConstantInt::getSigned(Int32, MinTeamsVal); @@ -4785,11 +4785,14 @@ OpenMPIRBuilder::readTeamBoundsForKernel(const Triple &, Function &Kernel) { } void OpenMPIRBuilder::writeTeamsForKernel(const Triple &T, Function &Kernel, - int32_t LB, int32_t UB) { + int32_t LB, int32_t UB, + int32_t NTid) { if (T.isNVPTX()) { if (UB > 0) updateNVPTXMetadata(Kernel, "maxclusterrank", UB, true); - updateNVPTXMetadata(Kernel, "minctasm", LB, false); + // The 'minctasm' attribute is ignored without 'maxntid' also being set. + if (NTid > 0) + updateNVPTXMetadata(Kernel, "minctasm", LB, false); } Kernel.addFnAttr("omp_target_num_teams", std::to_string(LB)); }