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;
 }