Prevent no-op statements in GLSL code generator.
This eliminates a handful of useless statements. They were harmless, but
presumably this saves optimization work for the GLSL compiler.
(Patterned after http://review.skia.org/496377 )
Change-Id: Ibe135750488a9917b982dcac67f22b3765412ee1
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/496599
Auto-Submit: John Stiles <johnstiles@google.com>
Reviewed-by: Ethan Nicholas <ethannicholas@google.com>
Commit-Queue: John Stiles <johnstiles@google.com>
diff --git a/src/sksl/codegen/SkSLGLSLCodeGenerator.cpp b/src/sksl/codegen/SkSLGLSLCodeGenerator.cpp
index f74c682..dc6c9fe 100644
--- a/src/sksl/codegen/SkSLGLSLCodeGenerator.cpp
+++ b/src/sksl/codegen/SkSLGLSLCodeGenerator.cpp
@@ -1225,8 +1225,7 @@
this->writeBlock(s.as<Block>());
break;
case Statement::Kind::kExpression:
- this->writeExpression(*s.as<ExpressionStatement>().expression(), Precedence::kTopLevel);
- this->write(";");
+ this->writeExpressionStatement(s.as<ExpressionStatement>());
break;
case Statement::Kind::kReturn:
this->writeReturnStatement(s.as<ReturnStatement>());
@@ -1384,6 +1383,13 @@
this->write("}");
}
+void GLSLCodeGenerator::writeExpressionStatement(const ExpressionStatement& s) {
+ if (s.expression()->hasSideEffects()) {
+ this->writeExpression(*s.expression(), Precedence::kTopLevel);
+ this->write(";");
+ }
+}
+
void GLSLCodeGenerator::writeSwitchStatement(const SwitchStatement& s) {
if (this->caps().rewriteSwitchStatements()) {
String fallthroughVar = "_tmpSwitchFallthrough" + to_string(fVarCount++);
diff --git a/src/sksl/codegen/SkSLGLSLCodeGenerator.h b/src/sksl/codegen/SkSLGLSLCodeGenerator.h
index ff70019..9c7b0d3 100644
--- a/src/sksl/codegen/SkSLGLSLCodeGenerator.h
+++ b/src/sksl/codegen/SkSLGLSLCodeGenerator.h
@@ -21,6 +21,7 @@
class ConstructorDiagonalMatrix;
class ConstructorScalarCast;
class DoStatement;
+class ExpressionStatement;
class Extension;
class FieldAccess;
class ForStatement;
@@ -159,6 +160,8 @@
void writeDoStatement(const DoStatement& d);
+ void writeExpressionStatement(const ExpressionStatement& s);
+
virtual void writeSwitchStatement(const SwitchStatement& s);
virtual void writeReturnStatement(const ReturnStatement& r);
diff --git a/tests/sksl/inliner/ExponentialGrowth.glsl b/tests/sksl/inliner/ExponentialGrowth.glsl
index 4c8b3c6..3d20a6b 100644
--- a/tests/sksl/inliner/ExponentialGrowth.glsl
+++ b/tests/sksl/inliner/ExponentialGrowth.glsl
@@ -82,7 +82,6 @@
sk_FragColor.x = 0.0;
sk_FragColor.x = 0.0;
sk_FragColor.x = 0.0;
- false;
sk_FragColor.x = 0.0;
sk_FragColor.x = 0.0;
sk_FragColor.x = 0.0;
@@ -164,7 +163,6 @@
sk_FragColor.x = 0.0;
sk_FragColor.x = 0.0;
sk_FragColor.x = 0.0;
- false;
sk_FragColor.x = 0.0;
sk_FragColor.x = 0.0;
sk_FragColor.x = 0.0;
@@ -246,7 +244,6 @@
sk_FragColor.x = 0.0;
sk_FragColor.x = 0.0;
sk_FragColor.x = 0.0;
- false;
}
void fn7_v() {
sk_FragColor.x = 0.0;
@@ -492,7 +489,6 @@
sk_FragColor.x = 0.0;
sk_FragColor.x = 0.0;
sk_FragColor.x = 0.0;
- false;
fn6_v();
fn6_v();
}
diff --git a/tests/sksl/inliner/ExponentialGrowthStandaloneSettings.glsl b/tests/sksl/inliner/ExponentialGrowthStandaloneSettings.glsl
index 4c8b3c6..3d20a6b 100644
--- a/tests/sksl/inliner/ExponentialGrowthStandaloneSettings.glsl
+++ b/tests/sksl/inliner/ExponentialGrowthStandaloneSettings.glsl
@@ -82,7 +82,6 @@
sk_FragColor.x = 0.0;
sk_FragColor.x = 0.0;
sk_FragColor.x = 0.0;
- false;
sk_FragColor.x = 0.0;
sk_FragColor.x = 0.0;
sk_FragColor.x = 0.0;
@@ -164,7 +163,6 @@
sk_FragColor.x = 0.0;
sk_FragColor.x = 0.0;
sk_FragColor.x = 0.0;
- false;
sk_FragColor.x = 0.0;
sk_FragColor.x = 0.0;
sk_FragColor.x = 0.0;
@@ -246,7 +244,6 @@
sk_FragColor.x = 0.0;
sk_FragColor.x = 0.0;
sk_FragColor.x = 0.0;
- false;
}
void fn7_v() {
sk_FragColor.x = 0.0;
@@ -492,7 +489,6 @@
sk_FragColor.x = 0.0;
sk_FragColor.x = 0.0;
sk_FragColor.x = 0.0;
- false;
fn6_v();
fn6_v();
}
diff --git a/tests/sksl/inliner/InlineWithInoutArgument.glsl b/tests/sksl/inliner/InlineWithInoutArgument.glsl
index 1ff57f7..b46a216 100644
--- a/tests/sksl/inliner/InlineWithInoutArgument.glsl
+++ b/tests/sksl/inliner/InlineWithInoutArgument.glsl
@@ -19,8 +19,5 @@
outParameterWriteIndirect_vh4(c);
inoutParameterWrite_vh4(c);
inoutParameterWriteIndirect_vh4(c);
- false;
- false;
- false;
return c;
}
diff --git a/tests/sksl/inliner/InlineWithNestedCalls.glsl b/tests/sksl/inliner/InlineWithNestedCalls.glsl
index 1a2d895..e117769 100644
--- a/tests/sksl/inliner/InlineWithNestedCalls.glsl
+++ b/tests/sksl/inliner/InlineWithNestedCalls.glsl
@@ -40,6 +40,5 @@
--_3_x;
_3_x = 42.0;
_2_y = _3_x;
- _2_y;
sk_FragColor.x = z;
}
diff --git a/tests/sksl/inliner/Ossfuzz37994.glsl b/tests/sksl/inliner/Ossfuzz37994.glsl
index 57eaa4e..694be60 100644
--- a/tests/sksl/inliner/Ossfuzz37994.glsl
+++ b/tests/sksl/inliner/Ossfuzz37994.glsl
@@ -4,6 +4,5 @@
vec4 main() {
vec2 _0_x = vec2(2.0);
_0_x = vec2(0.70710676908493042, 0.70710676908493042);
- _0_x;
return colorGreen;
}
diff --git a/tests/sksl/shared/Ossfuzz26167.glsl b/tests/sksl/shared/Ossfuzz26167.glsl
index 041b24b..2933520 100644
--- a/tests/sksl/shared/Ossfuzz26167.glsl
+++ b/tests/sksl/shared/Ossfuzz26167.glsl
@@ -1,4 +1,3 @@
void main() {
- false;
}
diff --git a/tests/sksl/shared/Ossfuzz28904.glsl b/tests/sksl/shared/Ossfuzz28904.glsl
index b48b713..604f63c 100644
--- a/tests/sksl/shared/Ossfuzz28904.glsl
+++ b/tests/sksl/shared/Ossfuzz28904.glsl
@@ -1,6 +1,5 @@
out vec4 sk_FragColor;
void main() {
- false;
sk_FragColor = vec4(0.0);
}
diff --git a/tests/sksl/shared/Ossfuzz29494.glsl b/tests/sksl/shared/Ossfuzz29494.glsl
index b48b713..604f63c 100644
--- a/tests/sksl/shared/Ossfuzz29494.glsl
+++ b/tests/sksl/shared/Ossfuzz29494.glsl
@@ -1,6 +1,5 @@
out vec4 sk_FragColor;
void main() {
- false;
sk_FragColor = vec4(0.0);
}
diff --git a/tests/sksl/shared/ReturnsValueOnEveryPathES2.glsl b/tests/sksl/shared/ReturnsValueOnEveryPathES2.glsl
index 457662e..45bcff1 100644
--- a/tests/sksl/shared/ReturnsValueOnEveryPathES2.glsl
+++ b/tests/sksl/shared/ReturnsValueOnEveryPathES2.glsl
@@ -13,7 +13,6 @@
}
bool after_for_body_b() {
for (int x = 0;x <= 10; ++x) {
- true;
}
return true;
}