diff --git a/src/gpu/effects/GrCircleBlurFragmentProcessor.fp b/src/gpu/effects/GrCircleBlurFragmentProcessor.fp
index e333eb5..11076ca 100644
--- a/src/gpu/effects/GrCircleBlurFragmentProcessor.fp
+++ b/src/gpu/effects/GrCircleBlurFragmentProcessor.fp
@@ -295,13 +295,13 @@
     }
 }
 
-void main() {
+half4 main() {
     // We just want to compute "(length(vec) - circleData.z + 0.5) * circleData.w" but need to
     // rearrange to avoid passing large values to length() that would overflow.
     half2 vec = half2((sk_FragCoord.xy - circleData.xy) * circleData.w);
     half dist = length(vec) + (0.5 - circleData.z) * circleData.w;
     half4 inputColor = sample(inputFP);
-    sk_OutColor = inputColor * sample(blurProfile, half2(dist, 0.5)).a;
+    return inputColor * sample(blurProfile, half2(dist, 0.5)).a;
 }
 
 @test(testData) {
diff --git a/src/gpu/effects/GrCircleEffect.fp b/src/gpu/effects/GrCircleEffect.fp
index bca5998..b4d1ca9 100644
--- a/src/gpu/effects/GrCircleEffect.fp
+++ b/src/gpu/effects/GrCircleEffect.fp
@@ -51,7 +51,7 @@
     }
 }
 
-void main() {
+half4 main() {
     // TODO: Right now the distance to circle calculation is performed in a space normalized to the
     // radius and then denormalized. This is to mitigate overflow on devices that don't have full
     // float.
@@ -65,9 +65,9 @@
     half4 inputColor = sample(inputFP);
     @if (edgeType == GrClipEdgeType::kFillAA ||
          edgeType == GrClipEdgeType::kInverseFillAA) {
-        sk_OutColor = inputColor * saturate(d);
+        return inputColor * saturate(d);
     } else {
-        sk_OutColor = d > 0.5 ? inputColor : half4(0);
+        return d > 0.5 ? inputColor : half4(0);
     }
 }
 
diff --git a/src/gpu/effects/GrClampFragmentProcessor.fp b/src/gpu/effects/GrClampFragmentProcessor.fp
index 5b93066..3c4b936 100644
--- a/src/gpu/effects/GrClampFragmentProcessor.fp
+++ b/src/gpu/effects/GrClampFragmentProcessor.fp
@@ -14,13 +14,13 @@
      kPreservesOpaqueInput_OptimizationFlag)
 }
 
-void main() {
+half4 main() {
     half4 inputColor = sample(inputFP);
     @if (clampToPremul) {
         half alpha = saturate(inputColor.a);
-        sk_OutColor = half4(clamp(inputColor.rgb, 0, alpha), alpha);
+        return half4(clamp(inputColor.rgb, 0, alpha), alpha);
     } else {
-        sk_OutColor = saturate(inputColor);
+        return saturate(inputColor);
     }
 }
 
diff --git a/src/gpu/effects/GrDitherEffect.fp b/src/gpu/effects/GrDitherEffect.fp
index bce636d..bbf295f 100644
--- a/src/gpu/effects/GrDitherEffect.fp
+++ b/src/gpu/effects/GrDitherEffect.fp
@@ -10,7 +10,7 @@
 // Larger values increase the strength of the dithering effect.
 in uniform half range;
 
-void main() {
+half4 main() {
     half4 color = sample(inputFP);
     half value;
     @if (sk_Caps.integerSupport)
@@ -43,7 +43,7 @@
     }
     // For each color channel, add the random offset to the channel value and then clamp
     // between 0 and alpha to keep the color premultiplied.
-    sk_OutColor = half4(clamp(color.rgb + value * range, 0.0, color.a), color.a);
+    return half4(clamp(color.rgb + value * range, 0.0, color.a), color.a);
 }
 
 @optimizationFlags {
diff --git a/src/gpu/effects/GrYUVtoRGBEffect.cpp b/src/gpu/effects/GrYUVtoRGBEffect.cpp
index 07b9406..29aa91b 100644
--- a/src/gpu/effects/GrYUVtoRGBEffect.cpp
+++ b/src/gpu/effects/GrYUVtoRGBEffect.cpp
@@ -252,7 +252,7 @@
                 // premultiply alpha
                 fragBuilder->codeAppendf("color.rgb *= color.a;");
             }
-            fragBuilder->codeAppendf("%s = color;", args.fOutputColor);
+            fragBuilder->codeAppendf("return color;");
         }
 
     private:
diff --git a/src/gpu/effects/GrYUVtoRGBEffect.h b/src/gpu/effects/GrYUVtoRGBEffect.h
index 6078033..31bba47 100644
--- a/src/gpu/effects/GrYUVtoRGBEffect.h
+++ b/src/gpu/effects/GrYUVtoRGBEffect.h
@@ -26,6 +26,7 @@
     std::unique_ptr<GrFragmentProcessor> clone() const override;
 
     const char* name() const override { return "YUVtoRGBEffect"; }
+    bool usesExplicitReturn() const override { return true; }
 
 private:
     GrYUVtoRGBEffect(std::unique_ptr<GrFragmentProcessor> planeFPs[4],
diff --git a/src/gpu/effects/generated/GrCircleBlurFragmentProcessor.cpp b/src/gpu/effects/generated/GrCircleBlurFragmentProcessor.cpp
index 2b1ac09..1a0d3e6 100644
--- a/src/gpu/effects/generated/GrCircleBlurFragmentProcessor.cpp
+++ b/src/gpu/effects/generated/GrCircleBlurFragmentProcessor.cpp
@@ -307,18 +307,18 @@
                 args.fUniformHandler->getUniformCStr(circleDataVar),
                 args.fUniformHandler->getUniformCStr(circleDataVar),
                 args.fUniformHandler->getUniformCStr(circleDataVar));
-        SkString _sample13763 = this->invokeChild(0, args);
+        SkString _sample13764 = this->invokeChild(0, args);
         fragBuilder->codeAppendf(
                 R"SkSL(
 half4 inputColor = %s;)SkSL",
-                _sample13763.c_str());
-        SkString _coords13811("float2(half2(dist, 0.5))");
-        SkString _sample13811 = this->invokeChild(1, args, _coords13811.c_str());
+                _sample13764.c_str());
+        SkString _coords13805("float2(half2(dist, 0.5))");
+        SkString _sample13805 = this->invokeChild(1, args, _coords13805.c_str());
         fragBuilder->codeAppendf(
                 R"SkSL(
-%s = inputColor * %s.w;
+return inputColor * %s.w;
 )SkSL",
-                args.fOutputColor, _sample13811.c_str());
+                _sample13805.c_str());
     }
 
 private:
@@ -352,7 +352,7 @@
     if (textureRadius != that.textureRadius) return false;
     return true;
 }
-bool GrCircleBlurFragmentProcessor::usesExplicitReturn() const { return false; }
+bool GrCircleBlurFragmentProcessor::usesExplicitReturn() const { return true; }
 GrCircleBlurFragmentProcessor::GrCircleBlurFragmentProcessor(
         const GrCircleBlurFragmentProcessor& src)
         : INHERITED(kGrCircleBlurFragmentProcessor_ClassID, src.optimizationFlags())
diff --git a/src/gpu/effects/generated/GrCircleEffect.cpp b/src/gpu/effects/generated/GrCircleEffect.cpp
index d1a9391..b8c8ba1 100644
--- a/src/gpu/effects/generated/GrCircleEffect.cpp
+++ b/src/gpu/effects/generated/GrCircleEffect.cpp
@@ -49,18 +49,17 @@
                 args.fUniformHandler->getUniformCStr(circleVar),
                 args.fUniformHandler->getUniformCStr(circleVar),
                 args.fUniformHandler->getUniformCStr(circleVar));
-        SkString _sample2509 = this->invokeChild(0, args);
+        SkString _sample2510 = this->invokeChild(0, args);
         fragBuilder->codeAppendf(
                 R"SkSL(
 half4 inputColor = %s;
 @if (%d == 1 || %d == 3) {
-    %s = inputColor * clamp(d, 0.0, 1.0);
+    return inputColor * clamp(d, 0.0, 1.0);
 } else {
-    %s = d > 0.5 ? inputColor : half4(0.0);
+    return d > 0.5 ? inputColor : half4(0.0);
 }
 )SkSL",
-                _sample2509.c_str(), (int)_outer.edgeType, (int)_outer.edgeType, args.fOutputColor,
-                args.fOutputColor);
+                _sample2510.c_str(), (int)_outer.edgeType, (int)_outer.edgeType);
     }
 
 private:
@@ -111,7 +110,7 @@
     if (radius != that.radius) return false;
     return true;
 }
-bool GrCircleEffect::usesExplicitReturn() const { return false; }
+bool GrCircleEffect::usesExplicitReturn() const { return true; }
 GrCircleEffect::GrCircleEffect(const GrCircleEffect& src)
         : INHERITED(kGrCircleEffect_ClassID, src.optimizationFlags())
         , edgeType(src.edgeType)
diff --git a/src/gpu/effects/generated/GrClampFragmentProcessor.cpp b/src/gpu/effects/generated/GrClampFragmentProcessor.cpp
index e963276..4c2eb16 100644
--- a/src/gpu/effects/generated/GrClampFragmentProcessor.cpp
+++ b/src/gpu/effects/generated/GrClampFragmentProcessor.cpp
@@ -26,18 +26,17 @@
         (void)_outer;
         auto clampToPremul = _outer.clampToPremul;
         (void)clampToPremul;
-        SkString _sample464 = this->invokeChild(0, args);
+        SkString _sample465 = this->invokeChild(0, args);
         fragBuilder->codeAppendf(
                 R"SkSL(half4 inputColor = %s;
 @if (%s) {
     half alpha = clamp(inputColor.w, 0.0, 1.0);
-    %s = half4(clamp(inputColor.xyz, 0.0, alpha), alpha);
+    return half4(clamp(inputColor.xyz, 0.0, alpha), alpha);
 } else {
-    %s = clamp(inputColor, 0.0, 1.0);
+    return clamp(inputColor, 0.0, 1.0);
 }
 )SkSL",
-                _sample464.c_str(), (_outer.clampToPremul ? "true" : "false"), args.fOutputColor,
-                args.fOutputColor);
+                _sample465.c_str(), (_outer.clampToPremul ? "true" : "false"));
     }
 
 private:
@@ -57,7 +56,7 @@
     if (clampToPremul != that.clampToPremul) return false;
     return true;
 }
-bool GrClampFragmentProcessor::usesExplicitReturn() const { return false; }
+bool GrClampFragmentProcessor::usesExplicitReturn() const { return true; }
 GrClampFragmentProcessor::GrClampFragmentProcessor(const GrClampFragmentProcessor& src)
         : INHERITED(kGrClampFragmentProcessor_ClassID, src.optimizationFlags())
         , clampToPremul(src.clampToPremul) {
diff --git a/src/gpu/effects/generated/GrDitherEffect.cpp b/src/gpu/effects/generated/GrDitherEffect.cpp
index 878bb51..0c5afde 100644
--- a/src/gpu/effects/generated/GrDitherEffect.cpp
+++ b/src/gpu/effects/generated/GrDitherEffect.cpp
@@ -28,7 +28,7 @@
         (void)range;
         rangeVar = args.fUniformHandler->addUniform(&_outer, kFragment_GrShaderFlag, kHalf_GrSLType,
                                                     "range");
-        SkString _sample302 = this->invokeChild(0, args);
+        SkString _sample303 = this->invokeChild(0, args);
         fragBuilder->codeAppendf(
                 R"SkSL(half4 color = %s;
 half value;
@@ -43,10 +43,9 @@
     bits.xz = abs(bits.xz - bits.yw);
     value = dot(bits, half4(0.5, 0.25, 0.125, 0.0625)) - 0.46875;
 }
-%s = half4(clamp(color.xyz + value * %s, 0.0, color.w), color.w);
+return half4(clamp(color.xyz + value * %s, 0.0, color.w), color.w);
 )SkSL",
-                _sample302.c_str(), args.fOutputColor,
-                args.fUniformHandler->getUniformCStr(rangeVar));
+                _sample303.c_str(), args.fUniformHandler->getUniformCStr(rangeVar));
     }
 
 private:
@@ -68,7 +67,7 @@
     if (range != that.range) return false;
     return true;
 }
-bool GrDitherEffect::usesExplicitReturn() const { return false; }
+bool GrDitherEffect::usesExplicitReturn() const { return true; }
 GrDitherEffect::GrDitherEffect(const GrDitherEffect& src)
         : INHERITED(kGrDitherEffect_ClassID, src.optimizationFlags()), range(src.range) {
     this->cloneAndRegisterAllChildProcessors(src);
diff --git a/src/gpu/gradients/GrClampedGradientEffect.fp b/src/gpu/gradients/GrClampedGradientEffect.fp
index 57dc65a..2e9a513 100644
--- a/src/gpu/gradients/GrClampedGradientEffect.fp
+++ b/src/gpu/gradients/GrClampedGradientEffect.fp
@@ -24,27 +24,29 @@
 // Trust the creator that this matches the color spec of the gradient
 in bool colorsAreOpaque;
 
-void main() {
+half4 main() {
     half4 t = sample(gradLayout);
+    half4 outColor;
+
     // If t.x is below 0, use the left border color without invoking the child processor. If any t.x
     // is above 1, use the right border color. Otherwise, t is in the [0, 1] range assumed by the
     // colorizer FP, so delegate to the child processor.
     if (!gradLayout.preservesOpaqueInput && t.y < 0) {
         // layout has rejected this fragment (rely on sksl to remove this branch if the layout FP
         // preserves opacity is false)
-        sk_OutColor = half4(0);
+        outColor = half4(0);
     } else if (t.x < 0) {
-        sk_OutColor = leftBorderColor;
+        outColor = leftBorderColor;
     } else if (t.x > 1.0) {
-        sk_OutColor = rightBorderColor;
+        outColor = rightBorderColor;
     } else {
         // Always sample from (x, 0), discarding y, since the layout FP can use y as a side-channel.
-        sk_OutColor = sample(colorizer, t.x0);
+        outColor = sample(colorizer, t.x0);
     }
-
     @if (makePremul) {
-        sk_OutColor.xyz *= sk_OutColor.w;
+        outColor.rgb *= outColor.a;
     }
+    return outColor;
 }
 
 //////////////////////////////////////////////////////////////////////////////
diff --git a/src/gpu/gradients/GrTiledGradientEffect.fp b/src/gpu/gradients/GrTiledGradientEffect.fp
index 370f48a..30b94ff 100644
--- a/src/gpu/gradients/GrTiledGradientEffect.fp
+++ b/src/gpu/gradients/GrTiledGradientEffect.fp
@@ -15,13 +15,13 @@
 // Trust the creator that this matches the color spec of the gradient
 in bool colorsAreOpaque;
 
-void main() {
+half4 main() {
     half4 t = sample(gradLayout);
 
     if (!gradLayout.preservesOpaqueInput && t.y < 0) {
         // layout has rejected this fragment (rely on sksl to remove this branch if the layout FP
         // preserves opacity is false)
-        sk_OutColor = half4(0);
+        return half4(0);
     } else {
         @if (mirror) {
             half t_1 = t.x - 1;
@@ -39,11 +39,12 @@
         }
 
         // Always sample from (x, 0), discarding y, since the layout FP can use y as a side-channel.
-        sk_OutColor = sample(colorizer, t.x0);
-    }
-
-    @if (makePremul) {
-        sk_OutColor.xyz *= sk_OutColor.w;
+        @if (!makePremul) {
+            return sample(colorizer, t.x0);
+        } else {
+            half4 outColor = sample(colorizer, t.x0);
+            return outColor * outColor.aaa1;
+        }
     }
 }
 
diff --git a/src/gpu/gradients/generated/GrClampedGradientEffect.cpp b/src/gpu/gradients/generated/GrClampedGradientEffect.cpp
index 8320a71..bd3f4f6 100644
--- a/src/gpu/gradients/generated/GrClampedGradientEffect.cpp
+++ b/src/gpu/gradients/generated/GrClampedGradientEffect.cpp
@@ -36,33 +36,33 @@
                                                               kHalf4_GrSLType, "leftBorderColor");
         rightBorderColorVar = args.fUniformHandler->addUniform(&_outer, kFragment_GrShaderFlag,
                                                                kHalf4_GrSLType, "rightBorderColor");
-        SkString _sample1102 = this->invokeChild(1, args);
+        SkString _sample1103 = this->invokeChild(1, args);
         fragBuilder->codeAppendf(
                 R"SkSL(half4 t = %s;
+half4 outColor;
 if (!%s && t.y < 0.0) {
-    %s = half4(0.0);
+    outColor = half4(0.0);
 } else if (t.x < 0.0) {
-    %s = %s;
+    outColor = %s;
 } else if (t.x > 1.0) {
-    %s = %s;
+    outColor = %s;
 } else {)SkSL",
-                _sample1102.c_str(),
+                _sample1103.c_str(),
                 (_outer.childProcessor(1)->preservesOpaqueInput() ? "true" : "false"),
-                args.fOutputColor, args.fOutputColor,
-                args.fUniformHandler->getUniformCStr(leftBorderColorVar), args.fOutputColor,
+                args.fUniformHandler->getUniformCStr(leftBorderColorVar),
                 args.fUniformHandler->getUniformCStr(rightBorderColorVar));
-        SkString _coords1871("float2(half2(t.x, 0.0))");
-        SkString _sample1871 = this->invokeChild(0, args, _coords1871.c_str());
+        SkString _coords1881("float2(half2(t.x, 0.0))");
+        SkString _sample1881 = this->invokeChild(0, args, _coords1881.c_str());
         fragBuilder->codeAppendf(
                 R"SkSL(
-    %s = %s;
+    outColor = %s;
 }
 @if (%s) {
-    %s.xyz *= %s.w;
+    outColor.xyz *= outColor.w;
 }
+return outColor;
 )SkSL",
-                args.fOutputColor, _sample1871.c_str(), (_outer.makePremul ? "true" : "false"),
-                args.fOutputColor, args.fOutputColor);
+                _sample1881.c_str(), (_outer.makePremul ? "true" : "false"));
     }
 
 private:
@@ -103,7 +103,7 @@
     if (colorsAreOpaque != that.colorsAreOpaque) return false;
     return true;
 }
-bool GrClampedGradientEffect::usesExplicitReturn() const { return false; }
+bool GrClampedGradientEffect::usesExplicitReturn() const { return true; }
 GrClampedGradientEffect::GrClampedGradientEffect(const GrClampedGradientEffect& src)
         : INHERITED(kGrClampedGradientEffect_ClassID, src.optimizationFlags())
         , leftBorderColor(src.leftBorderColor)
diff --git a/src/gpu/gradients/generated/GrTiledGradientEffect.cpp b/src/gpu/gradients/generated/GrTiledGradientEffect.cpp
index 2a8315e..10fee8c 100644
--- a/src/gpu/gradients/generated/GrTiledGradientEffect.cpp
+++ b/src/gpu/gradients/generated/GrTiledGradientEffect.cpp
@@ -30,11 +30,11 @@
         (void)makePremul;
         auto colorsAreOpaque = _outer.colorsAreOpaque;
         (void)colorsAreOpaque;
-        SkString _sample453 = this->invokeChild(1, args);
+        SkString _sample454 = this->invokeChild(1, args);
         fragBuilder->codeAppendf(
                 R"SkSL(half4 t = %s;
 if (!%s && t.y < 0.0) {
-    %s = half4(0.0);
+    return half4(0.0);
 } else {
     @if (%s) {
         half t_1 = t.x - 1.0;
@@ -45,22 +45,28 @@
         t.x = abs(tiled_t);
     } else {
         t.x = fract(t.x);
-    })SkSL",
-                _sample453.c_str(),
+    }
+    @if (!%s) {)SkSL",
+                _sample454.c_str(),
                 (_outer.childProcessor(1)->preservesOpaqueInput() ? "true" : "false"),
-                args.fOutputColor, (_outer.mirror ? "true" : "false"));
-        SkString _coords1451("float2(half2(t.x, 0.0))");
-        SkString _sample1451 = this->invokeChild(0, args, _coords1451.c_str());
+                (_outer.mirror ? "true" : "false"), (_outer.makePremul ? "true" : "false"));
+        SkString _coords1470("float2(half2(t.x, 0.0))");
+        SkString _sample1470 = this->invokeChild(0, args, _coords1470.c_str());
         fragBuilder->codeAppendf(
                 R"SkSL(
-    %s = %s;
-}
-@if (%s) {
-    %s.xyz *= %s.w;
+        return %s;
+    } else {)SkSL",
+                _sample1470.c_str());
+        SkString _coords1541("float2(half2(t.x, 0.0))");
+        SkString _sample1541 = this->invokeChild(0, args, _coords1541.c_str());
+        fragBuilder->codeAppendf(
+                R"SkSL(
+        half4 outColor = %s;
+        return outColor * half4(outColor.www, 1.0);
+    }
 }
 )SkSL",
-                args.fOutputColor, _sample1451.c_str(), (_outer.makePremul ? "true" : "false"),
-                args.fOutputColor, args.fOutputColor);
+                _sample1541.c_str());
     }
 
 private:
@@ -83,7 +89,7 @@
     if (colorsAreOpaque != that.colorsAreOpaque) return false;
     return true;
 }
-bool GrTiledGradientEffect::usesExplicitReturn() const { return false; }
+bool GrTiledGradientEffect::usesExplicitReturn() const { return true; }
 GrTiledGradientEffect::GrTiledGradientEffect(const GrTiledGradientEffect& src)
         : INHERITED(kGrTiledGradientEffect_ClassID, src.optimizationFlags())
         , mirror(src.mirror)
