diff options
author | Ethan Nicholas <ethannicholas@google.com> | 2017-01-19 10:44:45 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-01-19 16:17:36 +0000 |
commit | f54b07121f81a56145fb118a2e18841fc135717d (patch) | |
tree | 088966a79e4f01641af5f198f985b07b9144b267 /src/sksl/SkSLCFGGenerator.h | |
parent | 189098e70967c05c8810299b4afa325736a6565e (diff) |
Added constant propagation and better variable liveness tracking to
skslc.
This allows skslc to track the values of variables with constant
values across multiple statements and replace variable references with
constant values where appropriate.
The improved liveness tracking allows skslc to realize that a
variable is no longer alive if all references to it have been
replaced. It is not yet doing much with this information; better
dead code elimination is coming in a followup change.
BUG=skia:
Change-Id: I6bf267d478b769caf0063ac3597dc16bbe618cb4
Reviewed-on: https://skia-review.googlesource.com/7033
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
Diffstat (limited to 'src/sksl/SkSLCFGGenerator.h')
-rw-r--r-- | src/sksl/SkSLCFGGenerator.h | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/src/sksl/SkSLCFGGenerator.h b/src/sksl/SkSLCFGGenerator.h index c37850112c..337fdfac35 100644 --- a/src/sksl/SkSLCFGGenerator.h +++ b/src/sksl/SkSLCFGGenerator.h @@ -27,14 +27,23 @@ struct BasicBlock { }; Kind fKind; - const IRNode* fNode; + // if false, this node should not be subject to constant propagation. This happens with + // compound assignment (i.e. x *= 2), in which the value x is used as an rvalue for + // multiplication by 2 and then as an lvalue for assignment purposes. Since there is only + // one "x" node, replacing it with a constant would break the assignment and we suppress + // it. Down the road, we should handle this more elegantly by substituting a regular + // assignment if the target is constant (i.e. x = 1; x *= 2; should become x = 1; x = 1 * 2; + // and then collapse down to a simple x = 2;). + bool fConstantPropagation; + std::unique_ptr<Expression>* fExpression; + const Statement* fStatement; }; - + std::vector<Node> fNodes; std::set<BlockId> fEntrances; std::set<BlockId> fExits; // variable definitions upon entering this basic block (null expression = undefined) - std::unordered_map<const Variable*, const Expression*> fBefore; + DefinitionMap fBefore; }; struct CFG { @@ -77,9 +86,9 @@ public: private: void addStatement(CFG& cfg, const Statement* s); - void addExpression(CFG& cfg, const Expression* e); + void addExpression(CFG& cfg, std::unique_ptr<Expression>* e, bool constantPropagate); - void addLValue(CFG& cfg, const Expression* e); + void addLValue(CFG& cfg, std::unique_ptr<Expression>* e); std::stack<BlockId> fLoopContinues; std::stack<BlockId> fLoopExits; |