diff options
author | 2017-01-19 10:44:45 -0500 | |
---|---|---|
committer | 2017-01-19 16:17:36 +0000 | |
commit | f54b07121f81a56145fb118a2e18841fc135717d (patch) | |
tree | 088966a79e4f01641af5f198f985b07b9144b267 /src/sksl/ir/SkSLConstructor.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/ir/SkSLConstructor.h')
-rw-r--r-- | src/sksl/ir/SkSLConstructor.h | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/src/sksl/ir/SkSLConstructor.h b/src/sksl/ir/SkSLConstructor.h index 63c692b88e..691bea123a 100644 --- a/src/sksl/ir/SkSLConstructor.h +++ b/src/sksl/ir/SkSLConstructor.h @@ -9,6 +9,9 @@ #define SKSL_CONSTRUCTOR #include "SkSLExpression.h" +#include "SkSLFloatLiteral.h" +#include "SkSLIntLiteral.h" +#include "SkSLIRGenerator.h" namespace SkSL { @@ -21,6 +24,20 @@ struct Constructor : public Expression { : INHERITED(position, kConstructor_Kind, type) , fArguments(std::move(arguments)) {} + virtual std::unique_ptr<Expression> constantPropagate( + const IRGenerator& irGenerator, + const DefinitionMap& definitions) override { + if (fArguments.size() == 1 && fArguments[0]->fKind == Expression::kIntLiteral_Kind && + // promote float(1) to 1.0 + fType == *irGenerator.fContext.fFloat_Type) { + int64_t intValue = ((IntLiteral&) *fArguments[0]).fValue; + return std::unique_ptr<Expression>(new FloatLiteral(irGenerator.fContext, + fPosition, + intValue)); + } + return nullptr; + } + SkString description() const override { SkString result = fType.description() + "("; SkString separator; @@ -42,7 +59,7 @@ struct Constructor : public Expression { return true; } - const std::vector<std::unique_ptr<Expression>> fArguments; + std::vector<std::unique_ptr<Expression>> fArguments; typedef Expression INHERITED; }; |