From 3fa054681bf5606281561b681a4db93276243aa0 Mon Sep 17 00:00:00 2001
From: Rafael Ravedutti <rafaelravedutti@gmail.com>
Date: Thu, 19 Aug 2021 01:51:10 +0200
Subject: [PATCH] Fix LICM transformation with new changes

Signed-off-by: Rafael Ravedutti <rafaelravedutti@gmail.com>
---
 ir/bin_op.py               | 2 ++
 sim/particle_simulation.py | 2 +-
 transformations/LICM.py    | 9 ++++-----
 3 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/ir/bin_op.py b/ir/bin_op.py
index 809510c..46c3e4d 100644
--- a/ir/bin_op.py
+++ b/ir/bin_op.py
@@ -267,3 +267,5 @@ class VectorAccess(ASTTerm):
     def sub(self, other):
         return self.sim.add_statement(Assign(self.sim, self, self - other))
 
+    def children(self):
+        return [self.expr]
diff --git a/sim/particle_simulation.py b/sim/particle_simulation.py
index 8232700..9bf20a5 100644
--- a/sim/particle_simulation.py
+++ b/sim/particle_simulation.py
@@ -212,7 +212,7 @@ class ParticleSimulation:
         # Transformations
         prioritaze_scalar_ops(program)
         simplify_expressions(program)
-        #move_loop_invariant_code(program)
+        move_loop_invariant_code(program)
         set_used_bin_ops(program)
 
         # For this part on, all bin ops are generated without usage verification
diff --git a/transformations/LICM.py b/transformations/LICM.py
index 4a655b7..0ac4d37 100644
--- a/transformations/LICM.py
+++ b/transformations/LICM.py
@@ -155,7 +155,6 @@ class SetBinOpTerminals(Visitor):
     def visit_Property(self, ast_node):
         self.push_terminal(ast_node)
 
-
     def visit_Var(self, ast_node):
         self.push_terminal(ast_node)
 
@@ -183,11 +182,11 @@ class LICM(Mutator):
         return ast_node
 
     def mutate_Decl(self, ast_node):
-        if self.loops:
+        if self.loops and isinstance(ast_node.elem, (BinOp, PropertyAccess)):
             last_loop = self.loops[-1]
-            #print(f"variants = {last_loop.block.variants}, terminals = {ast_node.bin_op.terminals}")
-            if isinstance(ast_node.elem, (BinOp, PropertyAccess)) and not last_loop.block.variants.intersection(ast_node.elem.terminals):
-                #print(f'lifting {ast_node.bin_op.id()}')
+            #print(f"variants = {last_loop.block.variants}, terminals = {ast_node.elem.terminals}")
+            if not last_loop.block.variants.intersection(ast_node.elem.terminals):
+                #print(f'lifting {ast_node.elem.id()}')
                 self.lifts[id(last_loop)].append(ast_node)
                 return None
 
-- 
GitLab