+ virtual void visit(Iteration &);
+};
+
+/** Removes conditional statements and loops where the condition can be
+determined as constant at compile time. */
+class ConstantConditionEliminator: private TraversingVisitor
+{
+private:
+ enum ConstantStatus
+ {
+ CONSTANT_FALSE,
+ CONSTANT_TRUE,
+ NOT_CONSTANT
+ };
+
+ NodeList<Statement>::iterator insert_point;
+ std::set<Node *> nodes_to_remove;
+ RefPtr<Expression> r_ternary_result;
+
+public:
+ void apply(Stage &);
+
+private:
+ ConstantStatus check_constant_condition(const Expression &);
+
+ virtual void visit(Block &);
+ virtual void visit(RefPtr<Expression> &);
+ virtual void visit(TernaryExpression &);
+ virtual void visit(Conditional &);
+ virtual void visit(Iteration &);
+};
+
+class UnreachableCodeRemover: private TraversingVisitor
+{
+private:
+ bool reachable;
+ std::set<Node *> unreachable_nodes;
+
+public:
+ UnreachableCodeRemover();
+
+ virtual bool apply(Stage &);
+
+private:
+ virtual void visit(Block &);
+ virtual void visit(FunctionDeclaration &);