1 #ifndef MSP_GL_SL_OPTIMIZE_H_
2 #define MSP_GL_SL_OPTIMIZE_H_
13 /** Finds functions which are candidates for inlining. Currently this means
14 functions which have no parameters, contain no more than one return statement,
15 and are only called once. */
16 class InlineableFunctionLocator: private TraversingVisitor
19 std::map<FunctionDeclaration *, unsigned> refcounts;
20 std::set<FunctionDeclaration *> inlineable;
21 FunctionDeclaration *current_function;
22 unsigned return_count;
25 InlineableFunctionLocator();
27 const std::set<FunctionDeclaration *> &apply(Stage &s) { s.content.visit(*this); return inlineable; }
30 virtual void visit(FunctionCall &);
31 virtual void visit(FunctionDeclaration &);
32 virtual void visit(Conditional &);
33 virtual void visit(Iteration &);
34 virtual void visit(Return &);
37 /** Injects statements from one function into another. Local variables are
38 renamed to avoid conflicts. After inlining, uses NodeReorderer to cause
39 dependencies of the inlined statements to appear before the target function. */
40 class InlineContentInjector: private TraversingVisitor
43 FunctionDeclaration *source_func;
45 std::map<std::string, VariableDeclaration *> variable_map;
48 RefPtr<Statement> r_inlined_statement;
49 std::set<Node *> dependencies;
50 std::string r_result_name;
53 InlineContentInjector();
55 const std::string &apply(Stage &, FunctionDeclaration &, Block &, const NodeList<Statement>::iterator &, FunctionDeclaration &);
58 std::string create_unused_name(const std::string &, bool);
60 virtual void visit(VariableReference &);
61 virtual void visit(InterfaceBlockReference &);
62 virtual void visit(FunctionCall &);
63 virtual void visit(VariableDeclaration &);
64 virtual void visit(Return &);
67 /** Inlines functions. Internally uses InlineableFunctionLocator to find
68 candidate functions. Only functions which consist of a single return statement
70 class FunctionInliner: private TraversingVisitor
74 std::set<FunctionDeclaration *> inlineable;
75 FunctionDeclaration *current_function;
76 NodeList<Statement>::iterator insert_point;
77 RefPtr<Expression> r_inline_result;
86 void visit_and_inline(RefPtr<Expression> &);
88 virtual void visit(Block &);
89 virtual void visit(UnaryExpression &);
90 virtual void visit(BinaryExpression &);
91 virtual void visit(MemberAccess &);
92 virtual void visit(FunctionCall &);
93 virtual void visit(ExpressionStatement &);
94 virtual void visit(VariableDeclaration &);
95 virtual void visit(FunctionDeclaration &);
96 virtual void visit(Conditional &);
97 virtual void visit(Iteration &);
98 virtual void visit(Return &);
101 /** Removes conditional statements and loops where the condition can be
102 determined as constant at compile time. */
103 class ConstantConditionEliminator: private TraversingVisitor
107 ExpressionEvaluator::ValueMap variable_values;
108 NodeList<Statement>::iterator insert_point;
109 std::set<Node *> nodes_to_remove;
112 ConstantConditionEliminator();
117 virtual void visit(Block &);
118 virtual void visit(UnaryExpression &);
119 virtual void visit(Assignment &);
120 virtual void visit(VariableDeclaration &);
121 virtual void visit(Conditional &);
122 virtual void visit(Iteration &);
125 /** Removes variable declarations with no references to them. Assignment
126 statements where the result is not used are also removed. */
127 class UnusedVariableRemover: private TraversingVisitor
133 std::vector<Node *> assignments;
134 bool conditionally_assigned;
140 typedef std::map<VariableDeclaration *, VariableInfo> BlockVariableMap;
142 std::set<Node *> unused_nodes;
143 std::map<VariableDeclaration *, Node *> aggregates;
145 std::vector<BlockVariableMap> variables;
146 Assignment *r_assignment;
147 bool assignment_target;
148 bool r_assign_to_subfield;
152 UnusedVariableRemover();
157 virtual void visit(VariableReference &);
158 virtual void visit(InterfaceBlockReference &);
159 virtual void visit(MemberAccess &);
160 virtual void visit(UnaryExpression &);
161 virtual void visit(BinaryExpression &);
162 virtual void visit(Assignment &);
163 void record_assignment(VariableDeclaration &, Node &, bool);
164 void clear_assignments(VariableInfo &, bool);
165 virtual void visit(FunctionCall &);
166 virtual void visit(ExpressionStatement &);
167 virtual void visit(StructDeclaration &);
168 virtual void visit(VariableDeclaration &);
169 virtual void visit(InterfaceBlock &);
170 virtual void visit(FunctionDeclaration &);
171 void merge_down_variables();
172 virtual void visit(Conditional &);
173 virtual void visit(Iteration &);
176 /** Removes function declarations with no references to them. */
177 class UnusedFunctionRemover: private TraversingVisitor
180 std::set<Node *> unused_nodes;
181 std::set<FunctionDeclaration *> used_definitions;
184 bool apply(Stage &s);
187 virtual void visit(FunctionCall &);
188 virtual void visit(FunctionDeclaration &);