namespace GL {
namespace SL {
-ConstantSpecializer::ConstantSpecializer():
- values(0)
-{ }
-
void ConstantSpecializer::apply(Stage &stage, const map<string, int> &v)
{
values = &v;
}
-InlineableFunctionLocator::InlineableFunctionLocator():
- current_function(0),
- return_count(0)
-{ }
-
void InlineableFunctionLocator::visit(FunctionCall &call)
{
FunctionDeclaration *def = call.declaration;
}
-InlineContentInjector::InlineContentInjector():
- source_func(0),
- pass(REFERENCED)
-{ }
-
string InlineContentInjector::apply(Stage &stage, FunctionDeclaration &target_func, Block &tgt_blk, const NodeList<Statement>::iterator &ins_pt, FunctionCall &call)
{
source_func = call.declaration->definition;
}
-FunctionInliner::FunctionInliner():
- current_function(0),
- r_any_inlined(false),
- r_inlined_here(false)
-{ }
-
bool FunctionInliner::apply(Stage &s)
{
stage = &s;
}
-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);
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);
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);
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)
}
}
+ 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);
}
-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;