+/** Removes conditional statements and loops where the condition can be
+determined as constant at compile time. */
+class ConstantConditionEliminator: private TraversingVisitor
+{
+private:
+ NodeList<Statement>::iterator insert_point;
+ std::set<Node *> nodes_to_remove;
+
+public:
+ void apply(Stage &);
+
+private:
+ virtual void visit(Block &);
+ virtual void visit(Conditional &);
+ virtual void visit(Iteration &);
+};
+
+/** Removes types which are not used anywhere. */
+class UnusedTypeRemover: private TraversingVisitor
+{
+private:
+ std::set<Node *> unused_nodes;
+
+public:
+ bool apply(Stage &);
+
+private:
+ virtual void visit(Literal &);
+ virtual void visit(UnaryExpression &);
+ virtual void visit(BinaryExpression &);
+ virtual void visit(FunctionCall &);
+ virtual void visit(BasicTypeDeclaration &);
+ virtual void visit(ImageTypeDeclaration &);
+ virtual void visit(StructDeclaration &);
+ virtual void visit(VariableDeclaration &);
+ virtual void visit(FunctionDeclaration &);
+};
+
+/** Removes variable declarations with no references to them. Assignment
+statements where the result is not used are also removed. */
+class UnusedVariableRemover: private TraversingVisitor