]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/optimize.cpp
Remove unnecessary std:: qualifiers from .cpp files
[libs/gl.git] / source / glsl / optimize.cpp
index 927047cc7c1e387890bf4a3d1a4a784e2039c7ac..68d3f1d77a9b1233701629b2f27b319bfec43e3d 100644 (file)
@@ -75,7 +75,7 @@ void InlineableFunctionLocator::visit(FunctionCall &call)
                ++count;
                /* Don't inline functions which are called more than once or are called
                recursively. */
-               if(count>1 || def==current_function)
+               if((count>1 && def->source!=BUILTIN_SOURCE) || def==current_function)
                        inlineable.erase(def);
        }
 
@@ -89,7 +89,7 @@ void InlineableFunctionLocator::visit(FunctionDeclaration &func)
                has_out_params = ((*i)->interface=="out");
 
        unsigned &count = refcounts[func.definition];
-       if(count<=1 && !has_out_params)
+       if((count<=1 || func.source==BUILTIN_SOURCE) && !has_out_params)
                inlineable.insert(func.definition);
 
        SetForScope<FunctionDeclaration *> set(current_function, &func);
@@ -138,7 +138,7 @@ string InlineContentInjector::apply(Stage &stage, FunctionDeclaration &target_fu
        staging_block.parent = &tgt_blk;
        staging_block.variables.clear();
 
-       std::vector<RefPtr<VariableDeclaration> > params;
+       vector<RefPtr<VariableDeclaration> > params;
        params.reserve(source_func->parameters.size());
        for(NodeArray<VariableDeclaration>::iterator i=source_func->parameters.begin(); i!=source_func->parameters.end(); ++i)
        {
@@ -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);