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();
+ }
+
+
+ }
+
+
+}