From 3ad3ea961920b08ba3bc6f09cffb4d05f3659b94 Mon Sep 17 00:00:00 2001
From: Matt Wala <wala1@illinois.edu>
Date: Sun, 4 Dec 2016 15:38:00 -0600
Subject: [PATCH] Save and reload: Ignore temporaries with initializer.

---
 loopy/transform/save.py | 10 +++++++---
 test/test_loopy.py      | 25 +++++++++++++++++++++++++
 2 files changed, 32 insertions(+), 3 deletions(-)

diff --git a/loopy/transform/save.py b/loopy/transform/save.py
index 8706bc4da..65649a4cc 100644
--- a/loopy/transform/save.py
+++ b/loopy/transform/save.py
@@ -26,7 +26,7 @@ THE SOFTWARE.
 from loopy.diagnostic import LoopyError
 import loopy as lp
 
-from loopy.kernel.data import auto
+from loopy.kernel.data import auto, temp_var_scope
 from pytools import memoize_method, Record
 from loopy.schedule import (
             EnterLoop, LeaveLoop, RunInstruction,
@@ -217,7 +217,7 @@ class TemporarySaver(object):
         @memoize_method
         def as_variable(self):
             temporary = self.orig_temporary
-            from loopy.kernel.data import TemporaryVariable, temp_var_scope
+            from loopy.kernel.data import TemporaryVariable
             return TemporaryVariable(
                 name=self.name,
                 dtype=temporary.dtype,
@@ -245,11 +245,15 @@ class TemporarySaver(object):
     def auto_promote_temporary(self, temporary_name):
         temporary = self.kernel.temporary_variables[temporary_name]
 
-        from loopy.kernel.data import temp_var_scope
         if temporary.scope == temp_var_scope.GLOBAL:
             # Nothing to be done for global temporaries (I hope)
             return None
 
+        if temporary.initializer is not None:
+            # Temporaries with initializers do not need saving/reloading - the
+            # code generation takes care of emitting the initializers.
+            return None
+
         if temporary.base_storage is not None:
             raise ValueError(
                 "Cannot promote temporaries with base_storage to global")
diff --git a/test/test_loopy.py b/test/test_loopy.py
index d208793f5..79bf52237 100644
--- a/test/test_loopy.py
+++ b/test/test_loopy.py
@@ -1708,6 +1708,31 @@ def test_temp_initializer(ctx_factory, src_order, tmp_order):
     assert np.array_equal(a, a2)
 
 
+def test_const_temp_with_initializer_not_saved():
+    knl = lp.make_kernel(
+        "{[i]: 0<=i<10}",
+        """
+        ... gbarrier
+        out[i] = tmp[i]
+        """,
+        [
+            lp.TemporaryVariable("tmp",
+                initializer=np.arange(10),
+                shape=lp.auto,
+                scope=lp.temp_var_scope.PRIVATE,
+                read_only=True),
+            "..."
+            ],
+        seq_dependencies=True)
+
+    knl = lp.preprocess_kernel(knl)
+    knl = lp.get_one_scheduled_kernel(knl)
+    knl = lp.save_and_reload_temporaries(knl)
+
+    # This ensures no save slot was added.
+    assert len(knl.temporary_variables) == 1
+
+
 def test_header_extract():
     knl = lp.make_kernel('{[k]: 0<=k<n}}',
          """
-- 
GitLab