From 2752b21b751058216287006ab6ca5466d916dcf5 Mon Sep 17 00:00:00 2001
From: Marcel Koch <marcel.koch@uni-muenster.de>
Date: Thu, 19 Apr 2018 11:28:29 +0200
Subject: [PATCH] rename some lhs temporarily

---
 .../perftool/blockstructured/vectorization.py | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/python/dune/perftool/blockstructured/vectorization.py b/python/dune/perftool/blockstructured/vectorization.py
index ee76a4b8..fa97aff4 100644
--- a/python/dune/perftool/blockstructured/vectorization.py
+++ b/python/dune/perftool/blockstructured/vectorization.py
@@ -227,9 +227,25 @@ def add_vcl_access(knl, iname_inner):
     vector_alias = [a for a in knl.arg_dict if a.endswith('alias')]
     dim = world_dimension()
     dim_names = ["x", "y", "z"] + [str(i) for i in range(4, dim + 1)]
+    # remove CInstructions since loopy extract expects to get only assignments
     knl_without_cinsn = knl.copy(instructions=[insn for insn in knl.instructions
                                                if not isinstance(insn, lp.CInstruction)])
     for alias in vector_alias:
+        # Rename lhs which would match the substitution rule since loopy doesn't want substitutions as lhs
+        new_insns = []
+        for insn in knl_without_cinsn.instructions:
+            if isinstance(insn, lp.Assignment) and isinstance(insn.assignee, prim.Subscript):
+                if insn.assignee.aggregate.name == alias:
+                    new_insns.append(insn.copy(assignee=prim.Subscript(prim.Variable('dummy_'+alias),
+                                                                       insn.assignee.index_tuple)))
+                    pass
+                else:
+                    new_insns.append(insn)
+            else:
+                new_insns.append(insn)
+        knl_without_cinsn = knl_without_cinsn.copy(instructions=new_insns)
+
+        # substitution rule for alias[ex_outer,ex_inner, ey, ix, iy] -> vec[ex_inner]
         parameters = 'ex_o,ex_i,' + ','.join(['e' + d for d in dim_names[1:dim]]) + \
                      ',ix,' + ','.join(['i' + d for d in dim_names[1:dim]])
         knl_without_cinsn = lp.extract_subst(knl_without_cinsn, alias + '_subst', '{}[{}]'.format(alias, parameters),
@@ -255,7 +271,8 @@ def add_vcl_access(knl, iname_inner):
                 try:
                     assignee_vec = next((expr for expr in insn.expression.children
                                          if isinstance(expr, prim.Subscript) and
-                                         expr.aggregate.name.replace('vec', 'alias') == assignee_alias.aggregate.name))
+                                         expr.aggregate.name.replace('vec', 'alias') ==
+                                         assignee_alias.aggregate.name.replace('dummy_', '')))
                 except StopIteration:
                     from dune.perftool.error import PerftoolVectorizationError
                     raise PerftoolVectorizationError
-- 
GitLab