skslc comma operator and optimizer fixes
Bug: skia:
Change-Id: I732d4fba843c06af570d4a56cadfaa1cc565808c
Reviewed-on: https://skia-review.googlesource.com/17125
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Reviewed-by: Ben Wagner <benjaminwagner@google.com>
diff --git a/src/sksl/SkSLCompiler.cpp b/src/sksl/SkSLCompiler.cpp
index a283e30..f63ef97 100644
--- a/src/sksl/SkSLCompiler.cpp
+++ b/src/sksl/SkSLCompiler.cpp
@@ -436,20 +436,27 @@
BinaryExpression& bin = (BinaryExpression&) **target;
bool result;
if (bin.fOperator == Token::EQ) {
- result = !b->tryRemoveLValueBefore(iter, bin.fLeft.get());
+ result = b->tryRemoveLValueBefore(iter, bin.fLeft.get());
} else {
- result = !b->tryRemoveExpressionBefore(iter, bin.fLeft.get());
+ result = b->tryRemoveExpressionBefore(iter, bin.fLeft.get());
}
+ *target = std::move(bin.fRight);
if (!result) {
- *target = std::move(bin.fRight);
+ *outNeedsRescan = true;
+ return;
+ }
+ if (*iter == b->fNodes.begin()) {
*outNeedsRescan = true;
return;
}
--(*iter);
- ASSERT((*iter)->expression() == &bin.fRight);
+ if ((*iter)->fKind != BasicBlock::Node::kExpression_Kind ||
+ (*iter)->expression() != &bin.fRight) {
+ *outNeedsRescan = true;
+ return;
+ }
*iter = b->fNodes.erase(*iter);
ASSERT((*iter)->expression() == target);
- *target = std::move(bin.fRight);
}
/**
@@ -469,11 +476,19 @@
*outNeedsRescan = true;
return;
}
+ *target = std::move(bin.fLeft);
+ if (*iter == b->fNodes.begin()) {
+ *outNeedsRescan = true;
+ return;
+ }
--(*iter);
- ASSERT((*iter)->expression() == &bin.fLeft);
+ if (((*iter)->fKind != BasicBlock::Node::kExpression_Kind ||
+ (*iter)->expression() != &bin.fLeft)) {
+ *outNeedsRescan = true;
+ return;
+ }
*iter = b->fNodes.erase(*iter);
ASSERT((*iter)->expression() == target);
- *target = std::move(bin.fLeft);
}
/**
@@ -569,12 +584,13 @@
if ((*iter)->fConstantPropagation) {
std::unique_ptr<Expression> optimized = expr->constantPropagate(*fIRGenerator, definitions);
if (optimized) {
+ *outUpdated = true;
if (!try_replace_expression(&b, iter, &optimized)) {
*outNeedsRescan = true;
+ return;
}
ASSERT((*iter)->fKind == BasicBlock::Node::kExpression_Kind);
expr = (*iter)->expression()->get();
- *outUpdated = true;
}
}
switch (expr->fKind) {
@@ -1011,6 +1027,9 @@
this->simplifyStatement(definitions, b, &iter, &undefinedVariables, &updated,
&needsRescan);
}
+ if (needsRescan) {
+ break;
+ }
this->addDefinitions(*iter, &definitions);
}
}