diff --git a/ir/bin_op.py b/ir/bin_op.py index 809510cd8c244b493668aa38fd512ecd64b4be8d..46c3e4deb8caf619236447a5b798ecc755f6839d 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 8232700153c848975c7cb62d315a9b7493e7fb2c..9bf20a5d28ac07f1277a533e6f55f3395fdc7276 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 4a655b79689f961653b3aed348b6513adda5637a..0ac4d37d15d1018d115c1f17a5edd26d37fb258b 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