forked from OSchip/llvm-project
[OpenMP] Use Undef instead of null as pointer for inactive lanes
Our conditional writes in the runtime look like this: ``` if (active) *ptr = value; ``` In the RAII we need to assign `ptr` which comes from a lookup call. If a thread that is not the main thread calls lookup with the intention to write the pointer, we'll create a new thread state. As such, we need to avoid calling lookup for inactive threads. We used to use `nullptr` as their `ptr` value but that can cause pessimistic reasoning. We now use `undef` instead. Differential Revision: https://reviews.llvm.org/D130114
This commit is contained in:
parent
a42361dc1c
commit
7472b42b78
|
@ -277,7 +277,8 @@ private:
|
||||||
|
|
||||||
template <typename VTy, typename Ty> struct ValueRAII {
|
template <typename VTy, typename Ty> struct ValueRAII {
|
||||||
ValueRAII(VTy &V, Ty NewValue, Ty OldValue, bool Active, IdentTy *Ident)
|
ValueRAII(VTy &V, Ty NewValue, Ty OldValue, bool Active, IdentTy *Ident)
|
||||||
: Ptr(Active ? &V.lookup(/* IsReadonly */ false, Ident) : nullptr),
|
: Ptr(Active ? &V.lookup(/* IsReadonly */ false, Ident)
|
||||||
|
: (Ty *)utils::UndefPtr),
|
||||||
Val(OldValue), Active(Active) {
|
Val(OldValue), Active(Active) {
|
||||||
if (!Active)
|
if (!Active)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
|
|
||||||
#include "Types.h"
|
#include "Types.h"
|
||||||
|
|
||||||
|
#pragma omp begin declare target device_type(nohost)
|
||||||
|
|
||||||
namespace _OMP {
|
namespace _OMP {
|
||||||
namespace utils {
|
namespace utils {
|
||||||
|
|
||||||
|
@ -72,10 +74,15 @@ template <typename Ty1, typename Ty2> inline Ty1 align_down(Ty1 V, Ty2 Align) {
|
||||||
return V - V % Align;
|
return V - V % Align;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A pointer variable that has by design an `undef` value. Use with care.
|
||||||
|
__attribute__((loader_uninitialized)) static void *const UndefPtr;
|
||||||
|
|
||||||
#define OMP_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
|
#define OMP_LIKELY(EXPR) __builtin_expect((bool)(EXPR), true)
|
||||||
#define OMP_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
|
#define OMP_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false)
|
||||||
|
|
||||||
} // namespace utils
|
} // namespace utils
|
||||||
} // namespace _OMP
|
} // namespace _OMP
|
||||||
|
|
||||||
|
#pragma omp end declare target
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue