[Openmp-commits] [clang] [openmp] [OFFLOAD] Build DeviceRTL with SPIRV backend (PR #174675)

Joseph Huber via Openmp-commits openmp-commits at lists.llvm.org
Fri Jan 9 12:20:58 PST 2026


================
@@ -258,6 +258,80 @@ void setCriticalLock(omp_lock_t *Lock) { setLock(Lock); }
 #endif
 ///}
 
+#if defined(__SPIRV__)
+
+MemorySemantics_t convertOrderingType(atomic::OrderingTy Ordering) {
+  switch (Ordering) {
+  default:
+    __builtin_unreachable();
+  case atomic::relaxed:
+    return MemorySemantics_t::Relaxed;
+  case atomic::acquire:
+    return MemorySemantics_t::Acquire;
+  case atomic::release:
+    return MemorySemantics_t::Release;
+  case atomic::acq_rel:
+    return MemorySemantics_t::AcquireRelease;
+  case atomic::seq_cst:
+    return MemorySemantics_t::SequentiallyConsistent;
+  }
+}
+uint32_t atomicInc(uint32_t *Address, uint32_t Val, atomic::OrderingTy Ordering,
+                   atomic::MemScopeTy MemScope) {
+  return __spirv_AtomicIAdd(Address, (int)MemScope,
+                            convertOrderingType(Ordering), Val);
+}
+
+void namedBarrierInit() {} // TODO
+void namedBarrier() {}     // TODO
+void fenceTeam(atomic::OrderingTy Ordering) {
+  return __spirv_MemoryBarrier(Scope_t::Workgroup,
+                               0x100 | convertOrderingType(Ordering));
+}
+void fenceKernel(atomic::OrderingTy Ordering) {
+  return __spirv_MemoryBarrier(Scope_t::Device,
+                               0x200 | convertOrderingType(Ordering));
+}
+void fenceSystem(atomic::OrderingTy Ordering) {
+  return __spirv_MemoryBarrier(Scope_t::CrossDevice,
+                               0x200 | convertOrderingType(Ordering));
+}
+
+void syncWarp(__kmpc_impl_lanemask_t) {
+  __spirv_ControlBarrier(Scope_t::Subgroup, Scope_t::Subgroup,
+                         0x80 | MemorySemantics_t::SequentiallyConsistent);
+}
+void syncThreads(atomic::OrderingTy Ordering) {
+  __spirv_ControlBarrier(Scope_t::Workgroup, Scope_t::Workgroup,
+                         0x100 | convertOrderingType(Ordering));
+}
+void unsetLock(omp_lock_t *Lock) {
+  __spirv_AtomicStore((int32_t *)Lock, Scope_t::CrossDevice,
----------------
jhuber6 wrote:

Why do we need SPIRV handling for this? Does the backend not handle the atomics?

https://github.com/llvm/llvm-project/pull/174675


More information about the Openmp-commits mailing list