From 2880f9c2498c73edbae1659318d83fe0fff7ed5d Mon Sep 17 00:00:00 2001 From: YAMAMOTO Takashi Date: Wed, 13 Aug 2025 16:54:30 +0900 Subject: [PATCH] Make MaxCombinedBinarySize configurable Use case: I want to avoid generating "huge" (eg. 50KB) functions, which can involve certain kind of text relocations in aot-compiled binaries for my target. (WAMR, xtensa, l32r+jx target address) --- src/binaryen-c.cpp | 8 + src/binaryen-c.h | 8 + src/pass.h | 11 + src/passes/Inlining.cpp | 14 +- src/tools/optimization-options.h | 11 + test/lit/help/wasm-metadce.test | 3 + test/lit/help/wasm-opt.test | 3 + test/lit/help/wasm2js.test | 3 + .../lit/passes/inlining-max-combined-size.wat | 818 ++++++++++++++++++ 9 files changed, 868 insertions(+), 11 deletions(-) create mode 100644 test/lit/passes/inlining-max-combined-size.wat diff --git a/src/binaryen-c.cpp b/src/binaryen-c.cpp index d5f6fbc7e3c..a8f39c5abdc 100644 --- a/src/binaryen-c.cpp +++ b/src/binaryen-c.cpp @@ -5754,6 +5754,14 @@ void BinaryenSetFlexibleInlineMaxSize(BinaryenIndex size) { globalPassOptions.inlining.flexibleInlineMaxSize = size; } +BinaryenIndex BinaryenGetMaxCombinedBinarySize(void) { + return globalPassOptions.inlining.maxCombinedBinarySize; +} + +void BinaryenSetMaxCombinedBinarySize(BinaryenIndex size) { + globalPassOptions.inlining.maxCombinedBinarySize = size; +} + BinaryenIndex BinaryenGetOneCallerInlineMaxSize(void) { return globalPassOptions.inlining.oneCallerInlineMaxSize; } diff --git a/src/binaryen-c.h b/src/binaryen-c.h index 60e88d78b29..48f0a4ffc3a 100644 --- a/src/binaryen-c.h +++ b/src/binaryen-c.h @@ -3148,6 +3148,14 @@ BINARYEN_API BinaryenIndex BinaryenGetFlexibleInlineMaxSize(void); // Applies to all modules, globally. BINARYEN_API void BinaryenSetFlexibleInlineMaxSize(BinaryenIndex size); +// Gets the limit for the combined size of the code after inlining. +// Applies to all modules, globally. +BINARYEN_API BinaryenIndex BinaryenGetMaxCombinedBinarySize(void); + +// Sets the limit for the combined size of the code after inlining. +// Applies to all modules, globally. +BINARYEN_API void BinaryenSetMaxCombinedBinarySize(BinaryenIndex size); + // Gets the function size which we inline when there is only one caller. // Applies to all modules, globally. BINARYEN_API BinaryenIndex BinaryenGetOneCallerInlineMaxSize(void); diff --git a/src/pass.h b/src/pass.h index 0ebd7e6d6bd..e19af92743e 100644 --- a/src/pass.h +++ b/src/pass.h @@ -89,6 +89,17 @@ struct InliningOptions { // This is checked after alwaysInlineMaxSize and oneCallerInlineMaxSize, but // the order normally won't matter. Index flexibleInlineMaxSize = 20; + // The limit for the combined size of the code after inlining. + // We have an absolute limit in order to avoid extremely-large sizes after + // inlining, as they may hit limits in VMs and/or slow down startup + // (measurements there indicate something like ~1 second to optimize a 100K + // function). See e.g. + // https://github.com/WebAssembly/binaryen/pull/3730#issuecomment-867939138 + // https://github.com/emscripten-core/emscripten/issues/13899#issuecomment-825073344 + // The limit is arbitrary, but based on the links above. It is a very high + // value that should appear very rarely in practice (for example, it does + // not occur on the Emscripten benchmark suite of real-world codebases). + Index maxCombinedBinarySize = 400 * 1024; // Loops usually mean the function does heavy work, so the call overhead // is not significant and we do not inline such functions by default. bool allowFunctionsWithLoops = false; diff --git a/src/passes/Inlining.cpp b/src/passes/Inlining.cpp index a4ce4df556f..31e5fb1179d 100644 --- a/src/passes/Inlining.cpp +++ b/src/passes/Inlining.cpp @@ -1501,21 +1501,13 @@ struct Inlining : public Pass { } // Checks if the combined size of the code after inlining is under the - // absolute size limit. We have an absolute limit in order to avoid - // extremely-large sizes after inlining, as they may hit limits in VMs and/or - // slow down startup (measurements there indicate something like ~1 second to - // optimize a 100K function). See e.g. - // https://github.com/WebAssembly/binaryen/pull/3730#issuecomment-867939138 - // https://github.com/emscripten-core/emscripten/issues/13899#issuecomment-825073344 + // absolute size limit. bool isUnderSizeLimit(Name target, Name source) { // Estimate the combined binary size from the number of instructions. auto combinedSize = infos[target].size + infos[source].size; auto estimatedBinarySize = Measurer::BytesPerExpr * combinedSize; - // The limit is arbitrary, but based on the links above. It is a very high - // value that should appear very rarely in practice (for example, it does - // not occur on the Emscripten benchmark suite of real-world codebases). - const Index MaxCombinedBinarySize = 400 * 1024; - return estimatedBinarySize < MaxCombinedBinarySize; + auto& options = getPassRunner()->options; + return estimatedBinarySize < options.inlining.maxCombinedBinarySize; } }; diff --git a/src/tools/optimization-options.h b/src/tools/optimization-options.h index 333380d0490..bc1ac4a1478 100644 --- a/src/tools/optimization-options.h +++ b/src/tools/optimization-options.h @@ -246,6 +246,17 @@ struct OptimizationOptions : public ToolOptions { passOptions.inlining.oneCallerInlineMaxSize = static_cast(atoi(argument.c_str())); }) + .add("--inline-max-combined-binary-size", + "-imcbs", + "Max size of combined functions after inlining. " + "Default: " + + std::to_string(InliningOptions().maxCombinedBinarySize), + OptimizationOptionsCategory, + Options::Arguments::One, + [this](Options* o, const std::string& argument) { + passOptions.inlining.maxCombinedBinarySize = + static_cast(atoi(argument.c_str())); + }) .add("--inline-functions-with-loops", "-ifwl", "Allow inlining functions with loops", diff --git a/test/lit/help/wasm-metadce.test b/test/lit/help/wasm-metadce.test index 4c727bcbd1f..4250e103b2c 100644 --- a/test/lit/help/wasm-metadce.test +++ b/test/lit/help/wasm-metadce.test @@ -634,6 +634,9 @@ ;; CHECK-NEXT: caller (default -1, which means ;; CHECK-NEXT: all such functions are inlined) ;; CHECK-NEXT: +;; CHECK-NEXT: --inline-max-combined-binary-size,-imcbs Max size of combined functions +;; CHECK-NEXT: after inlining. Default: 409600 +;; CHECK-NEXT: ;; CHECK-NEXT: --inline-functions-with-loops,-ifwl Allow inlining functions with ;; CHECK-NEXT: loops ;; CHECK-NEXT: diff --git a/test/lit/help/wasm-opt.test b/test/lit/help/wasm-opt.test index a0d8d199f94..44fa78a951e 100644 --- a/test/lit/help/wasm-opt.test +++ b/test/lit/help/wasm-opt.test @@ -658,6 +658,9 @@ ;; CHECK-NEXT: caller (default -1, which means ;; CHECK-NEXT: all such functions are inlined) ;; CHECK-NEXT: +;; CHECK-NEXT: --inline-max-combined-binary-size,-imcbs Max size of combined functions +;; CHECK-NEXT: after inlining. Default: 409600 +;; CHECK-NEXT: ;; CHECK-NEXT: --inline-functions-with-loops,-ifwl Allow inlining functions with ;; CHECK-NEXT: loops ;; CHECK-NEXT: diff --git a/test/lit/help/wasm2js.test b/test/lit/help/wasm2js.test index 881e18950e7..87ccf921822 100644 --- a/test/lit/help/wasm2js.test +++ b/test/lit/help/wasm2js.test @@ -598,6 +598,9 @@ ;; CHECK-NEXT: caller (default -1, which means ;; CHECK-NEXT: all such functions are inlined) ;; CHECK-NEXT: +;; CHECK-NEXT: --inline-max-combined-binary-size,-imcbs Max size of combined functions +;; CHECK-NEXT: after inlining. Default: 409600 +;; CHECK-NEXT: ;; CHECK-NEXT: --inline-functions-with-loops,-ifwl Allow inlining functions with ;; CHECK-NEXT: loops ;; CHECK-NEXT: diff --git a/test/lit/passes/inlining-max-combined-size.wat b/test/lit/passes/inlining-max-combined-size.wat new file mode 100644 index 00000000000..dcd6488cf32 --- /dev/null +++ b/test/lit/passes/inlining-max-combined-size.wat @@ -0,0 +1,818 @@ +;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. + +;; Test --inline-max-combined-binary-size option suppresses inlining. + +;; The expected behavior: +;; +;; for $main, +;; DEFAULT and IMCBS96 inline call-bar and call-foo. +;; IMCBS90 and IMCBS0 don't inline them because inlining would make +;; the (inliner's estimate of) size of $main exceed the specified limit. +;; +;; for $small-main, +;; DEFAULT, IMCBS96, and IMCBS90 inline call-foo. +;; IMCBS0 doesn't inline it. + +;; RUN: foreach %s %t wasm-opt -O3 -S -o - | filecheck %s --check-prefix=DEFAULT +;; RUN: foreach %s %t wasm-opt -O3 --inline-max-combined-binary-size=96 -S -o - | filecheck %s --check-prefix=IMCBS96 +;; RUN: foreach %s %t wasm-opt -O3 --inline-max-combined-binary-size=90 -S -o - | filecheck %s --check-prefix=IMCBS90 +;; RUN: foreach %s %t wasm-opt -O3 --inline-max-combined-binary-size=0 -S -o - | filecheck %s --check-prefix=IMCBS0 + +(module + ;; DEFAULT: (type $0 (func (param i32 i32 i32))) + ;; IMCBS96: (type $0 (func (param i32 i32 i32))) + ;; IMCBS90: (type $1 (func)) + + ;; IMCBS90: (type $0 (func (param i32 i32 i32))) + ;; IMCBS0: (type $1 (func)) + + ;; IMCBS0: (type $0 (func (param i32 i32 i32))) + (type $0 (func (param i32 i32 i32))) + + ;; DEFAULT: (type $1 (func)) + ;; IMCBS96: (type $1 (func)) + (type $1 (func)) + + (type $2 (func)) + + ;; DEFAULT: (import "env" "foo" (func $imported-foo (param i32 i32 i32))) + ;; IMCBS96: (import "env" "foo" (func $imported-foo (param i32 i32 i32))) + ;; IMCBS90: (import "env" "foo" (func $imported-foo (param i32 i32 i32))) + ;; IMCBS0: (import "env" "foo" (func $imported-foo (param i32 i32 i32))) + (import "env" "foo" (func $imported-foo (type $0) (param i32 i32 i32))) + + ;; DEFAULT: (import "env" "bar" (func $imported-bar (param i32 i32 i32))) + ;; IMCBS96: (import "env" "bar" (func $imported-bar (param i32 i32 i32))) + ;; IMCBS90: (import "env" "bar" (func $imported-bar (param i32 i32 i32))) + ;; IMCBS0: (import "env" "bar" (func $imported-bar (param i32 i32 i32))) + (import "env" "bar" (func $imported-bar (type $0) (param i32 i32 i32))) + + ;; DEFAULT: (export "main" (func $main)) + ;; IMCBS96: (export "main" (func $main)) + ;; IMCBS90: (export "main" (func $main)) + ;; IMCBS0: (export "main" (func $main)) + (export "main" (func $main)) + + ;; DEFAULT: (export "small-main" (func $small-main)) + ;; IMCBS96: (export "small-main" (func $small-main)) + ;; IMCBS90: (export "small-main" (func $small-main)) + ;; IMCBS0: (export "small-main" (func $small-main)) + (export "small-main" (func $small-main)) + + ;; IMCBS90: (func $call-foo + ;; IMCBS90-NEXT: (call $imported-foo + ;; IMCBS90-NEXT: (i32.const 1) + ;; IMCBS90-NEXT: (i32.const 2) + ;; IMCBS90-NEXT: (i32.const 3) + ;; IMCBS90-NEXT: ) + ;; IMCBS90-NEXT: ) + ;; IMCBS0: (func $call-foo + ;; IMCBS0-NEXT: (call $imported-foo + ;; IMCBS0-NEXT: (i32.const 1) + ;; IMCBS0-NEXT: (i32.const 2) + ;; IMCBS0-NEXT: (i32.const 3) + ;; IMCBS0-NEXT: ) + ;; IMCBS0-NEXT: ) + (func $call-foo (type $1) + (call $imported-foo + (i32.const 1) + (i32.const 2) + (i32.const 3))) + + ;; IMCBS90: (func $call-bar + ;; IMCBS90-NEXT: (call $imported-bar + ;; IMCBS90-NEXT: (i32.const 1) + ;; IMCBS90-NEXT: (i32.const 2) + ;; IMCBS90-NEXT: (i32.const 3) + ;; IMCBS90-NEXT: ) + ;; IMCBS90-NEXT: ) + ;; IMCBS0: (func $call-bar + ;; IMCBS0-NEXT: (call $imported-bar + ;; IMCBS0-NEXT: (i32.const 1) + ;; IMCBS0-NEXT: (i32.const 2) + ;; IMCBS0-NEXT: (i32.const 3) + ;; IMCBS0-NEXT: ) + ;; IMCBS0-NEXT: ) + (func $call-bar (type $1) + (call $imported-bar + (i32.const 1) + (i32.const 2) + (i32.const 3))) + + ;; DEFAULT: (func $main + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-bar + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-bar + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-bar + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-bar + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-bar + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-bar + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-bar + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-bar + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-bar + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-bar + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-bar + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-bar + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-bar + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-bar + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-bar + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-bar + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: ) + ;; IMCBS96: (func $main + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-bar + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-bar + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-bar + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-bar + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-bar + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-bar + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-bar + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-bar + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-bar + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-bar + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-bar + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-bar + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-bar + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-bar + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-bar + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-bar + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: ) + ;; IMCBS90: (func $main + ;; IMCBS90-NEXT: (call $call-foo) + ;; IMCBS90-NEXT: (call $call-foo) + ;; IMCBS90-NEXT: (call $call-foo) + ;; IMCBS90-NEXT: (call $call-foo) + ;; IMCBS90-NEXT: (call $call-foo) + ;; IMCBS90-NEXT: (call $call-foo) + ;; IMCBS90-NEXT: (call $call-foo) + ;; IMCBS90-NEXT: (call $call-foo) + ;; IMCBS90-NEXT: (call $call-foo) + ;; IMCBS90-NEXT: (call $call-foo) + ;; IMCBS90-NEXT: (call $call-foo) + ;; IMCBS90-NEXT: (call $call-foo) + ;; IMCBS90-NEXT: (call $call-foo) + ;; IMCBS90-NEXT: (call $call-foo) + ;; IMCBS90-NEXT: (call $call-foo) + ;; IMCBS90-NEXT: (call $call-foo) + ;; IMCBS90-NEXT: (call $call-bar) + ;; IMCBS90-NEXT: (call $call-bar) + ;; IMCBS90-NEXT: (call $call-bar) + ;; IMCBS90-NEXT: (call $call-bar) + ;; IMCBS90-NEXT: (call $call-bar) + ;; IMCBS90-NEXT: (call $call-bar) + ;; IMCBS90-NEXT: (call $call-bar) + ;; IMCBS90-NEXT: (call $call-bar) + ;; IMCBS90-NEXT: (call $call-bar) + ;; IMCBS90-NEXT: (call $call-bar) + ;; IMCBS90-NEXT: (call $call-bar) + ;; IMCBS90-NEXT: (call $call-bar) + ;; IMCBS90-NEXT: (call $call-bar) + ;; IMCBS90-NEXT: (call $call-bar) + ;; IMCBS90-NEXT: (call $call-bar) + ;; IMCBS90-NEXT: (call $call-bar) + ;; IMCBS90-NEXT: ) + ;; IMCBS0: (func $main + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-bar) + ;; IMCBS0-NEXT: (call $call-bar) + ;; IMCBS0-NEXT: (call $call-bar) + ;; IMCBS0-NEXT: (call $call-bar) + ;; IMCBS0-NEXT: (call $call-bar) + ;; IMCBS0-NEXT: (call $call-bar) + ;; IMCBS0-NEXT: (call $call-bar) + ;; IMCBS0-NEXT: (call $call-bar) + ;; IMCBS0-NEXT: (call $call-bar) + ;; IMCBS0-NEXT: (call $call-bar) + ;; IMCBS0-NEXT: (call $call-bar) + ;; IMCBS0-NEXT: (call $call-bar) + ;; IMCBS0-NEXT: (call $call-bar) + ;; IMCBS0-NEXT: (call $call-bar) + ;; IMCBS0-NEXT: (call $call-bar) + ;; IMCBS0-NEXT: (call $call-bar) + ;; IMCBS0-NEXT: ) + (func $main (type $2) + (call $call-foo) + (call $call-foo) + (call $call-foo) + (call $call-foo) + + (call $call-foo) + (call $call-foo) + (call $call-foo) + (call $call-foo) + + (call $call-foo) + (call $call-foo) + (call $call-foo) + (call $call-foo) + + (call $call-foo) + (call $call-foo) + (call $call-foo) + (call $call-foo) + + (call $call-bar) + (call $call-bar) + (call $call-bar) + (call $call-bar) + + (call $call-bar) + (call $call-bar) + (call $call-bar) + (call $call-bar) + + (call $call-bar) + (call $call-bar) + (call $call-bar) + (call $call-bar) + + (call $call-bar) + (call $call-bar) + (call $call-bar) + (call $call-bar)) + + ;; DEFAULT: (func $small-main + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: (call $imported-foo + ;; DEFAULT-NEXT: (i32.const 1) + ;; DEFAULT-NEXT: (i32.const 2) + ;; DEFAULT-NEXT: (i32.const 3) + ;; DEFAULT-NEXT: ) + ;; DEFAULT-NEXT: ) + ;; IMCBS96: (func $small-main + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: (call $imported-foo + ;; IMCBS96-NEXT: (i32.const 1) + ;; IMCBS96-NEXT: (i32.const 2) + ;; IMCBS96-NEXT: (i32.const 3) + ;; IMCBS96-NEXT: ) + ;; IMCBS96-NEXT: ) + ;; IMCBS90: (func $small-main + ;; IMCBS90-NEXT: (call $imported-foo + ;; IMCBS90-NEXT: (i32.const 1) + ;; IMCBS90-NEXT: (i32.const 2) + ;; IMCBS90-NEXT: (i32.const 3) + ;; IMCBS90-NEXT: ) + ;; IMCBS90-NEXT: (call $imported-foo + ;; IMCBS90-NEXT: (i32.const 1) + ;; IMCBS90-NEXT: (i32.const 2) + ;; IMCBS90-NEXT: (i32.const 3) + ;; IMCBS90-NEXT: ) + ;; IMCBS90-NEXT: (call $imported-foo + ;; IMCBS90-NEXT: (i32.const 1) + ;; IMCBS90-NEXT: (i32.const 2) + ;; IMCBS90-NEXT: (i32.const 3) + ;; IMCBS90-NEXT: ) + ;; IMCBS90-NEXT: (call $imported-foo + ;; IMCBS90-NEXT: (i32.const 1) + ;; IMCBS90-NEXT: (i32.const 2) + ;; IMCBS90-NEXT: (i32.const 3) + ;; IMCBS90-NEXT: ) + ;; IMCBS90-NEXT: (call $imported-foo + ;; IMCBS90-NEXT: (i32.const 1) + ;; IMCBS90-NEXT: (i32.const 2) + ;; IMCBS90-NEXT: (i32.const 3) + ;; IMCBS90-NEXT: ) + ;; IMCBS90-NEXT: (call $imported-foo + ;; IMCBS90-NEXT: (i32.const 1) + ;; IMCBS90-NEXT: (i32.const 2) + ;; IMCBS90-NEXT: (i32.const 3) + ;; IMCBS90-NEXT: ) + ;; IMCBS90-NEXT: (call $imported-foo + ;; IMCBS90-NEXT: (i32.const 1) + ;; IMCBS90-NEXT: (i32.const 2) + ;; IMCBS90-NEXT: (i32.const 3) + ;; IMCBS90-NEXT: ) + ;; IMCBS90-NEXT: (call $imported-foo + ;; IMCBS90-NEXT: (i32.const 1) + ;; IMCBS90-NEXT: (i32.const 2) + ;; IMCBS90-NEXT: (i32.const 3) + ;; IMCBS90-NEXT: ) + ;; IMCBS90-NEXT: (call $imported-foo + ;; IMCBS90-NEXT: (i32.const 1) + ;; IMCBS90-NEXT: (i32.const 2) + ;; IMCBS90-NEXT: (i32.const 3) + ;; IMCBS90-NEXT: ) + ;; IMCBS90-NEXT: (call $imported-foo + ;; IMCBS90-NEXT: (i32.const 1) + ;; IMCBS90-NEXT: (i32.const 2) + ;; IMCBS90-NEXT: (i32.const 3) + ;; IMCBS90-NEXT: ) + ;; IMCBS90-NEXT: (call $imported-foo + ;; IMCBS90-NEXT: (i32.const 1) + ;; IMCBS90-NEXT: (i32.const 2) + ;; IMCBS90-NEXT: (i32.const 3) + ;; IMCBS90-NEXT: ) + ;; IMCBS90-NEXT: (call $imported-foo + ;; IMCBS90-NEXT: (i32.const 1) + ;; IMCBS90-NEXT: (i32.const 2) + ;; IMCBS90-NEXT: (i32.const 3) + ;; IMCBS90-NEXT: ) + ;; IMCBS90-NEXT: (call $imported-foo + ;; IMCBS90-NEXT: (i32.const 1) + ;; IMCBS90-NEXT: (i32.const 2) + ;; IMCBS90-NEXT: (i32.const 3) + ;; IMCBS90-NEXT: ) + ;; IMCBS90-NEXT: (call $imported-foo + ;; IMCBS90-NEXT: (i32.const 1) + ;; IMCBS90-NEXT: (i32.const 2) + ;; IMCBS90-NEXT: (i32.const 3) + ;; IMCBS90-NEXT: ) + ;; IMCBS90-NEXT: (call $imported-foo + ;; IMCBS90-NEXT: (i32.const 1) + ;; IMCBS90-NEXT: (i32.const 2) + ;; IMCBS90-NEXT: (i32.const 3) + ;; IMCBS90-NEXT: ) + ;; IMCBS90-NEXT: (call $imported-foo + ;; IMCBS90-NEXT: (i32.const 1) + ;; IMCBS90-NEXT: (i32.const 2) + ;; IMCBS90-NEXT: (i32.const 3) + ;; IMCBS90-NEXT: ) + ;; IMCBS90-NEXT: ) + ;; IMCBS0: (func $small-main + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: (call $call-foo) + ;; IMCBS0-NEXT: ) + (func $small-main (type $2) + (call $call-foo) + (call $call-foo) + (call $call-foo) + (call $call-foo) + + (call $call-foo) + (call $call-foo) + (call $call-foo) + (call $call-foo) + + (call $call-foo) + (call $call-foo) + (call $call-foo) + (call $call-foo) + + (call $call-foo) + (call $call-foo) + (call $call-foo) + (call $call-foo)))