diff options
author | Ethan Nicholas <ethannicholas@google.com> | 2017-01-19 13:32:00 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-01-19 20:11:40 +0000 |
commit | 86a43405fb3f83f6d45581959df5f7321487ae7e (patch) | |
tree | 4d367433d67af533d96fcbc80abe192010219427 /src/sksl/ir/SkSLForStatement.h | |
parent | 4f364fd951eac36adbc1c8719f3e7c42974dfad1 (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: I068c5d2e9a362e75299b1de1f4575339f5ddc3bb
Reviewed-on: https://skia-review.googlesource.com/7302
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Diffstat (limited to 'src/sksl/ir/SkSLForStatement.h')
-rw-r--r-- | src/sksl/ir/SkSLForStatement.h | 12 |
1 files changed, 7 insertions, 5 deletions
diff --git a/src/sksl/ir/SkSLForStatement.h b/src/sksl/ir/SkSLForStatement.h index ff03d0d7f9..f2bf880ddd 100644 --- a/src/sksl/ir/SkSLForStatement.h +++ b/src/sksl/ir/SkSLForStatement.h @@ -22,11 +22,11 @@ struct ForStatement : public Statement { std::unique_ptr<Expression> test, std::unique_ptr<Expression> next, std::unique_ptr<Statement> statement, std::shared_ptr<SymbolTable> symbols) : INHERITED(position, kFor_Kind) + , fSymbols(symbols) , fInitializer(std::move(initializer)) , fTest(std::move(test)) , fNext(std::move(next)) - , fStatement(std::move(statement)) - , fSymbols(symbols) {} + , fStatement(std::move(statement)) {} SkString description() const override { SkString result("for ("); @@ -45,11 +45,13 @@ struct ForStatement : public Statement { return result; } + // it's important to keep fSymbols defined first (and thus destroyed last) because destroying + // the other fields can update symbol reference counts + const std::shared_ptr<SymbolTable> fSymbols; const std::unique_ptr<Statement> fInitializer; - const std::unique_ptr<Expression> fTest; - const std::unique_ptr<Expression> fNext; + std::unique_ptr<Expression> fTest; + std::unique_ptr<Expression> fNext; const std::unique_ptr<Statement> fStatement; - const std::shared_ptr<SymbolTable> fSymbols; typedef Statement INHERITED; }; |