namespace GL {
namespace SL {
+/** Finds functions which are candidates for inlining. Currently this means
+functions which have no parameters and are only called once. */
class InlineableFunctionLocator: private TraversingVisitor
{
private:
public:
InlineableFunctionLocator();
- const std::set<FunctionDeclaration *> &apply(Stage &s) { visit(s.content); return inlineable; }
+ const std::set<FunctionDeclaration *> &apply(Stage &s) { s.content.visit(*this); return inlineable; }
private:
virtual void visit(FunctionCall &);
virtual void visit(FunctionDeclaration &);
- using TraversingVisitor::visit;
};
+/** Collects declarations referenced by a function. */
+class InlineDependencyCollector: private TraversingVisitor
+{
+private:
+ std::set<Node *> dependencies;
+
+public:
+ const std::set<Node *> &apply(FunctionDeclaration &f) { f.visit(*this); return dependencies; }
+
+private:
+ virtual void visit(VariableReference &);
+ virtual void visit(InterfaceBlockReference &);
+ virtual void visit(FunctionCall &);
+ virtual void visit(VariableDeclaration &);
+};
+
+/** Inlines functions. Internally uses InlineableFunctionLocator to find
+candidate functions. Only functions which consist of a single return statement
+are inlined. */
class FunctionInliner: private TraversingVisitor
{
private:
+ Stage *stage;
std::set<FunctionDeclaration *> inlineable;
+ FunctionDeclaration *current_function;
unsigned extract_result;
RefPtr<Expression> inline_result;
+ bool any_inlined;
public:
FunctionInliner();
- void apply(Stage &);
+ bool apply(Stage &);
private:
void visit_and_inline(RefPtr<Expression> &);
virtual void visit(MemberAccess &);
virtual void visit(FunctionCall &);
virtual void visit(VariableDeclaration &);
+ virtual void visit(FunctionDeclaration &);
virtual void visit(Return &);
- using TraversingVisitor::visit;
};
-class ConstantConditionEliminator: private BlockModifier
+/** Removes conditional statements and loops where the condition can be
+determined as constant at compile time. */
+class ConstantConditionEliminator: private TraversingVisitor
{
private:
- unsigned scope_level;
bool record_only;
ExpressionEvaluator::ValueMap variable_values;
+ NodeList<Statement>::iterator insert_point;
+ std::set<Node *> nodes_to_remove;
public:
ConstantConditionEliminator();
- void apply(Stage &s) { visit(s.content); }
+ void apply(Stage &);
private:
virtual void visit(Block &);
virtual void visit(VariableDeclaration &);
virtual void visit(Conditional &);
virtual void visit(Iteration &);
- using BlockModifier::visit;
};
+/** Removes variable declarations with no references to them. Assignment
+statements where the result is not used are also removed. */
class UnusedVariableRemover: private TraversingVisitor
{
private:
Assignment *assignment;
bool assignment_target;
bool assign_to_subscript;
- bool global_scope;
public:
UnusedVariableRemover();
private:
virtual void visit(VariableReference &);
+ virtual void visit(InterfaceBlockReference &);
virtual void visit(MemberAccess &);
virtual void visit(BinaryExpression &);
virtual void visit(Assignment &);
void merge_down_variables();
virtual void visit(Conditional &);
virtual void visit(Iteration &);
- using TraversingVisitor::visit;
};
+/** Removes function declarations with no references to them. */
class UnusedFunctionRemover: private TraversingVisitor
{
private:
private:
virtual void visit(FunctionCall &);
virtual void visit(FunctionDeclaration &);
- using TraversingVisitor::visit;
};
} // namespace SL