]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/optimize.cpp
Remove unreachable code after a jump statement
[libs/gl.git] / source / glsl / optimize.cpp
index 0f765c2a4aa6ce23edd99f2dd0fed35e4041bd3c..f333ef44b0cfe5ef1a88b26a17203faf1b09ac82 100644 (file)
@@ -907,6 +907,52 @@ void ConstantConditionEliminator::visit(Iteration &iter)
 }
 
 
+UnreachableCodeRemover::UnreachableCodeRemover():
+       reachable(true)
+{ }
+
+bool UnreachableCodeRemover::apply(Stage &stage)
+{
+       stage.content.visit(*this);
+       NodeRemover().apply(stage, unreachable_nodes);
+       return !unreachable_nodes.empty();
+}
+
+void UnreachableCodeRemover::visit(Block &block)
+{
+       NodeList<Statement>::iterator i = block.body.begin();
+       for(; (reachable && i!=block.body.end()); ++i)
+               (*i)->visit(*this);
+       for(; i!=block.body.end(); ++i)
+               unreachable_nodes.insert(i->get());
+}
+
+void UnreachableCodeRemover::visit(FunctionDeclaration &func)
+{
+       TraversingVisitor::visit(func);
+       reachable = true;
+}
+
+void UnreachableCodeRemover::visit(Conditional &cond)
+{
+       cond.body.visit(*this);
+       bool reachable_if_true = reachable;
+       reachable = true;
+       cond.else_body.visit(*this);
+
+       reachable |= reachable_if_true;
+}
+
+void UnreachableCodeRemover::visit(Iteration &iter)
+{
+       TraversingVisitor::visit(iter);
+
+       /* Always consider code after a loop reachable, since there's no checking
+       for whether the loop executes. */
+       reachable = true;
+}
+
+
 bool UnusedTypeRemover::apply(Stage &stage)
 {
        stage.content.visit(*this);