[llvm] [OpenMP] Remove usage of pointer-to-member in lookup (PR #123671)
Joseph Huber via llvm-commits
llvm-commits at lists.llvm.org
Mon Jan 20 13:48:50 PST 2025
https://github.com/jhuber6 created https://github.com/llvm/llvm-project/pull/123671
Summary:
This is buggy and is currently being tracked in
https://github.com/llvm/llvm-project/issues/123241. For now, replace it
with a macro so that we can use address spaces directly.
>From 67f55d52a16f9acb06e2f758dc7719b3476cf4b2 Mon Sep 17 00:00:00 2001
From: Joseph Huber <huberjn at outlook.com>
Date: Mon, 20 Jan 2025 11:54:36 -0600
Subject: [PATCH] [OpenMP] Remove usage of pointer-to-member in lookup
Summary:
This is buggy and is currently being tracked in
https://github.com/llvm/llvm-project/issues/123241. For now, replace it
with a macro so that we can use address spaces directly.
---
offload/DeviceRTL/include/State.h | 76 +++++++++++++++----------------
1 file changed, 37 insertions(+), 39 deletions(-)
diff --git a/offload/DeviceRTL/include/State.h b/offload/DeviceRTL/include/State.h
index 565235cd48a913..c487ff29680faa 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<ThreadStateTy *>(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<ThreadStateTy *>( \
+ 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:
More information about the llvm-commits
mailing list