diff options
author | Ethan Nicholas <ethannicholas@google.com> | 2017-12-11 12:34:33 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2017-12-11 18:04:48 +0000 |
commit | 51493ee8488e29499a1a0a678a50aeca44ebf718 (patch) | |
tree | 04e36cedb45ea83b751ea38e08215cb4ce9806b2 /src/sksl | |
parent | 603144229b20c6f1d1729e9ba7d1ea64791938fc (diff) |
fixed SkSL optimizing away side effects
Bug: skia:7196
Change-Id: I44676003d9ea7970efb40df2f7e40c2de05a5f67
Reviewed-on: https://skia-review.googlesource.com/83440
Reviewed-by: Greg Daniel <egdaniel@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Diffstat (limited to 'src/sksl')
-rw-r--r-- | src/sksl/SkSLCompiler.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/sksl/SkSLCompiler.cpp b/src/sksl/SkSLCompiler.cpp index a38d280315..c7a51aeb97 100644 --- a/src/sksl/SkSLCompiler.cpp +++ b/src/sksl/SkSLCompiler.cpp @@ -481,6 +481,7 @@ void delete_left(BasicBlock* b, std::unique_ptr<Expression>* target = (*iter)->expression(); ASSERT((*target)->fKind == Expression::kBinary_Kind); BinaryExpression& bin = (BinaryExpression&) **target; + ASSERT(!bin.fLeft->hasSideEffects()); bool result; if (bin.fOperator == Token::EQ) { result = b->tryRemoveLValueBefore(iter, bin.fLeft.get()); @@ -518,6 +519,7 @@ void delete_right(BasicBlock* b, std::unique_ptr<Expression>* target = (*iter)->expression(); ASSERT((*target)->fKind == Expression::kBinary_Kind); BinaryExpression& bin = (BinaryExpression&) **target; + ASSERT(!bin.fRight->hasSideEffects()); if (!b->tryRemoveExpressionBefore(iter, bin.fRight.get())) { *target = std::move(bin.fLeft); *outNeedsRescan = true; @@ -702,7 +704,9 @@ void Compiler::simplifyExpression(DefinitionMap& definitions, // 0 * x -> 0 // float4(0) * x -> float4(0) // float4(0) * float4(x) -> float4(0) - delete_right(&b, iter, outUpdated, outNeedsRescan); + if (!bin->fRight->hasSideEffects()) { + delete_right(&b, iter, outUpdated, outNeedsRescan); + } } } else if (is_constant(*bin->fRight, 1)) { @@ -726,7 +730,9 @@ void Compiler::simplifyExpression(DefinitionMap& definitions, // x * 0 -> 0 // x * float4(0) -> float4(0) // float4(x) * float4(0) -> float4(0) - delete_left(&b, iter, outUpdated, outNeedsRescan); + if (!bin->fLeft->hasSideEffects()) { + delete_left(&b, iter, outUpdated, outNeedsRescan); + } } } break; @@ -790,7 +796,9 @@ void Compiler::simplifyExpression(DefinitionMap& definitions, // 0 / x -> 0 // float4(0) / x -> float4(0) // float4(0) / float4(x) -> float4(0) - delete_right(&b, iter, outUpdated, outNeedsRescan); + if (!bin->fRight->hasSideEffects()) { + delete_right(&b, iter, outUpdated, outNeedsRescan); + } } } break; |