diff --git a/code_gen/cgen.py b/code_gen/cgen.py index 623572382e21d41760e8ce7d763d29f08c295918..b39bc2f1548a87744b6bd605edec3a109f44043e 100644 --- a/code_gen/cgen.py +++ b/code_gen/cgen.py @@ -68,7 +68,7 @@ class CGen: if isinstance(ast_node, BinOpDef): bin_op = ast_node.bin_op - if not isinstance(bin_op, BinOp): + if not isinstance(bin_op, BinOp) or not ast_node.used: return None if bin_op.inlined is False and bin_op.operator() != '[]' and bin_op.generated is False: diff --git a/ir/arrays.py b/ir/arrays.py index 27ffac1b21d6cf6db672b02dfa42f7896dde25d7..a49e39a952247f6adefac8530a79eaf21dbd3faf 100644 --- a/ir/arrays.py +++ b/ir/arrays.py @@ -173,6 +173,9 @@ class ArrayAccess(ASTTerm): return self.index.scope() def children(self): + if self.index is not None: + return [self.array, self.index] + return [self.array] + self.indexes diff --git a/ir/bin_op.py b/ir/bin_op.py index 38e2d85421d923d12c2d24d07ea78abf11dd9324..34081bb35293f95282b91a10c5287790e4fbb59f 100644 --- a/ir/bin_op.py +++ b/ir/bin_op.py @@ -10,7 +10,7 @@ class BinOpDef(ASTNode): super().__init__(bin_op.sim) self.bin_op = bin_op self.bin_op.sim.add_statement(self) - self.used = False + self.used = not bin_op.sim.check_bin_ops_usage def __str__(self): return f"BinOpDef<bin_op: self.bin_op>" @@ -85,6 +85,9 @@ class BinOp(ASTNode): mapping = self.vector_index_mapping return mapping[index] if index in mapping else as_lit_ast(self.sim, index) + def mapped_expressions(self): + return self.vector_index_mapping.values() + @property def vector_indexes(self): return self._vector_indexes diff --git a/ir/loops.py b/ir/loops.py index a1af262abc420a3a73a0ffb92da7705ce2c93acf..b4ce423642cd10d723206e1d87e1432696514727 100644 --- a/ir/loops.py +++ b/ir/loops.py @@ -67,7 +67,7 @@ class For(ASTNode): self.block.add_statement(stmt) def children(self): - return [self.iterator, self.block] + return [self.iterator, self.block, self.min, self.max] class ParticleFor(For): diff --git a/sim/particle_simulation.py b/sim/particle_simulation.py index a641fddb2950db246e2da0549509d06e6f423bc3..20efef8e05042642b711c72d182e43b373b573c4 100644 --- a/sim/particle_simulation.py +++ b/sim/particle_simulation.py @@ -42,6 +42,7 @@ class ParticleSimulation: self.scope = [] self.nested_count = 0 self.nest = False + self.check_bin_ops_usage = True self.block = Block(self, []) self.setups = SetupWrapper() self.kernels = KernelWrapper() @@ -199,11 +200,14 @@ class ParticleSimulation: self.global_scope = program # Transformations - #prioritaze_scalar_ops(program) + prioritaze_scalar_ops(program) flatten_property_accesses(program) simplify_expressions(program) move_loop_invariant_code(program) - #set_used_bin_ops(program) + set_used_bin_ops(program) + + # For this part on, all bin ops are generated without usage verification + self.check_bin_ops_usage = False ASTGraph(self.kernels.lower(), "kernels").render() self.code_gen.generate_program(program) diff --git a/sim/vtk.py b/sim/vtk.py index c6125c45d8a9573e817e639464a2c212b7069396..6a35b6a19caa1b61dd723b7b34e1052f0449dc13 100644 --- a/sim/vtk.py +++ b/sim/vtk.py @@ -11,3 +11,6 @@ class VTKWrite(ASTNode): self.filename = filename self.timestep = as_lit_ast(sim, timestep) VTKWrite.vtk_id += 1 + + def children(self): + return [self.timestep] diff --git a/transformations/set_used_bin_ops.py b/transformations/set_used_bin_ops.py index 64f3d0479199414452a4bcdaf3160706c6ac09d8..d26d1bc7a11633e876238fd48e1cb69ca2c56502 100644 --- a/transformations/set_used_bin_ops.py +++ b/transformations/set_used_bin_ops.py @@ -7,8 +7,15 @@ class SetUsedBinOps(Visitor): super().__init__(ast) self.bin_ops = [] + def visit_BinOpDef(self, ast_node): + pass + def visit_BinOp(self, ast_node): ast_node.bin_op_def.used = True + self.visit_children(ast_node) + # TODO: These expressions could be automatically included in visitor traversal + for vidxs in ast_node.mapped_expressions(): + self.visit(vidxs) def set_used_bin_ops(ast):