]> git.tdb.fi Git - libs/gl.git/blobdiff - source/glsl/optimize.cpp
Remove conditional and iteration statements with no effect from GLSL
[libs/gl.git] / source / glsl / optimize.cpp
index 9388c04129cfc1b03020ef0f00da650bf2b46f1a..a24d85dd5f0b7f025e01ab7b13dca85238b09535 100644 (file)
@@ -909,6 +909,27 @@ void ConstantConditionEliminator::visit(RefPtr<Expression> &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<const VariableReference *>(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<string, VariableDeclaration *> &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 +939,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 +957,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,7 +976,10 @@ 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);
 }