diff --git a/offload/DeviceRTL/include/State.h b/offload/DeviceRTL/include/State.h index 565235cd48a91..c487ff29680fa 100644 --- a/offload/DeviceRTL/include/State.h +++ b/offload/DeviceRTL/include/State.h @@ -158,63 +158,61 @@ struct DateEnvironmentRAII { /// TODO void resetStateForThread(uint32_t TId); -inline uint32_t &lookupForModify32Impl(uint32_t state::ICVStateTy::*Var, - IdentTy *Ident, bool ForceTeamState) { - if (OMP_LIKELY(ForceTeamState || !config::mayUseThreadStates() || - !TeamState.HasThreadState)) - return TeamState.ICVState.*Var; - uint32_t TId = mapping::getThreadIdInBlock(); - if (OMP_UNLIKELY(!ThreadStates[TId])) { - ThreadStates[TId] = reinterpret_cast(memory::allocGlobal( - sizeof(ThreadStateTy), "ICV modification outside data environment")); - ASSERT(ThreadStates[TId] != nullptr, "Nullptr returned by malloc!"); - TeamState.HasThreadState = true; - ThreadStates[TId]->init(); +// FIXME: https://github.com/llvm/llvm-project/issues/123241. +#define lookupForModify32Impl(Member, Ident, ForceTeamState) \ + { \ + if (OMP_LIKELY(ForceTeamState || !config::mayUseThreadStates() || \ + !TeamState.HasThreadState)) \ + return TeamState.ICVState.Member; \ + uint32_t TId = mapping::getThreadIdInBlock(); \ + if (OMP_UNLIKELY(!ThreadStates[TId])) { \ + ThreadStates[TId] = reinterpret_cast( \ + memory::allocGlobal(sizeof(ThreadStateTy), \ + "ICV modification outside data environment")); \ + ASSERT(ThreadStates[TId] != nullptr, "Nullptr returned by malloc!"); \ + TeamState.HasThreadState = true; \ + ThreadStates[TId]->init(); \ + } \ + return ThreadStates[TId]->ICVState.Member; \ } - return ThreadStates[TId]->ICVState.*Var; -} -inline uint32_t &lookupImpl(uint32_t state::ICVStateTy::*Var, - bool ForceTeamState) { - auto TId = mapping::getThreadIdInBlock(); - if (OMP_UNLIKELY(!ForceTeamState && config::mayUseThreadStates() && - TeamState.HasThreadState && ThreadStates[TId])) - return ThreadStates[TId]->ICVState.*Var; - return TeamState.ICVState.*Var; -} +// FIXME: https://github.com/llvm/llvm-project/issues/123241. +#define lookupImpl(Member, ForceTeamState) \ + { \ + auto TId = mapping::getThreadIdInBlock(); \ + if (OMP_UNLIKELY(!ForceTeamState && config::mayUseThreadStates() && \ + TeamState.HasThreadState && ThreadStates[TId])) \ + return ThreadStates[TId]->ICVState.Member; \ + return TeamState.ICVState.Member; \ + } [[gnu::always_inline, gnu::flatten]] inline uint32_t & lookup32(ValueKind Kind, bool IsReadonly, IdentTy *Ident, bool ForceTeamState) { switch (Kind) { case state::VK_NThreads: if (IsReadonly) - return lookupImpl(&ICVStateTy::NThreadsVar, ForceTeamState); - return lookupForModify32Impl(&ICVStateTy::NThreadsVar, Ident, - ForceTeamState); + lookupImpl(NThreadsVar, ForceTeamState); + lookupForModify32Impl(NThreadsVar, Ident, ForceTeamState); case state::VK_Level: if (IsReadonly) - return lookupImpl(&ICVStateTy::LevelVar, ForceTeamState); - return lookupForModify32Impl(&ICVStateTy::LevelVar, Ident, ForceTeamState); + lookupImpl(LevelVar, ForceTeamState); + lookupForModify32Impl(LevelVar, Ident, ForceTeamState); case state::VK_ActiveLevel: if (IsReadonly) - return lookupImpl(&ICVStateTy::ActiveLevelVar, ForceTeamState); - return lookupForModify32Impl(&ICVStateTy::ActiveLevelVar, Ident, - ForceTeamState); + lookupImpl(ActiveLevelVar, ForceTeamState); + lookupForModify32Impl(ActiveLevelVar, Ident, ForceTeamState); case state::VK_MaxActiveLevels: if (IsReadonly) - return lookupImpl(&ICVStateTy::MaxActiveLevelsVar, ForceTeamState); - return lookupForModify32Impl(&ICVStateTy::MaxActiveLevelsVar, Ident, - ForceTeamState); + lookupImpl(MaxActiveLevelsVar, ForceTeamState); + lookupForModify32Impl(MaxActiveLevelsVar, Ident, ForceTeamState); case state::VK_RunSched: if (IsReadonly) - return lookupImpl(&ICVStateTy::RunSchedVar, ForceTeamState); - return lookupForModify32Impl(&ICVStateTy::RunSchedVar, Ident, - ForceTeamState); + lookupImpl(RunSchedVar, ForceTeamState); + lookupForModify32Impl(RunSchedVar, Ident, ForceTeamState); case state::VK_RunSchedChunk: if (IsReadonly) - return lookupImpl(&ICVStateTy::RunSchedChunkVar, ForceTeamState); - return lookupForModify32Impl(&ICVStateTy::RunSchedChunkVar, Ident, - ForceTeamState); + lookupImpl(RunSchedChunkVar, ForceTeamState); + lookupForModify32Impl(RunSchedChunkVar, Ident, ForceTeamState); case state::VK_ParallelTeamSize: return TeamState.ParallelTeamSize; case state::VK_HasThreadState: