Stop the inliner after it has inlined 2500 statements in a program.

This prevents OOMing when given a pathological input, but is large
enough that almost all inputs should continue to compile as-is.

Change-Id: If5c46711b886ee08495bfd09af537e9dc7ea5649
Bug: skia:10945, oss-fuzz:27442
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/334838
Commit-Queue: John Stiles <johnstiles@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
Auto-Submit: John Stiles <johnstiles@google.com>
diff --git a/gn/sksl_tests.gni b/gn/sksl_tests.gni
index 38fc561..d0176c0 100644
--- a/gn/sksl_tests.gni
+++ b/gn/sksl_tests.gni
@@ -257,7 +257,6 @@
 sksl_inliner_tests = [
   "$_tests/sksl/inliner/DoWhileBodyMustBeInlinedIntoAScope.sksl",
   "$_tests/sksl/inliner/DoWhileTestCannotBeInlined.sksl",
-  "$_tests/sksl/inliner/ExponentialGrowth.sksl",
   "$_tests/sksl/inliner/ForBodyMustBeInlinedIntoAScope.sksl",
   "$_tests/sksl/inliner/ForInitializerExpressionsCanBeInlined.sksl",
   "$_tests/sksl/inliner/ForWithReturnInsideCannotBeInlined.sksl",
@@ -323,6 +322,7 @@
 
 sksl_settings_tests = [
   "$_tests/sksl/glsl/TypePrecision.sksl",
+  "$_tests/sksl/inliner/ExponentialGrowth.sksl",
   "$_tests/sksl/inliner/InlinerCanBeDisabled.sksl",
   "$_tests/sksl/inliner/InlinerWrapsEarlyReturnsWithDoWhileBlock.sksl",
   "$_tests/sksl/shared/CrossIntrinsic.sksl",
diff --git a/src/sksl/SkSLInliner.cpp b/src/sksl/SkSLInliner.cpp
index a3d4b6c..8ad07f5 100644
--- a/src/sksl/SkSLInliner.cpp
+++ b/src/sksl/SkSLInliner.cpp
@@ -56,6 +56,8 @@
 namespace SkSL {
 namespace {
 
+static constexpr int kInlinedStatementLimit = 2500;
+
 static bool contains_returns_above_limit(const FunctionDefinition& funcDef, int limit) {
     class CountReturnsWithLimit : public ProgramVisitor {
     public:
@@ -310,6 +312,7 @@
     fSettings = settings;
     fCaps = caps;
     fInlineVarCounter = 0;
+    fInlinedStatementCounter = 0;
 }
 
 String Inliner::uniqueNameForInlineVar(const String& baseName, SymbolTable* symbolTable) {
@@ -465,6 +468,9 @@
         }
         return nullptr;
     };
+
+    ++fInlinedStatementCounter;
+
     switch (statement.kind()) {
         case Statement::Kind::kBlock: {
             const Block& b = statement.as<Block>();
@@ -760,6 +766,11 @@
         return false;
     }
 
+    // Enforce a limit on inlining to avoid pathological cases. (inliner/ExponentialGrowth.sksl)
+    if (fInlinedStatementCounter >= kInlinedStatementLimit) {
+        return false;
+    }
+
     if (functionDef == nullptr) {
         // Can't inline something if we don't actually have its definition.
         return false;
@@ -1148,6 +1159,11 @@
         return false;
     }
 
+    // Enforce a limit on inlining to avoid pathological cases. (inliner/ExponentialGrowth.sksl)
+    if (fInlinedStatementCounter >= kInlinedStatementLimit) {
+        return false;
+    }
+
     ProgramUsage* usage = program.fUsage.get();
     InlineCandidateList candidateList;
     this->buildCandidateList(program, &candidateList);
@@ -1200,6 +1216,11 @@
         *candidate.fCandidateExpr = std::move(inlinedCall.fReplacementExpr);
         madeChanges = true;
 
+        // Stop inlining if we've reached our hard cap on new statements.
+        if (fInlinedStatementCounter >= kInlinedStatementLimit) {
+            break;
+        }
+
         // Note that nothing was destroyed except for the FunctionCall. All other nodes should
         // remain valid.
     }
diff --git a/src/sksl/SkSLInliner.h b/src/sksl/SkSLInliner.h
index b12a470..a3a1707 100644
--- a/src/sksl/SkSLInliner.h
+++ b/src/sksl/SkSLInliner.h
@@ -95,6 +95,7 @@
     const Program::Settings* fSettings = nullptr;
     const ShaderCapsClass* fCaps = nullptr;
     int fInlineVarCounter = 0;
+    int fInlinedStatementCounter = 0;
 };
 
 }  // namespace SkSL
diff --git a/src/sksl/SkSLMain.cpp b/src/sksl/SkSLMain.cpp
index 918946a..5ee4d36 100644
--- a/src/sksl/SkSLMain.cpp
+++ b/src/sksl/SkSLMain.cpp
@@ -18,6 +18,7 @@
 #include "src/sksl/ir/SkSLUnresolvedFunction.h"
 
 #include <fstream>
+#include <limits.h>
 #include <stdarg.h>
 #include <stdio.h>
 
@@ -183,6 +184,9 @@
                 if (settingsText.consumeSuffix(" NoInline")) {
                     settings->fInlineThreshold = 0;
                 }
+                if (settingsText.consumeSuffix(" InlineThresholdMax")) {
+                    settings->fInlineThreshold = INT_MAX;
+                }
                 if (settingsText.consumeSuffix(" Sharpen")) {
                     settings->fSharpenTextures = true;
                 }
diff --git a/tests/sksl/inliner/ExponentialGrowth.sksl b/tests/sksl/inliner/ExponentialGrowth.sksl
index e2125f5..4b286bd 100644
--- a/tests/sksl/inliner/ExponentialGrowth.sksl
+++ b/tests/sksl/inliner/ExponentialGrowth.sksl
@@ -1,3 +1,5 @@
+/*#pragma settings InlineThresholdMax*/
+
 void fn1()  { sk_FragColor.x = 0; }
 void fn2()  { fn1(); fn1(); fn1(); }
 void fn3()  { fn2(); fn2(); fn2(); }
diff --git a/tests/sksl/inliner/golden/ExponentialGrowth.glsl b/tests/sksl/inliner/golden/ExponentialGrowth.glsl
index ae0703a..1fedf6b 100644
--- a/tests/sksl/inliner/golden/ExponentialGrowth.glsl
+++ b/tests/sksl/inliner/golden/ExponentialGrowth.glsl
@@ -1,84 +1,565 @@
 
 out vec4 sk_FragColor;
-void fn3() {
-    {
-        {
-            sk_FragColor.x = 0.0;
-        }
-
-
-        {
-            sk_FragColor.x = 0.0;
-        }
-
-
-        {
-            sk_FragColor.x = 0.0;
-        }
-
-
-    }
-
-
-    {
-        {
-            sk_FragColor.x = 0.0;
-        }
-
-
-        {
-            sk_FragColor.x = 0.0;
-        }
-
-
-        {
-            sk_FragColor.x = 0.0;
-        }
-
-
-    }
-
-
-    {
-        {
-            sk_FragColor.x = 0.0;
-        }
-
-
-        {
-            sk_FragColor.x = 0.0;
-        }
-
-
-        {
-            sk_FragColor.x = 0.0;
-        }
-
-
-    }
-
-
-}
 void fn6() {
     {
         {
-            fn3();
-            fn3();
-            fn3();
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
         }
 
 
         {
-            fn3();
-            fn3();
-            fn3();
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
         }
 
 
         {
-            fn3();
-            fn3();
-            fn3();
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
         }
 
 
@@ -87,23 +568,563 @@
 
     {
         {
-            fn3();
-            fn3();
-            fn3();
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
         }
 
 
         {
-            fn3();
-            fn3();
-            fn3();
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
         }
 
 
         {
-            fn3();
-            fn3();
-            fn3();
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
         }
 
 
@@ -112,23 +1133,563 @@
 
     {
         {
-            fn3();
-            fn3();
-            fn3();
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
         }
 
 
         {
-            fn3();
-            fn3();
-            fn3();
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
         }
 
 
         {
-            fn3();
-            fn3();
-            fn3();
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
+            {
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+                {
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                    {
+                        sk_FragColor.x = 0.0;
+                    }
+
+
+                }
+
+
+            }
+
+
         }
 
 
@@ -136,415 +1697,91 @@
 
 
 }
+void fn7() {
+    fn6();
+    fn6();
+    fn6();
+}
+void fn8() {
+    fn7();
+    fn7();
+    fn7();
+}
 void fn9() {
-    {
-        {
-            fn6();
-            fn6();
-            fn6();
-        }
-
-
-        {
-            fn6();
-            fn6();
-            fn6();
-        }
-
-
-        {
-            fn6();
-            fn6();
-            fn6();
-        }
-
-
-    }
-
-
-    {
-        {
-            fn6();
-            fn6();
-            fn6();
-        }
-
-
-        {
-            fn6();
-            fn6();
-            fn6();
-        }
-
-
-        {
-            fn6();
-            fn6();
-            fn6();
-        }
-
-
-    }
-
-
-    {
-        {
-            fn6();
-            fn6();
-            fn6();
-        }
-
-
-        {
-            fn6();
-            fn6();
-            fn6();
-        }
-
-
-        {
-            fn6();
-            fn6();
-            fn6();
-        }
-
-
-    }
-
-
+    fn8();
+    fn8();
+    fn8();
+}
+void fnA() {
+    fn9();
+    fn9();
+    fn9();
+}
+void fnB() {
+    fnA();
+    fnA();
+    fnA();
 }
 void fnC() {
-    {
-        {
-            fn9();
-            fn9();
-            fn9();
-        }
-
-
-        {
-            fn9();
-            fn9();
-            fn9();
-        }
-
-
-        {
-            fn9();
-            fn9();
-            fn9();
-        }
-
-
-    }
-
-
-    {
-        {
-            fn9();
-            fn9();
-            fn9();
-        }
-
-
-        {
-            fn9();
-            fn9();
-            fn9();
-        }
-
-
-        {
-            fn9();
-            fn9();
-            fn9();
-        }
-
-
-    }
-
-
-    {
-        {
-            fn9();
-            fn9();
-            fn9();
-        }
-
-
-        {
-            fn9();
-            fn9();
-            fn9();
-        }
-
-
-        {
-            fn9();
-            fn9();
-            fn9();
-        }
-
-
-    }
-
-
+    fnB();
+    fnB();
+    fnB();
+}
+void fnD() {
+    fnC();
+    fnC();
+    fnC();
+}
+void fnE() {
+    fnD();
+    fnD();
+    fnD();
 }
 void fnF() {
-    {
-        {
-            fnC();
-            fnC();
-            fnC();
-        }
-
-
-        {
-            fnC();
-            fnC();
-            fnC();
-        }
-
-
-        {
-            fnC();
-            fnC();
-            fnC();
-        }
-
-
-    }
-
-
-    {
-        {
-            fnC();
-            fnC();
-            fnC();
-        }
-
-
-        {
-            fnC();
-            fnC();
-            fnC();
-        }
-
-
-        {
-            fnC();
-            fnC();
-            fnC();
-        }
-
-
-    }
-
-
-    {
-        {
-            fnC();
-            fnC();
-            fnC();
-        }
-
-
-        {
-            fnC();
-            fnC();
-            fnC();
-        }
-
-
-        {
-            fnC();
-            fnC();
-            fnC();
-        }
-
-
-    }
-
-
+    fnE();
+    fnE();
+    fnE();
+}
+void fnG() {
+    fnF();
+    fnF();
+    fnF();
+}
+void fnH() {
+    fnG();
+    fnG();
+    fnG();
 }
 void fnI() {
-    {
-        {
-            fnF();
-            fnF();
-            fnF();
-        }
-
-
-        {
-            fnF();
-            fnF();
-            fnF();
-        }
-
-
-        {
-            fnF();
-            fnF();
-            fnF();
-        }
-
-
-    }
-
-
-    {
-        {
-            fnF();
-            fnF();
-            fnF();
-        }
-
-
-        {
-            fnF();
-            fnF();
-            fnF();
-        }
-
-
-        {
-            fnF();
-            fnF();
-            fnF();
-        }
-
-
-    }
-
-
-    {
-        {
-            fnF();
-            fnF();
-            fnF();
-        }
-
-
-        {
-            fnF();
-            fnF();
-            fnF();
-        }
-
-
-        {
-            fnF();
-            fnF();
-            fnF();
-        }
-
-
-    }
-
-
+    fnH();
+    fnH();
+    fnH();
+}
+void fnJ() {
+    fnI();
+    fnI();
+    fnI();
+}
+void fnK() {
+    fnJ();
+    fnJ();
+    fnJ();
 }
 void fnL() {
-    {
-        {
-            fnI();
-            fnI();
-            fnI();
-        }
-
-
-        {
-            fnI();
-            fnI();
-            fnI();
-        }
-
-
-        {
-            fnI();
-            fnI();
-            fnI();
-        }
-
-
-    }
-
-
-    {
-        {
-            fnI();
-            fnI();
-            fnI();
-        }
-
-
-        {
-            fnI();
-            fnI();
-            fnI();
-        }
-
-
-        {
-            fnI();
-            fnI();
-            fnI();
-        }
-
-
-    }
-
-
-    {
-        {
-            fnI();
-            fnI();
-            fnI();
-        }
-
-
-        {
-            fnI();
-            fnI();
-            fnI();
-        }
-
-
-        {
-            fnI();
-            fnI();
-            fnI();
-        }
-
-
-    }
-
-
+    fnK();
+    fnK();
+    fnK();
+}
+void fnM() {
+    fnL();
+    fnL();
+    fnL();
+}
+void fnN() {
+    fnM();
+    fnM();
+    fnM();
 }
 void main() {
-    {
-        {
-            fnL();
-            fnL();
-            fnL();
-        }
-
-
-        {
-            fnL();
-            fnL();
-            fnL();
-        }
-
-
-        {
-            fnL();
-            fnL();
-            fnL();
-        }
-
-
-    }
-
-
+    fnN();
 }
diff --git a/tests/sksl/inliner/golden/ExponentialGrowthStandaloneSettings.glsl b/tests/sksl/inliner/golden/ExponentialGrowthStandaloneSettings.glsl
new file mode 100644
index 0000000..ae0703a
--- /dev/null
+++ b/tests/sksl/inliner/golden/ExponentialGrowthStandaloneSettings.glsl
@@ -0,0 +1,550 @@
+
+out vec4 sk_FragColor;
+void fn3() {
+    {
+        {
+            sk_FragColor.x = 0.0;
+        }
+
+
+        {
+            sk_FragColor.x = 0.0;
+        }
+
+
+        {
+            sk_FragColor.x = 0.0;
+        }
+
+
+    }
+
+
+    {
+        {
+            sk_FragColor.x = 0.0;
+        }
+
+
+        {
+            sk_FragColor.x = 0.0;
+        }
+
+
+        {
+            sk_FragColor.x = 0.0;
+        }
+
+
+    }
+
+
+    {
+        {
+            sk_FragColor.x = 0.0;
+        }
+
+
+        {
+            sk_FragColor.x = 0.0;
+        }
+
+
+        {
+            sk_FragColor.x = 0.0;
+        }
+
+
+    }
+
+
+}
+void fn6() {
+    {
+        {
+            fn3();
+            fn3();
+            fn3();
+        }
+
+
+        {
+            fn3();
+            fn3();
+            fn3();
+        }
+
+
+        {
+            fn3();
+            fn3();
+            fn3();
+        }
+
+
+    }
+
+
+    {
+        {
+            fn3();
+            fn3();
+            fn3();
+        }
+
+
+        {
+            fn3();
+            fn3();
+            fn3();
+        }
+
+
+        {
+            fn3();
+            fn3();
+            fn3();
+        }
+
+
+    }
+
+
+    {
+        {
+            fn3();
+            fn3();
+            fn3();
+        }
+
+
+        {
+            fn3();
+            fn3();
+            fn3();
+        }
+
+
+        {
+            fn3();
+            fn3();
+            fn3();
+        }
+
+
+    }
+
+
+}
+void fn9() {
+    {
+        {
+            fn6();
+            fn6();
+            fn6();
+        }
+
+
+        {
+            fn6();
+            fn6();
+            fn6();
+        }
+
+
+        {
+            fn6();
+            fn6();
+            fn6();
+        }
+
+
+    }
+
+
+    {
+        {
+            fn6();
+            fn6();
+            fn6();
+        }
+
+
+        {
+            fn6();
+            fn6();
+            fn6();
+        }
+
+
+        {
+            fn6();
+            fn6();
+            fn6();
+        }
+
+
+    }
+
+
+    {
+        {
+            fn6();
+            fn6();
+            fn6();
+        }
+
+
+        {
+            fn6();
+            fn6();
+            fn6();
+        }
+
+
+        {
+            fn6();
+            fn6();
+            fn6();
+        }
+
+
+    }
+
+
+}
+void fnC() {
+    {
+        {
+            fn9();
+            fn9();
+            fn9();
+        }
+
+
+        {
+            fn9();
+            fn9();
+            fn9();
+        }
+
+
+        {
+            fn9();
+            fn9();
+            fn9();
+        }
+
+
+    }
+
+
+    {
+        {
+            fn9();
+            fn9();
+            fn9();
+        }
+
+
+        {
+            fn9();
+            fn9();
+            fn9();
+        }
+
+
+        {
+            fn9();
+            fn9();
+            fn9();
+        }
+
+
+    }
+
+
+    {
+        {
+            fn9();
+            fn9();
+            fn9();
+        }
+
+
+        {
+            fn9();
+            fn9();
+            fn9();
+        }
+
+
+        {
+            fn9();
+            fn9();
+            fn9();
+        }
+
+
+    }
+
+
+}
+void fnF() {
+    {
+        {
+            fnC();
+            fnC();
+            fnC();
+        }
+
+
+        {
+            fnC();
+            fnC();
+            fnC();
+        }
+
+
+        {
+            fnC();
+            fnC();
+            fnC();
+        }
+
+
+    }
+
+
+    {
+        {
+            fnC();
+            fnC();
+            fnC();
+        }
+
+
+        {
+            fnC();
+            fnC();
+            fnC();
+        }
+
+
+        {
+            fnC();
+            fnC();
+            fnC();
+        }
+
+
+    }
+
+
+    {
+        {
+            fnC();
+            fnC();
+            fnC();
+        }
+
+
+        {
+            fnC();
+            fnC();
+            fnC();
+        }
+
+
+        {
+            fnC();
+            fnC();
+            fnC();
+        }
+
+
+    }
+
+
+}
+void fnI() {
+    {
+        {
+            fnF();
+            fnF();
+            fnF();
+        }
+
+
+        {
+            fnF();
+            fnF();
+            fnF();
+        }
+
+
+        {
+            fnF();
+            fnF();
+            fnF();
+        }
+
+
+    }
+
+
+    {
+        {
+            fnF();
+            fnF();
+            fnF();
+        }
+
+
+        {
+            fnF();
+            fnF();
+            fnF();
+        }
+
+
+        {
+            fnF();
+            fnF();
+            fnF();
+        }
+
+
+    }
+
+
+    {
+        {
+            fnF();
+            fnF();
+            fnF();
+        }
+
+
+        {
+            fnF();
+            fnF();
+            fnF();
+        }
+
+
+        {
+            fnF();
+            fnF();
+            fnF();
+        }
+
+
+    }
+
+
+}
+void fnL() {
+    {
+        {
+            fnI();
+            fnI();
+            fnI();
+        }
+
+
+        {
+            fnI();
+            fnI();
+            fnI();
+        }
+
+
+        {
+            fnI();
+            fnI();
+            fnI();
+        }
+
+
+    }
+
+
+    {
+        {
+            fnI();
+            fnI();
+            fnI();
+        }
+
+
+        {
+            fnI();
+            fnI();
+            fnI();
+        }
+
+
+        {
+            fnI();
+            fnI();
+            fnI();
+        }
+
+
+    }
+
+
+    {
+        {
+            fnI();
+            fnI();
+            fnI();
+        }
+
+
+        {
+            fnI();
+            fnI();
+            fnI();
+        }
+
+
+        {
+            fnI();
+            fnI();
+            fnI();
+        }
+
+
+    }
+
+
+}
+void main() {
+    {
+        {
+            fnL();
+            fnL();
+            fnL();
+        }
+
+
+        {
+            fnL();
+            fnL();
+            fnL();
+        }
+
+
+        {
+            fnL();
+            fnL();
+            fnL();
+        }
+
+
+    }
+
+
+}