[llvm] [Offload] Make AMDGPU plugin handle empty allocation properly (PR #142383)

Joseph Huber via llvm-commits llvm-commits at lists.llvm.org
Mon Jun 2 06:10:50 PDT 2025


https://github.com/jhuber6 updated https://github.com/llvm/llvm-project/pull/142383

>From ce80b340ce27bfb797c85a996682de10f9be3e0a Mon Sep 17 00:00:00 2001
From: Joseph Huber <huberjn at outlook.com>
Date: Mon, 2 Jun 2025 08:00:40 -0500
Subject: [PATCH] [Offload] Make AMDGPU plugin handle empty allocation properly

Summary:
`malloc(0)` and `free(nullptr)` are both defined by the standard but we
current trigger erros and assertions on them. Fix that so this works
with empty arguments.
---
 offload/plugins-nextgen/amdgpu/src/rtl.cpp | 5 +----
 offload/test/api/omp_device_memory.c       | 6 ++++++
 2 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/offload/plugins-nextgen/amdgpu/src/rtl.cpp b/offload/plugins-nextgen/amdgpu/src/rtl.cpp
index 2733796611d9b..abb83686151a2 100644
--- a/offload/plugins-nextgen/amdgpu/src/rtl.cpp
+++ b/offload/plugins-nextgen/amdgpu/src/rtl.cpp
@@ -420,7 +420,7 @@ struct AMDGPUMemoryManagerTy : public DeviceAllocatorTy {
     assert(PtrStorage && "Invalid pointer storage");
 
     *PtrStorage = MemoryManager->allocate(Size, nullptr);
-    if (*PtrStorage == nullptr)
+    if (Size && *PtrStorage == nullptr)
       return Plugin::error(ErrorCode::OUT_OF_RESOURCES,
                            "failure to allocate from AMDGPU memory manager");
 
@@ -429,8 +429,6 @@ struct AMDGPUMemoryManagerTy : public DeviceAllocatorTy {
 
   /// Release an allocation to be reused.
   Error deallocate(void *Ptr) {
-    assert(Ptr && "Invalid pointer");
-
     if (MemoryManager->free(Ptr))
       return Plugin::error(ErrorCode::UNKNOWN,
                            "failure to deallocate from AMDGPU memory manager");
@@ -1204,7 +1202,6 @@ struct AMDGPUStreamTy {
     ReleaseBufferArgsTy *Args = reinterpret_cast<ReleaseBufferArgsTy *>(Data);
     assert(Args && "Invalid arguments");
     assert(Args->MemoryManager && "Invalid memory manager");
-    assert(Args->Buffer && "Invalid buffer");
 
     // Release the allocation to the memory manager.
     return Args->MemoryManager->deallocate(Args->Buffer);
diff --git a/offload/test/api/omp_device_memory.c b/offload/test/api/omp_device_memory.c
index 60f47e94f90db..8876fc91ba403 100644
--- a/offload/test/api/omp_device_memory.c
+++ b/offload/test/api/omp_device_memory.c
@@ -2,6 +2,7 @@
 
 #include <omp.h>
 #include <stdio.h>
+#include <assert.h>
 
 int main() {
   const int N = 64;
@@ -24,4 +25,9 @@ int main() {
     printf("PASS\n");
 
   omp_free(device_ptr, llvm_omp_target_device_mem_alloc);
+
+  // Make sure this interface works.
+  void *ptr = omp_alloc(0, llvm_omp_target_device_mem_alloc);
+  assert(!ptr && "Ptr not (nullptr)");
+  omp_free(ptr, llvm_omp_target_device_mem_alloc);
 }



More information about the llvm-commits mailing list