void FunctionInliner::visit(Iteration &iter)
{
- SetForScope<Block *> set_block(current_block, &iter.body);
+ /* Visit the initialization statement before entering the loop body so the
+ inlined statements get inserted outside. */
if(iter.init_statement)
iter.init_statement->visit(*this);
- /* Skip the condition and loop expression parts because they're executed on
- every iteration of the loop */
+
+ SetForScope<Block *> set_block(current_block, &iter.body);
+ /* Skip the condition and loop expression parts because they're not properly
+ inside the body block. Inlining anything into them will require a more
+ comprehensive transformation. */
iter.body.visit(*this);
}
{ }
+bool UnusedTypeRemover::apply(Stage &stage)
+{
+ stage.content.visit(*this);
+ NodeRemover().apply(stage, unused_nodes);
+ return !unused_nodes.empty();
+}
+
+void UnusedTypeRemover::visit(Literal &literal)
+{
+ unused_nodes.erase(literal.type);
+}
+
+void UnusedTypeRemover::visit(UnaryExpression &unary)
+{
+ unused_nodes.erase(unary.type);
+ TraversingVisitor::visit(unary);
+}
+
+void UnusedTypeRemover::visit(BinaryExpression &binary)
+{
+ unused_nodes.erase(binary.type);
+ TraversingVisitor::visit(binary);
+}
+
+void UnusedTypeRemover::visit(FunctionCall &call)
+{
+ unused_nodes.erase(call.type);
+ TraversingVisitor::visit(call);
+}
+
+void UnusedTypeRemover::visit(BasicTypeDeclaration &type)
+{
+ if(type.base_type)
+ unused_nodes.erase(type.base_type);
+ unused_nodes.insert(&type);
+}
+
+void UnusedTypeRemover::visit(ImageTypeDeclaration &type)
+{
+ if(type.base_type)
+ unused_nodes.erase(type.base_type);
+ unused_nodes.insert(&type);
+}
+
+void UnusedTypeRemover::visit(StructDeclaration &strct)
+{
+ unused_nodes.insert(&strct);
+ TraversingVisitor::visit(strct);
+}
+
+void UnusedTypeRemover::visit(VariableDeclaration &var)
+{
+ unused_nodes.erase(var.type_declaration);
+}
+
+void UnusedTypeRemover::visit(FunctionDeclaration &func)
+{
+ unused_nodes.erase(func.return_type_declaration);
+ TraversingVisitor::visit(func);
+}
+
+
UnusedVariableRemover::UnusedVariableRemover():
aggregate(0),
r_assignment(0),
void UnusedVariableRemover::visit(MemberAccess &memacc)
{
- r_assign_to_subfield = true;
+ if(assignment_target)
+ r_assign_to_subfield = true;
TraversingVisitor::visit(memacc);
unused_nodes.erase(memacc.declaration);
}
void UnusedVariableRemover::visit(StructDeclaration &strct)
{
SetForScope<Node *> set(aggregate, &strct);
- unused_nodes.insert(&strct);
TraversingVisitor::visit(strct);
}
if(var.init_expression)
record_assignment(var, *var.init_expression, false);
}
- unused_nodes.erase(var.type_declaration);
TraversingVisitor::visit(var);
}