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