[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:
Johannes Doerfert 2022-07-13 11:01:54 -05:00
parent a42361dc1c
commit 7472b42b78
2 changed files with 9 additions and 1 deletions

View File

@ -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;

View File

@ -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