diff options
author | 2017-01-19 13:32:00 -0500 | |
---|---|---|
committer | 2017-01-19 20:11:40 +0000 | |
commit | 86a43405fb3f83f6d45581959df5f7321487ae7e (patch) | |
tree | 4d367433d67af533d96fcbc80abe192010219427 /src/sksl/ir/SkSLExpression.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/SkSLExpression.h')
-rw-r--r-- | src/sksl/ir/SkSLExpression.h | 25 |
1 files changed, 22 insertions, 3 deletions
diff --git a/src/sksl/ir/SkSLExpression.h b/src/sksl/ir/SkSLExpression.h index b4ed37c09a..f87d810fc0 100644 --- a/src/sksl/ir/SkSLExpression.h +++ b/src/sksl/ir/SkSLExpression.h @@ -4,17 +4,24 @@ * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ - + #ifndef SKSL_EXPRESSION #define SKSL_EXPRESSION -#include "SkSLIRNode.h" #include "SkSLType.h" +#include "SkSLVariable.h" + +#include <unordered_map> namespace SkSL { +struct Expression; +class IRGenerator; + +typedef std::unordered_map<const Variable*, std::unique_ptr<Expression>*> DefinitionMap; + /** - * Abstract supertype of all expressions. + * Abstract supertype of all expressions. */ struct Expression : public IRNode { enum Kind { @@ -45,6 +52,18 @@ struct Expression : public IRNode { return false; } + /** + * Given a map of known constant variable values, substitute them in for references to those + * variables occurring in this expression and its subexpressions. Similar simplifications, such + * as folding a constant binary expression down to a single value, may also be performed. + * Returns a new expression which replaces this expression, or null if no replacements were + * made. If a new expression is returned, this expression is no longer valid. + */ + virtual std::unique_ptr<Expression> constantPropagate(const IRGenerator& irGenerator, + const DefinitionMap& definitions) { + return nullptr; + } + const Kind fKind; const Type& fType; |