1 #ifndef MSP_GL_SL_OPTIMIZE_H_
2 #define MSP_GL_SL_OPTIMIZE_H_
13 class InlineableFunctionLocator: public 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; }
25 using TraversingVisitor::visit;
26 virtual void visit(FunctionCall &);
27 virtual void visit(FunctionDeclaration &);
30 class FunctionInliner: public TraversingVisitor
33 std::set<FunctionDeclaration *> inlineable;
34 unsigned extract_result;
35 RefPtr<Expression> inline_result;
39 FunctionInliner(const std::set<FunctionDeclaration *> &);
41 void apply(Stage &s) { visit(s.content); }
44 void visit_and_inline(RefPtr<Expression> &);
46 using TraversingVisitor::visit;
47 virtual void visit(Block &);
48 virtual void visit(UnaryExpression &);
49 virtual void visit(BinaryExpression &);
50 virtual void visit(MemberAccess &);
51 virtual void visit(FunctionCall &);
52 virtual void visit(VariableDeclaration &);
53 virtual void visit(Return &);
56 class ConstantConditionEliminator: public BlockModifier
61 ExpressionEvaluator::ValueMap variable_values;
64 ConstantConditionEliminator();
66 void apply(Stage &s) { visit(s.content); }
68 using BlockModifier::visit;
69 virtual void visit(Block &);
70 virtual void visit(UnaryExpression &);
71 virtual void visit(Assignment &);
72 virtual void visit(VariableDeclaration &);
73 virtual void visit(Conditional &);
74 virtual void visit(Iteration &);
77 class UnusedVariableLocator: public TraversingVisitor
83 std::vector<Node *> assignments;
84 bool conditionally_assigned;
90 typedef std::map<VariableDeclaration *, VariableInfo> BlockVariableMap;
92 std::set<Node *> unused_nodes;
93 std::map<VariableDeclaration *, Node *> aggregates;
95 std::vector<BlockVariableMap> variables;
96 Assignment *assignment;
97 bool assignment_target;
98 bool assign_to_subscript;
102 UnusedVariableLocator();
104 const std::set<Node *> &apply(Stage &);
106 using TraversingVisitor::visit;
107 virtual void visit(VariableReference &);
108 virtual void visit(MemberAccess &);
109 virtual void visit(BinaryExpression &);
110 virtual void visit(Assignment &);
112 void record_assignment(VariableDeclaration &, Node &, bool);
113 void clear_assignments(VariableInfo &, bool);
115 virtual void visit(ExpressionStatement &);
116 virtual void visit(StructDeclaration &);
117 virtual void visit(VariableDeclaration &);
118 virtual void visit(InterfaceBlock &);
119 virtual void visit(FunctionDeclaration &);
121 void merge_down_variables();
123 virtual void visit(Conditional &);
124 virtual void visit(Iteration &);
127 class UnusedFunctionLocator: public TraversingVisitor
130 std::set<Node *> unused_nodes;
131 std::set<FunctionDeclaration *> used_definitions;
134 const std::set<Node *> &apply(Stage &s) { visit(s.content); return unused_nodes; }
136 using TraversingVisitor::visit;
137 virtual void visit(FunctionCall &);
138 virtual void visit(FunctionDeclaration &);