From cac6ca98e4c6593b49f691cbdcb672ec0a2fde25 Mon Sep 17 00:00:00 2001
From: Andreas Kloeckner <inform@tiker.net>
Date: Fri, 17 Feb 2017 18:56:24 -0600
Subject: [PATCH] Discretization-scope CSEs: keep track of created vs
 copied-over

---
 grudge/symbolic/compiler.py | 33 ++++++++++++++++++++-------------
 1 file changed, 20 insertions(+), 13 deletions(-)

diff --git a/grudge/symbolic/compiler.py b/grudge/symbolic/compiler.py
index 72373625..47822baa 100644
--- a/grudge/symbolic/compiler.py
+++ b/grudge/symbolic/compiler.py
@@ -623,7 +623,8 @@ class OperatorCompiler(mappers.IdentityMapper):
         self.max_vectors_in_batch_expr = max_vectors_in_batch_expr
 
         self.discr_code = []
-        self.used_discr_scope_names = set()
+        self.discr_scope_names_created = set()
+        self.discr_scope_names_copied_to_eval = set()
 
         self.eval_code = []
         self.expr_to_var = {}
@@ -665,7 +666,8 @@ class OperatorCompiler(mappers.IdentityMapper):
         return (
                 Code(self.discr_code,
                     make_obj_array(
-                        [Variable(name) for name in self.used_discr_scope_names])),
+                        [Variable(name)
+                            for name in self.discr_scope_names_copied_to_eval])),
                 Code(self.eval_code, result))
 
     # }}}
@@ -713,26 +715,31 @@ class OperatorCompiler(mappers.IdentityMapper):
 
             assert expr_name.startswith("discr.")
 
-            if expr_name in self.used_discr_scope_names:
-                return var(expr_name)
-
             priority = getattr(expr, "priority", 0)
 
-            new_codegen_state = codegen_state.copy(generating_discr_code=True)
-            rec_child = get_rec_child(new_codegen_state)
+            if expr_name not in self.discr_scope_names_created:
+                new_codegen_state = codegen_state.copy(generating_discr_code=True)
+                rec_child = get_rec_child(new_codegen_state)
 
-            new_codegen_state.get_code_list(self).append(
-                    ToDiscretizationScopedAssign(
-                        (expr_name,), (rec_child,), priority=priority))
+                new_codegen_state.get_code_list(self).append(
+                        ToDiscretizationScopedAssign(
+                            (expr_name,), (rec_child,), priority=priority))
+
+                self.discr_scope_names_created.add(expr_name)
+
+            if codegen_state.generating_discr_code:
+                return var(expr_name)
+            else:
+                if expr_name in self.discr_scope_names_copied_to_eval:
+                    return var(expr_name)
 
-            if not codegen_state.generating_discr_code:
                 self.eval_code.append(
                         FromDiscretizationScopedAssign(
                             expr_name, priority=priority))
 
-            self.used_discr_scope_names.add(expr_name)
+                self.discr_scope_names_copied_to_eval.add(expr_name)
 
-            return Variable(expr_name)
+                return var(expr_name)
 
         else:
             try:
-- 
GitLab