aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/sksl/ir/SkSLPrefixExpression.h
diff options
context:
space:
mode:
authorGravatar Ethan Nicholas <ethannicholas@google.com>2017-04-20 19:31:52 -0400
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-04-20 23:57:21 +0000
commitcb67096b61f699b047fe8635984db1ac708a7b99 (patch)
tree3a8bda0962ad77d0d9ccb1d89c15f70578a7fe78 /src/sksl/ir/SkSLPrefixExpression.h
parente79b473714866682dea85b66c005c5bb2ff6a397 (diff)
Improved skslc optimizer, particularly around vectors.
BUG=skia: Change-Id: Idb364d9198f2ff84aad1eb68e236fb45ec1c86b7 Reviewed-on: https://skia-review.googlesource.com/8000 Commit-Queue: Ethan Nicholas <ethannicholas@google.com> Reviewed-by: Ben Wagner <benjaminwagner@google.com>
Diffstat (limited to 'src/sksl/ir/SkSLPrefixExpression.h')
-rw-r--r--src/sksl/ir/SkSLPrefixExpression.h24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/sksl/ir/SkSLPrefixExpression.h b/src/sksl/ir/SkSLPrefixExpression.h
index 4fa54ca32d..a61ff65bd6 100644
--- a/src/sksl/ir/SkSLPrefixExpression.h
+++ b/src/sksl/ir/SkSLPrefixExpression.h
@@ -22,7 +22,29 @@ struct PrefixExpression : public Expression {
, fOperand(std::move(operand))
, fOperator(op) {}
- virtual String description() const override {
+ bool isConstant() const override {
+ return fOperator == Token::MINUS && fOperand->isConstant();
+ }
+
+ bool hasSideEffects() const override {
+ return fOperator == Token::PLUSPLUS || fOperator == Token::MINUSMINUS ||
+ fOperand->hasSideEffects();
+ }
+
+ virtual std::unique_ptr<Expression> constantPropagate(
+ const IRGenerator& irGenerator,
+ const DefinitionMap& definitions) override {
+ if (fOperand->fKind == Expression::kFloatLiteral_Kind) {
+ return std::unique_ptr<Expression>(new FloatLiteral(
+ irGenerator.fContext,
+ Position(),
+ -((FloatLiteral&) *fOperand).fValue));
+
+ }
+ return nullptr;
+ }
+
+ String description() const override {
return Token::OperatorName(fOperator) + fOperand->description();
}