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):