+ bool reachable;
+ std::set<Node *> unreachable_nodes;
+
+public:
+ UnreachableCodeRemover();
+
+ virtual bool apply(Stage &);
+
+private:
+ virtual void visit(Block &);
+ virtual void visit(FunctionDeclaration &);
+ virtual void visit(Conditional &);
+ virtual void visit(Iteration &);
+ virtual void visit(Return &) { reachable = false; }
+ virtual void visit(Jump &) { reachable = false; }
+};
+
+/** 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(RefPtr<Expression> &);
+ virtual void visit(BasicTypeDeclaration &);
+ virtual void visit(ImageTypeDeclaration &);
+ virtual void visit(StructDeclaration &);
+ virtual void visit(VariableDeclaration &);
+ virtual void visit(InterfaceBlock &);
+ 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
+{
+private:
+ struct AssignmentInfo
+ {
+ Node *node;
+ Assignment::Target target;
+ std::vector<Node *> used_by;
+
+ AssignmentInfo(): node(0) { }
+ };
+