aboutsummaryrefslogtreecommitdiff
path: root/openmp
diff options
context:
space:
mode:
authorJohannes Doerfert <johannes@jdoerfert.de>2022-07-13 11:01:54 -0500
committerJohannes Doerfert <johannes@jdoerfert.de>2022-07-21 12:28:45 -0500
commit7472b42b788e57b7b1ea255aa8670c96cc0aacd8 (patch)
treeae3d7e9ad9da86ad181d42d0c4a396f4ec7081b6 /openmp
parenta42361dc1c26acae656243232e81a236ba333a8c (diff)
downloadllvm-7472b42b788e57b7b1ea255aa8670c96cc0aacd8.zip
llvm-7472b42b788e57b7b1ea255aa8670c96cc0aacd8.tar.gz
llvm-7472b42b788e57b7b1ea255aa8670c96cc0aacd8.tar.bz2
[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
Diffstat (limited to 'openmp')
-rw-r--r--openmp/libomptarget/DeviceRTL/include/State.h3
-rw-r--r--openmp/libomptarget/DeviceRTL/include/Utils.h7
2 files changed, 9 insertions, 1 deletions
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 <typename VTy, typename Ty> 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 <typename Ty1, typename Ty2> 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