From 7472b42b788e57b7b1ea255aa8670c96cc0aacd8 Mon Sep 17 00:00:00 2001 From: Johannes Doerfert Date: Wed, 13 Jul 2022 11:01:54 -0500 Subject: [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 --- openmp/libomptarget/DeviceRTL/include/State.h | 3 ++- openmp/libomptarget/DeviceRTL/include/Utils.h | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) (limited to 'openmp') diff --git a/openmp/libomptarget/DeviceRTL/include/State.h b/openmp/libomptarget/DeviceRTL/include/State.h index 08f08bd..65d5b6d 100644 --- a/openmp/libomptarget/DeviceRTL/include/State.h +++ b/openmp/libomptarget/DeviceRTL/include/State.h @@ -277,7 +277,8 @@ private: template struct ValueRAII { 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) { if (!Active) return; diff --git a/openmp/libomptarget/DeviceRTL/include/Utils.h b/openmp/libomptarget/DeviceRTL/include/Utils.h index dc4b1cd..9e71b51 100644 --- a/openmp/libomptarget/DeviceRTL/include/Utils.h +++ b/openmp/libomptarget/DeviceRTL/include/Utils.h @@ -14,6 +14,8 @@ #include "Types.h" +#pragma omp begin declare target device_type(nohost) + namespace _OMP { namespace utils { @@ -72,10 +74,15 @@ template inline Ty1 align_down(Ty1 V, Ty2 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_UNLIKELY(EXPR) __builtin_expect((bool)(EXPR), false) } // namespace utils } // namespace _OMP +#pragma omp end declare target + #endif -- cgit v1.1