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) { visit(s.content); return inlineable; }
26 virtual void visit(FunctionCall &);
27 virtual void visit(FunctionDeclaration &);
28 using TraversingVisitor::visit;
31 class FunctionInliner: private TraversingVisitor
34 std::set<FunctionDeclaration *> inlineable;
35 unsigned extract_result;
36 RefPtr<Expression> inline_result;
44 void visit_and_inline(RefPtr<Expression> &);
46 virtual void visit(Block &);
47 virtual void visit(UnaryExpression &);
48 virtual void visit(BinaryExpression &);
49 virtual void visit(MemberAccess &);
50 virtual void visit(FunctionCall &);
51 virtual void visit(VariableDeclaration &);
52 virtual void visit(Return &);
53 using TraversingVisitor::visit;
56 class ConstantConditionEliminator: private TraversingVisitor
62 ExpressionEvaluator::ValueMap variable_values;
63 NodeList<Statement>::iterator insert_point;
64 std::set<Node *> nodes_to_remove;
67 ConstantConditionEliminator();
72 virtual void visit(Block &);
73 virtual void visit(UnaryExpression &);
74 virtual void visit(Assignment &);
75 virtual void visit(VariableDeclaration &);
76 virtual void visit(Conditional &);
77 virtual void visit(Iteration &);
78 using TraversingVisitor::visit;
81 class UnusedVariableRemover: private TraversingVisitor
87 std::vector<Node *> assignments;
88 bool conditionally_assigned;
94 typedef std::map<VariableDeclaration *, VariableInfo> BlockVariableMap;
96 std::set<Node *> unused_nodes;
97 std::map<VariableDeclaration *, Node *> aggregates;
99 std::vector<BlockVariableMap> variables;
100 Assignment *assignment;
101 bool assignment_target;
102 bool assign_to_subscript;
106 UnusedVariableRemover();
111 virtual void visit(VariableReference &);
112 virtual void visit(MemberAccess &);
113 virtual void visit(BinaryExpression &);
114 virtual void visit(Assignment &);
115 void record_assignment(VariableDeclaration &, Node &, bool);
116 void clear_assignments(VariableInfo &, bool);
117 virtual void visit(ExpressionStatement &);
118 virtual void visit(StructDeclaration &);
119 virtual void visit(VariableDeclaration &);
120 virtual void visit(InterfaceBlock &);
121 virtual void visit(FunctionDeclaration &);
122 void merge_down_variables();
123 virtual void visit(Conditional &);
124 virtual void visit(Iteration &);
125 using TraversingVisitor::visit;
128 class UnusedFunctionRemover: private TraversingVisitor
131 std::set<Node *> unused_nodes;
132 std::set<FunctionDeclaration *> used_definitions;
135 bool apply(Stage &s);
138 virtual void visit(FunctionCall &);
139 virtual void visit(FunctionDeclaration &);
140 using TraversingVisitor::visit;