diff options
author | Ethan Nicholas <ethannicholas@google.com> | 2018-03-26 14:24:27 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-03-26 19:03:44 +0000 |
commit | 8f7e28f3ae262450c5b04deded9fa23041757868 (patch) | |
tree | ca5007c4dce793ee1841a5a2d27d1a865a5f85ff /src/sksl/SkSLCompiler.cpp | |
parent | 19d311b1e3f48d0f04585ce199c377956af52be4 (diff) |
added frexp support to SkSL
This includes an optimizer fix for the situation:
int i;
float f = frexp(foo, i);
If we don't read the variable i, it is considered dead and eliminated -
which then causes an error when we try to write the expression
frexmp(foo, i).
Bug: skia:
Change-Id: Iac385e38e215455346fab62e1f4ec46fa65b3c21
Reviewed-on: https://skia-review.googlesource.com/116521
Reviewed-by: Chris Dalton <csmartdalton@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Diffstat (limited to 'src/sksl/SkSLCompiler.cpp')
-rw-r--r-- | src/sksl/SkSLCompiler.cpp | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/src/sksl/SkSLCompiler.cpp b/src/sksl/SkSLCompiler.cpp index 06ab71f922..bbaaf407d2 100644 --- a/src/sksl/SkSLCompiler.cpp +++ b/src/sksl/SkSLCompiler.cpp @@ -660,8 +660,11 @@ void Compiler::simplifyExpression(DefinitionMap& definitions, } switch (expr->fKind) { case Expression::kVariableReference_Kind: { - const Variable& var = ((VariableReference*) expr)->fVariable; - if (var.fStorage == Variable::kLocal_Storage && !definitions[&var] && + const VariableReference& ref = (VariableReference&) *expr; + const Variable& var = ref.fVariable; + if (ref.refKind() != VariableReference::kWrite_RefKind && + ref.refKind() != VariableReference::kPointer_RefKind && + var.fStorage == Variable::kLocal_Storage && !definitions[&var] && (*undefinedVariables).find(&var) == (*undefinedVariables).end()) { (*undefinedVariables).insert(&var); this->error(expr->fOffset, |