Skip to content

Commit f233a54

Browse files
authored
[OpenMP] Remove usage of pointer-to-member in lookup (#123671)
Summary: This is buggy and is currently being tracked in #123241. For now, replace it with a macro so that we can use address spaces directly.
1 parent ec6c344 commit f233a54

File tree

1 file changed

+37
-39
lines changed

1 file changed

+37
-39
lines changed

offload/DeviceRTL/include/State.h

Lines changed: 37 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -158,63 +158,61 @@ struct DateEnvironmentRAII {
158158
/// TODO
159159
void resetStateForThread(uint32_t TId);
160160

161-
inline uint32_t &lookupForModify32Impl(uint32_t state::ICVStateTy::*Var,
162-
IdentTy *Ident, bool ForceTeamState) {
163-
if (OMP_LIKELY(ForceTeamState || !config::mayUseThreadStates() ||
164-
!TeamState.HasThreadState))
165-
return TeamState.ICVState.*Var;
166-
uint32_t TId = mapping::getThreadIdInBlock();
167-
if (OMP_UNLIKELY(!ThreadStates[TId])) {
168-
ThreadStates[TId] = reinterpret_cast<ThreadStateTy *>(memory::allocGlobal(
169-
sizeof(ThreadStateTy), "ICV modification outside data environment"));
170-
ASSERT(ThreadStates[TId] != nullptr, "Nullptr returned by malloc!");
171-
TeamState.HasThreadState = true;
172-
ThreadStates[TId]->init();
161+
// FIXME: https://github.com/llvm/llvm-project/issues/123241.
162+
#define lookupForModify32Impl(Member, Ident, ForceTeamState) \
163+
{ \
164+
if (OMP_LIKELY(ForceTeamState || !config::mayUseThreadStates() || \
165+
!TeamState.HasThreadState)) \
166+
return TeamState.ICVState.Member; \
167+
uint32_t TId = mapping::getThreadIdInBlock(); \
168+
if (OMP_UNLIKELY(!ThreadStates[TId])) { \
169+
ThreadStates[TId] = reinterpret_cast<ThreadStateTy *>( \
170+
memory::allocGlobal(sizeof(ThreadStateTy), \
171+
"ICV modification outside data environment")); \
172+
ASSERT(ThreadStates[TId] != nullptr, "Nullptr returned by malloc!"); \
173+
TeamState.HasThreadState = true; \
174+
ThreadStates[TId]->init(); \
175+
} \
176+
return ThreadStates[TId]->ICVState.Member; \
173177
}
174-
return ThreadStates[TId]->ICVState.*Var;
175-
}
176178

177-
inline uint32_t &lookupImpl(uint32_t state::ICVStateTy::*Var,
178-
bool ForceTeamState) {
179-
auto TId = mapping::getThreadIdInBlock();
180-
if (OMP_UNLIKELY(!ForceTeamState && config::mayUseThreadStates() &&
181-
TeamState.HasThreadState && ThreadStates[TId]))
182-
return ThreadStates[TId]->ICVState.*Var;
183-
return TeamState.ICVState.*Var;
184-
}
179+
// FIXME: https://github.com/llvm/llvm-project/issues/123241.
180+
#define lookupImpl(Member, ForceTeamState) \
181+
{ \
182+
auto TId = mapping::getThreadIdInBlock(); \
183+
if (OMP_UNLIKELY(!ForceTeamState && config::mayUseThreadStates() && \
184+
TeamState.HasThreadState && ThreadStates[TId])) \
185+
return ThreadStates[TId]->ICVState.Member; \
186+
return TeamState.ICVState.Member; \
187+
}
185188

186189
[[gnu::always_inline, gnu::flatten]] inline uint32_t &
187190
lookup32(ValueKind Kind, bool IsReadonly, IdentTy *Ident, bool ForceTeamState) {
188191
switch (Kind) {
189192
case state::VK_NThreads:
190193
if (IsReadonly)
191-
return lookupImpl(&ICVStateTy::NThreadsVar, ForceTeamState);
192-
return lookupForModify32Impl(&ICVStateTy::NThreadsVar, Ident,
193-
ForceTeamState);
194+
lookupImpl(NThreadsVar, ForceTeamState);
195+
lookupForModify32Impl(NThreadsVar, Ident, ForceTeamState);
194196
case state::VK_Level:
195197
if (IsReadonly)
196-
return lookupImpl(&ICVStateTy::LevelVar, ForceTeamState);
197-
return lookupForModify32Impl(&ICVStateTy::LevelVar, Ident, ForceTeamState);
198+
lookupImpl(LevelVar, ForceTeamState);
199+
lookupForModify32Impl(LevelVar, Ident, ForceTeamState);
198200
case state::VK_ActiveLevel:
199201
if (IsReadonly)
200-
return lookupImpl(&ICVStateTy::ActiveLevelVar, ForceTeamState);
201-
return lookupForModify32Impl(&ICVStateTy::ActiveLevelVar, Ident,
202-
ForceTeamState);
202+
lookupImpl(ActiveLevelVar, ForceTeamState);
203+
lookupForModify32Impl(ActiveLevelVar, Ident, ForceTeamState);
203204
case state::VK_MaxActiveLevels:
204205
if (IsReadonly)
205-
return lookupImpl(&ICVStateTy::MaxActiveLevelsVar, ForceTeamState);
206-
return lookupForModify32Impl(&ICVStateTy::MaxActiveLevelsVar, Ident,
207-
ForceTeamState);
206+
lookupImpl(MaxActiveLevelsVar, ForceTeamState);
207+
lookupForModify32Impl(MaxActiveLevelsVar, Ident, ForceTeamState);
208208
case state::VK_RunSched:
209209
if (IsReadonly)
210-
return lookupImpl(&ICVStateTy::RunSchedVar, ForceTeamState);
211-
return lookupForModify32Impl(&ICVStateTy::RunSchedVar, Ident,
212-
ForceTeamState);
210+
lookupImpl(RunSchedVar, ForceTeamState);
211+
lookupForModify32Impl(RunSchedVar, Ident, ForceTeamState);
213212
case state::VK_RunSchedChunk:
214213
if (IsReadonly)
215-
return lookupImpl(&ICVStateTy::RunSchedChunkVar, ForceTeamState);
216-
return lookupForModify32Impl(&ICVStateTy::RunSchedChunkVar, Ident,
217-
ForceTeamState);
214+
lookupImpl(RunSchedChunkVar, ForceTeamState);
215+
lookupForModify32Impl(RunSchedChunkVar, Ident, ForceTeamState);
218216
case state::VK_ParallelTeamSize:
219217
return TeamState.ParallelTeamSize;
220218
case state::VK_HasThreadState:

0 commit comments

Comments
 (0)