X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Foptimize.cpp;h=bdaced5c46029299e531b8f3cdbd5055651bc539;hb=677744faccc5d3ac14fd468267f622ba6187dc74;hp=0f765c2a4aa6ce23edd99f2dd0fed35e4041bd3c;hpb=305b62cf4f7e2a4ca3cc56109003aed6bde61c25;p=libs%2Fgl.git diff --git a/source/glsl/optimize.cpp b/source/glsl/optimize.cpp index 0f765c2a..bdaced5c 100644 --- a/source/glsl/optimize.cpp +++ b/source/glsl/optimize.cpp @@ -138,7 +138,7 @@ string InlineContentInjector::apply(Stage &stage, FunctionDeclaration &target_fu staging_block.parent = &tgt_blk; staging_block.variables.clear(); - std::vector > params; + vector > params; params.reserve(source_func->parameters.size()); for(NodeArray::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::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); @@ -964,6 +1010,7 @@ UnusedVariableRemover::UnusedVariableRemover(): r_assignment(0), assignment_target(false), r_side_effects(false), + in_struct(false), composite_reference(false) { } @@ -1187,8 +1234,19 @@ void UnusedVariableRemover::visit(ExpressionStatement &expr) unused_nodes.insert(&expr); } +void UnusedVariableRemover::visit(StructDeclaration &strct) +{ + SetFlag set_struct(in_struct); + TraversingVisitor::visit(strct); +} + void UnusedVariableRemover::visit(VariableDeclaration &var) { + TraversingVisitor::visit(var); + + if(in_struct) + return; + VariableInfo &var_info = variables[&var]; var_info.interface_block = interface_block; @@ -1204,7 +1262,6 @@ void UnusedVariableRemover::visit(VariableDeclaration &var) var_info.initialized = true; record_assignment(&var, *var.init_expression); } - TraversingVisitor::visit(var); } void UnusedVariableRemover::visit(InterfaceBlock &iface)