aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/sksl
diff options
context:
space:
mode:
authorGravatar Ethan Nicholas <ethannicholas@google.com>2017-12-11 12:34:33 -0500
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2017-12-11 18:04:48 +0000
commit51493ee8488e29499a1a0a678a50aeca44ebf718 (patch)
tree04e36cedb45ea83b751ea38e08215cb4ce9806b2 /src/sksl
parent603144229b20c6f1d1729e9ba7d1ea64791938fc (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.cpp14
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;