X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fglsl%2Foptimize.cpp;h=8c586e7ad886cf433c4c5cadf6315783980804a6;hb=38712d8ecc57d043a2419ffbaeeb57f7a6586f14;hp=9388c04129cfc1b03020ef0f00da650bf2b46f1a;hpb=e9a898f315b5d1396f196d785913a283c30940f2;p=libs%2Fgl.git diff --git a/source/glsl/optimize.cpp b/source/glsl/optimize.cpp index 9388c041..8c586e7a 100644 --- a/source/glsl/optimize.cpp +++ b/source/glsl/optimize.cpp @@ -11,10 +11,6 @@ namespace Msp { namespace GL { namespace SL { -ConstantSpecializer::ConstantSpecializer(): - values(0) -{ } - void ConstantSpecializer::apply(Stage &stage, const map &v) { values = &v; @@ -59,11 +55,6 @@ void ConstantSpecializer::visit(VariableDeclaration &var) } -InlineableFunctionLocator::InlineableFunctionLocator(): - current_function(0), - return_count(0) -{ } - void InlineableFunctionLocator::visit(FunctionCall &call) { FunctionDeclaration *def = call.declaration; @@ -118,11 +109,6 @@ void InlineableFunctionLocator::visit(Return &ret) } -InlineContentInjector::InlineContentInjector(): - source_func(0), - pass(REFERENCED) -{ } - string InlineContentInjector::apply(Stage &stage, FunctionDeclaration &target_func, Block &tgt_blk, const NodeList::iterator &ins_pt, FunctionCall &call) { source_func = call.declaration->definition; @@ -257,12 +243,6 @@ void InlineContentInjector::visit(Return &ret) } -FunctionInliner::FunctionInliner(): - current_function(0), - r_any_inlined(false), - r_inlined_here(false) -{ } - bool FunctionInliner::apply(Stage &s) { stage = &s; @@ -348,16 +328,6 @@ void FunctionInliner::visit(Iteration &iter) } -ExpressionInliner::ExpressionInliner(): - r_ref_info(0), - r_trivial(false), - access_read(true), - access_write(false), - iteration_init(false), - iteration_body(0), - r_oper(0) -{ } - bool ExpressionInliner::apply(Stage &s) { s.content.visit(*this); @@ -909,6 +879,27 @@ void ConstantConditionEliminator::visit(RefPtr &expr) r_ternary_result = 0; } +void ConstantConditionEliminator::visit(UnaryExpression &unary) +{ + if(unary.oper->token[1]=='+' || unary.oper->token[1]=='-') + if(const VariableReference *var = dynamic_cast(unary.expression.get())) + { + auto i = current_block->variables.find(var->name); + r_external_side_effects = (i==current_block->variables.end() || i->second!=var->declaration); + return; + } + + TraversingVisitor::visit(unary); +} + +void ConstantConditionEliminator::visit(Assignment &assign) +{ + auto i = find_if(current_block->variables, [&assign](const pair &kvp){ return kvp.second==assign.target.declaration; }); + if(i==current_block->variables.end()) + r_external_side_effects = true; + TraversingVisitor::visit(assign); +} + void ConstantConditionEliminator::visit(TernaryExpression &ternary) { ConstantStatus result = check_constant_condition(*ternary.condition); @@ -918,6 +909,12 @@ void ConstantConditionEliminator::visit(TernaryExpression &ternary) r_ternary_result = 0; } +void ConstantConditionEliminator::visit(FunctionCall &call) +{ + r_external_side_effects = true; + TraversingVisitor::visit(call); +} + void ConstantConditionEliminator::visit(Conditional &cond) { ConstantStatus result = check_constant_condition(*cond.condition); @@ -930,7 +927,11 @@ void ConstantConditionEliminator::visit(Conditional &cond) return; } + r_external_side_effects = false; TraversingVisitor::visit(cond); + + if(cond.body.body.empty() && cond.else_body.body.empty() && !r_external_side_effects) + nodes_to_remove.insert(&cond); } void ConstantConditionEliminator::visit(Iteration &iter) @@ -945,14 +946,13 @@ void ConstantConditionEliminator::visit(Iteration &iter) } } + r_external_side_effects = false; TraversingVisitor::visit(iter); + if(iter.body.body.empty() && !r_external_side_effects) + nodes_to_remove.insert(&iter); } -UnreachableCodeRemover::UnreachableCodeRemover(): - reachable(true) -{ } - bool UnreachableCodeRemover::apply(Stage &stage) { stage.content.visit(*this); @@ -1046,17 +1046,6 @@ void UnusedTypeRemover::visit(FunctionDeclaration &func) } -UnusedVariableRemover::UnusedVariableRemover(): - stage(0), - interface_block(0), - r_assignment(0), - assignment_target(false), - r_side_effects(false), - in_struct(false), - composite_reference(false), - in_loop(0) -{ } - bool UnusedVariableRemover::apply(Stage &s) { stage = &s;