From 635546acb95b3be40b82217396f74db97048948d Mon Sep 17 00:00:00 2001
From: Andreas Kloeckner <inform@tiker.net>
Date: Wed, 1 May 2024 10:36:48 -0500
Subject: [PATCH] Avoid de/allocations for zero-sized temporaries

---
 loopy/target/pyopencl.py | 14 ++++++++++----
 1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/loopy/target/pyopencl.py b/loopy/target/pyopencl.py
index 2742e472..d4a8944f 100644
--- a/loopy/target/pyopencl.py
+++ b/loopy/target/pyopencl.py
@@ -817,10 +817,16 @@ class PyOpenCLPythonASTBuilder(PythonASTBuilderBase):
 
         for tv in global_temporaries:
             if not tv.base_storage:
-                nbytes_str = ecm(tv.nbytes, PREC_NONE, "i")
-                allocated_var_names.append(tv.name)
-                code_lines.append(Assign(tv.name,
-                                         f"allocator({nbytes_str})"))
+                if tv.nbytes:
+                    # NB: This does not prevent all zero-size allocations,
+                    # as sizes are parametric, and allocation size
+                    # could turn out to be zero at runtime.
+                    nbytes_str = ecm(tv.nbytes, PREC_NONE, "i")
+                    allocated_var_names.append(tv.name)
+                    code_lines.append(Assign(tv.name,
+                                             f"allocator({nbytes_str})"))
+                else:
+                    code_lines.append(Assign(tv.name, "None"))
 
         code_lines.append(Assign("_global_temporaries", "[{tvs}]".format(
             tvs=", ".join(tv for tv in allocated_var_names))))
-- 
GitLab