1 #ifndef MSP_GL_SL_OPTIMIZE_H_
2 #define MSP_GL_SL_OPTIMIZE_H_
13 class InlineableFunctionLocator: private TraversingVisitor
16 std::map<FunctionDeclaration *, unsigned> refcounts;
17 std::set<FunctionDeclaration *> inlineable;
18 FunctionDeclaration *in_function;
21 InlineableFunctionLocator();
23 const std::set<FunctionDeclaration *> &apply(Stage &s) { s.content.visit(*this); return inlineable; }
26 virtual void visit(FunctionCall &);
27 virtual void visit(FunctionDeclaration &);
30 class FunctionInliner: private TraversingVisitor
33 std::set<FunctionDeclaration *> inlineable;
34 unsigned extract_result;
35 RefPtr<Expression> inline_result;
43 void visit_and_inline(RefPtr<Expression> &);
45 virtual void visit(Block &);
46 virtual void visit(UnaryExpression &);
47 virtual void visit(BinaryExpression &);
48 virtual void visit(MemberAccess &);
49 virtual void visit(FunctionCall &);
50 virtual void visit(VariableDeclaration &);
51 virtual void visit(Return &);
54 class ConstantConditionEliminator: private TraversingVisitor
58 ExpressionEvaluator::ValueMap variable_values;
59 NodeList<Statement>::iterator insert_point;
60 std::set<Node *> nodes_to_remove;
63 ConstantConditionEliminator();
68 virtual void visit(Block &);
69 virtual void visit(UnaryExpression &);
70 virtual void visit(Assignment &);
71 virtual void visit(VariableDeclaration &);
72 virtual void visit(Conditional &);
73 virtual void visit(Iteration &);
76 class UnusedVariableRemover: private TraversingVisitor
82 std::vector<Node *> assignments;
83 bool conditionally_assigned;
89 typedef std::map<VariableDeclaration *, VariableInfo> BlockVariableMap;
91 std::set<Node *> unused_nodes;
92 std::map<VariableDeclaration *, Node *> aggregates;
94 std::vector<BlockVariableMap> variables;
95 Assignment *assignment;
96 bool assignment_target;
97 bool assign_to_subscript;
100 UnusedVariableRemover();
105 virtual void visit(VariableReference &);
106 virtual void visit(InterfaceBlockReference &);
107 virtual void visit(MemberAccess &);
108 virtual void visit(BinaryExpression &);
109 virtual void visit(Assignment &);
110 void record_assignment(VariableDeclaration &, Node &, bool);
111 void clear_assignments(VariableInfo &, bool);
112 virtual void visit(ExpressionStatement &);
113 virtual void visit(StructDeclaration &);
114 virtual void visit(VariableDeclaration &);
115 virtual void visit(InterfaceBlock &);
116 virtual void visit(FunctionDeclaration &);
117 void merge_down_variables();
118 virtual void visit(Conditional &);
119 virtual void visit(Iteration &);
122 class UnusedFunctionRemover: private TraversingVisitor
125 std::set<Node *> unused_nodes;
126 std::set<FunctionDeclaration *> used_definitions;
129 bool apply(Stage &s);
132 virtual void visit(FunctionCall &);
133 virtual void visit(FunctionDeclaration &);