diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/lit/help/wasm-opt.test | 8 | ||||
-rw-r--r-- | test/lit/help/wasm2js.test | 8 | ||||
-rw-r--r-- | test/lit/passes/no-inline.wast | 925 |
3 files changed, 941 insertions, 0 deletions
diff --git a/test/lit/help/wasm-opt.test b/test/lit/help/wasm-opt.test index b18c312ff..a45096e39 100644 --- a/test/lit/help/wasm-opt.test +++ b/test/lit/help/wasm-opt.test @@ -297,6 +297,14 @@ ;; CHECK-NEXT: ;; CHECK-NEXT: --nm name list ;; CHECK-NEXT: +;; CHECK-NEXT: --no-full-inline mark functions as no-inline (for +;; CHECK-NEXT: full inlining only) +;; CHECK-NEXT: +;; CHECK-NEXT: --no-inline mark functions as no-inline +;; CHECK-NEXT: +;; CHECK-NEXT: --no-partial-inline mark functions as no-inline (for +;; CHECK-NEXT: partial inlining only) +;; CHECK-NEXT: ;; CHECK-NEXT: --once-reduction reduces calls to code that only ;; CHECK-NEXT: runs once ;; CHECK-NEXT: diff --git a/test/lit/help/wasm2js.test b/test/lit/help/wasm2js.test index 129374049..9303642be 100644 --- a/test/lit/help/wasm2js.test +++ b/test/lit/help/wasm2js.test @@ -256,6 +256,14 @@ ;; CHECK-NEXT: ;; CHECK-NEXT: --nm name list ;; CHECK-NEXT: +;; CHECK-NEXT: --no-full-inline mark functions as no-inline (for +;; CHECK-NEXT: full inlining only) +;; CHECK-NEXT: +;; CHECK-NEXT: --no-inline mark functions as no-inline +;; CHECK-NEXT: +;; CHECK-NEXT: --no-partial-inline mark functions as no-inline (for +;; CHECK-NEXT: partial inlining only) +;; CHECK-NEXT: ;; CHECK-NEXT: --once-reduction reduces calls to code that only ;; CHECK-NEXT: runs once ;; CHECK-NEXT: diff --git a/test/lit/passes/no-inline.wast b/test/lit/passes/no-inline.wast new file mode 100644 index 000000000..3321dc1ad --- /dev/null +++ b/test/lit/passes/no-inline.wast @@ -0,0 +1,925 @@ +;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. + +;; Enable both full and partial inlining, and show how we filter out functions +;; using --no-*-inline. The functions with "yes" in their names will always be +;; inlined, while the ones with "maybe" will be filtered out in some modes. + +;; RUN: foreach %s %t wasm-opt --inlining --optimize-level=3 --partial-inlining-ifs=1 -S -o - | filecheck %s --check-prefix YES_ALL +;; RUN: foreach %s %t wasm-opt --no-partial-inline=*maybe* --inlining --optimize-level=3 --partial-inlining-ifs=1 -S -o - | filecheck %s --check-prefix NO_PART +;; RUN: foreach %s %t wasm-opt --no-full-inline=*maybe* --inlining --optimize-level=3 --partial-inlining-ifs=1 -S -o - | filecheck %s --check-prefix NO_FULL +;; RUN: foreach %s %t wasm-opt --no-inline=*maybe* --inlining --optimize-level=3 --partial-inlining-ifs=1 -S -o - | filecheck %s --check-prefix NO_BOTH + +(module + ;; YES_ALL: (type $0 (func)) + + ;; YES_ALL: (type $1 (func (param i32))) + + ;; YES_ALL: (import "a" "b" (func $import)) + ;; NO_PART: (type $0 (func)) + + ;; NO_PART: (type $1 (func (param i32))) + + ;; NO_PART: (import "a" "b" (func $import)) + ;; NO_FULL: (type $0 (func)) + + ;; NO_FULL: (type $1 (func (param i32))) + + ;; NO_FULL: (import "a" "b" (func $import)) + ;; NO_BOTH: (type $0 (func)) + + ;; NO_BOTH: (type $1 (func (param i32))) + + ;; NO_BOTH: (import "a" "b" (func $import)) + (import "a" "b" (func $import)) + + (func $full-yes-inline (param $x i32) + (call $import) + ) + + ;; NO_FULL: (func $full-maybe-inline (param $x i32) + ;; NO_FULL-NEXT: (call $import) + ;; NO_FULL-NEXT: ) + ;; NO_BOTH: (func $full-maybe-inline (param $x i32) + ;; NO_BOTH-NEXT: (call $import) + ;; NO_BOTH-NEXT: ) + (func $full-maybe-inline (param $x i32) + (call $import) + ) + + (func $partial-yes-inline (param $x i32) + (if + (local.get $x) + (return) + ) + (loop $l + (call $import) + (br $l) + ) + ) + + ;; NO_PART: (func $partial-maybe-inline (param $x i32) + ;; NO_PART-NEXT: (if + ;; NO_PART-NEXT: (local.get $x) + ;; NO_PART-NEXT: (return) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (loop $l + ;; NO_PART-NEXT: (call $import) + ;; NO_PART-NEXT: (br $l) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: ) + ;; NO_BOTH: (func $partial-maybe-inline (param $x i32) + ;; NO_BOTH-NEXT: (if + ;; NO_BOTH-NEXT: (local.get $x) + ;; NO_BOTH-NEXT: (return) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: (loop $l + ;; NO_BOTH-NEXT: (call $import) + ;; NO_BOTH-NEXT: (br $l) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: ) + (func $partial-maybe-inline (param $x i32) + (if + (local.get $x) + (return) + ) + (loop $l + (call $import) + (br $l) + ) + ) + + ;; YES_ALL: (func $caller + ;; YES_ALL-NEXT: (local $0 i32) + ;; YES_ALL-NEXT: (local $1 i32) + ;; YES_ALL-NEXT: (local $2 i32) + ;; YES_ALL-NEXT: (local $3 i32) + ;; YES_ALL-NEXT: (block + ;; YES_ALL-NEXT: (block $__inlined_func$full-yes-inline + ;; YES_ALL-NEXT: (local.set $0 + ;; YES_ALL-NEXT: (i32.const 0) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (call $import) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (block + ;; YES_ALL-NEXT: (block $__inlined_func$full-maybe-inline$1 + ;; YES_ALL-NEXT: (local.set $1 + ;; YES_ALL-NEXT: (i32.const 1) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (call $import) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (block + ;; YES_ALL-NEXT: (block $__inlined_func$byn-split-inlineable-A$partial-yes-inline$2 + ;; YES_ALL-NEXT: (local.set $2 + ;; YES_ALL-NEXT: (i32.const 2) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (if + ;; YES_ALL-NEXT: (i32.eqz + ;; YES_ALL-NEXT: (local.get $2) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (call $byn-split-outlined-A$partial-yes-inline + ;; YES_ALL-NEXT: (local.get $2) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (block + ;; YES_ALL-NEXT: (block $__inlined_func$byn-split-inlineable-A$partial-maybe-inline$3 + ;; YES_ALL-NEXT: (local.set $3 + ;; YES_ALL-NEXT: (i32.const 3) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (if + ;; YES_ALL-NEXT: (i32.eqz + ;; YES_ALL-NEXT: (local.get $3) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (call $byn-split-outlined-A$partial-maybe-inline + ;; YES_ALL-NEXT: (local.get $3) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; NO_PART: (func $caller + ;; NO_PART-NEXT: (local $0 i32) + ;; NO_PART-NEXT: (local $1 i32) + ;; NO_PART-NEXT: (local $2 i32) + ;; NO_PART-NEXT: (block + ;; NO_PART-NEXT: (block $__inlined_func$full-yes-inline + ;; NO_PART-NEXT: (local.set $0 + ;; NO_PART-NEXT: (i32.const 0) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (call $import) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (block + ;; NO_PART-NEXT: (block $__inlined_func$full-maybe-inline$1 + ;; NO_PART-NEXT: (local.set $1 + ;; NO_PART-NEXT: (i32.const 1) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (call $import) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (block + ;; NO_PART-NEXT: (block $__inlined_func$byn-split-inlineable-A$partial-yes-inline$2 + ;; NO_PART-NEXT: (local.set $2 + ;; NO_PART-NEXT: (i32.const 2) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (if + ;; NO_PART-NEXT: (i32.eqz + ;; NO_PART-NEXT: (local.get $2) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (call $byn-split-outlined-A$partial-yes-inline + ;; NO_PART-NEXT: (local.get $2) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (call $partial-maybe-inline + ;; NO_PART-NEXT: (i32.const 3) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: ) + ;; NO_FULL: (func $caller + ;; NO_FULL-NEXT: (local $0 i32) + ;; NO_FULL-NEXT: (local $1 i32) + ;; NO_FULL-NEXT: (local $2 i32) + ;; NO_FULL-NEXT: (block + ;; NO_FULL-NEXT: (block $__inlined_func$full-yes-inline + ;; NO_FULL-NEXT: (local.set $0 + ;; NO_FULL-NEXT: (i32.const 0) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (call $import) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (call $full-maybe-inline + ;; NO_FULL-NEXT: (i32.const 1) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (block + ;; NO_FULL-NEXT: (block $__inlined_func$byn-split-inlineable-A$partial-yes-inline$1 + ;; NO_FULL-NEXT: (local.set $1 + ;; NO_FULL-NEXT: (i32.const 2) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (if + ;; NO_FULL-NEXT: (i32.eqz + ;; NO_FULL-NEXT: (local.get $1) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (call $byn-split-outlined-A$partial-yes-inline + ;; NO_FULL-NEXT: (local.get $1) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (block + ;; NO_FULL-NEXT: (block $__inlined_func$byn-split-inlineable-A$partial-maybe-inline$2 + ;; NO_FULL-NEXT: (local.set $2 + ;; NO_FULL-NEXT: (i32.const 3) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (if + ;; NO_FULL-NEXT: (i32.eqz + ;; NO_FULL-NEXT: (local.get $2) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (call $byn-split-outlined-A$partial-maybe-inline + ;; NO_FULL-NEXT: (local.get $2) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_BOTH: (func $caller + ;; NO_BOTH-NEXT: (local $0 i32) + ;; NO_BOTH-NEXT: (local $1 i32) + ;; NO_BOTH-NEXT: (block + ;; NO_BOTH-NEXT: (block $__inlined_func$full-yes-inline + ;; NO_BOTH-NEXT: (local.set $0 + ;; NO_BOTH-NEXT: (i32.const 0) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: (call $import) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: (call $full-maybe-inline + ;; NO_BOTH-NEXT: (i32.const 1) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: (block + ;; NO_BOTH-NEXT: (block $__inlined_func$byn-split-inlineable-A$partial-yes-inline$1 + ;; NO_BOTH-NEXT: (local.set $1 + ;; NO_BOTH-NEXT: (i32.const 2) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: (if + ;; NO_BOTH-NEXT: (i32.eqz + ;; NO_BOTH-NEXT: (local.get $1) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: (call $byn-split-outlined-A$partial-yes-inline + ;; NO_BOTH-NEXT: (local.get $1) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: (call $partial-maybe-inline + ;; NO_BOTH-NEXT: (i32.const 3) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: ) + (func $caller + (call $full-yes-inline + (i32.const 0) + ) + (call $full-maybe-inline + (i32.const 1) + ) + (call $partial-yes-inline + (i32.const 2) + ) + (call $partial-maybe-inline + (i32.const 3) + ) + ) + + ;; YES_ALL: (func $caller-2 + ;; YES_ALL-NEXT: (local $0 i32) + ;; YES_ALL-NEXT: (local $1 i32) + ;; YES_ALL-NEXT: (local $2 i32) + ;; YES_ALL-NEXT: (local $3 i32) + ;; YES_ALL-NEXT: (block + ;; YES_ALL-NEXT: (block $__inlined_func$full-yes-inline$4 + ;; YES_ALL-NEXT: (local.set $0 + ;; YES_ALL-NEXT: (i32.const 0) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (call $import) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (block + ;; YES_ALL-NEXT: (block $__inlined_func$full-maybe-inline$5 + ;; YES_ALL-NEXT: (local.set $1 + ;; YES_ALL-NEXT: (i32.const 1) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (call $import) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (block + ;; YES_ALL-NEXT: (block $__inlined_func$byn-split-inlineable-A$partial-yes-inline$6 + ;; YES_ALL-NEXT: (local.set $2 + ;; YES_ALL-NEXT: (i32.const 2) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (if + ;; YES_ALL-NEXT: (i32.eqz + ;; YES_ALL-NEXT: (local.get $2) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (call $byn-split-outlined-A$partial-yes-inline + ;; YES_ALL-NEXT: (local.get $2) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (block + ;; YES_ALL-NEXT: (block $__inlined_func$byn-split-inlineable-A$partial-maybe-inline$7 + ;; YES_ALL-NEXT: (local.set $3 + ;; YES_ALL-NEXT: (i32.const 3) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (if + ;; YES_ALL-NEXT: (i32.eqz + ;; YES_ALL-NEXT: (local.get $3) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (call $byn-split-outlined-A$partial-maybe-inline + ;; YES_ALL-NEXT: (local.get $3) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; NO_PART: (func $caller-2 + ;; NO_PART-NEXT: (local $0 i32) + ;; NO_PART-NEXT: (local $1 i32) + ;; NO_PART-NEXT: (local $2 i32) + ;; NO_PART-NEXT: (block + ;; NO_PART-NEXT: (block $__inlined_func$full-yes-inline$3 + ;; NO_PART-NEXT: (local.set $0 + ;; NO_PART-NEXT: (i32.const 0) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (call $import) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (block + ;; NO_PART-NEXT: (block $__inlined_func$full-maybe-inline$4 + ;; NO_PART-NEXT: (local.set $1 + ;; NO_PART-NEXT: (i32.const 1) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (call $import) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (block + ;; NO_PART-NEXT: (block $__inlined_func$byn-split-inlineable-A$partial-yes-inline$5 + ;; NO_PART-NEXT: (local.set $2 + ;; NO_PART-NEXT: (i32.const 2) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (if + ;; NO_PART-NEXT: (i32.eqz + ;; NO_PART-NEXT: (local.get $2) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (call $byn-split-outlined-A$partial-yes-inline + ;; NO_PART-NEXT: (local.get $2) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (call $partial-maybe-inline + ;; NO_PART-NEXT: (i32.const 3) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: ) + ;; NO_FULL: (func $caller-2 + ;; NO_FULL-NEXT: (local $0 i32) + ;; NO_FULL-NEXT: (local $1 i32) + ;; NO_FULL-NEXT: (local $2 i32) + ;; NO_FULL-NEXT: (block + ;; NO_FULL-NEXT: (block $__inlined_func$full-yes-inline$3 + ;; NO_FULL-NEXT: (local.set $0 + ;; NO_FULL-NEXT: (i32.const 0) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (call $import) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (call $full-maybe-inline + ;; NO_FULL-NEXT: (i32.const 1) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (block + ;; NO_FULL-NEXT: (block $__inlined_func$byn-split-inlineable-A$partial-yes-inline$4 + ;; NO_FULL-NEXT: (local.set $1 + ;; NO_FULL-NEXT: (i32.const 2) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (if + ;; NO_FULL-NEXT: (i32.eqz + ;; NO_FULL-NEXT: (local.get $1) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (call $byn-split-outlined-A$partial-yes-inline + ;; NO_FULL-NEXT: (local.get $1) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (block + ;; NO_FULL-NEXT: (block $__inlined_func$byn-split-inlineable-A$partial-maybe-inline$5 + ;; NO_FULL-NEXT: (local.set $2 + ;; NO_FULL-NEXT: (i32.const 3) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (if + ;; NO_FULL-NEXT: (i32.eqz + ;; NO_FULL-NEXT: (local.get $2) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (call $byn-split-outlined-A$partial-maybe-inline + ;; NO_FULL-NEXT: (local.get $2) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_BOTH: (func $caller-2 + ;; NO_BOTH-NEXT: (local $0 i32) + ;; NO_BOTH-NEXT: (local $1 i32) + ;; NO_BOTH-NEXT: (block + ;; NO_BOTH-NEXT: (block $__inlined_func$full-yes-inline$2 + ;; NO_BOTH-NEXT: (local.set $0 + ;; NO_BOTH-NEXT: (i32.const 0) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: (call $import) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: (call $full-maybe-inline + ;; NO_BOTH-NEXT: (i32.const 1) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: (block + ;; NO_BOTH-NEXT: (block $__inlined_func$byn-split-inlineable-A$partial-yes-inline$3 + ;; NO_BOTH-NEXT: (local.set $1 + ;; NO_BOTH-NEXT: (i32.const 2) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: (if + ;; NO_BOTH-NEXT: (i32.eqz + ;; NO_BOTH-NEXT: (local.get $1) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: (call $byn-split-outlined-A$partial-yes-inline + ;; NO_BOTH-NEXT: (local.get $1) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: (call $partial-maybe-inline + ;; NO_BOTH-NEXT: (i32.const 3) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: ) + (func $caller-2 + ;; Same as $caller, to prevent the functions from having a single use (which + ;; is always inlined). + (call $full-yes-inline + (i32.const 0) + ) + (call $full-maybe-inline + (i32.const 1) + ) + (call $partial-yes-inline + (i32.const 2) + ) + (call $partial-maybe-inline + (i32.const 3) + ) + ) +) + +;; YES_ALL: (func $byn-split-outlined-A$partial-yes-inline (param $x i32) +;; YES_ALL-NEXT: (loop $l +;; YES_ALL-NEXT: (call $import) +;; YES_ALL-NEXT: (br $l) +;; YES_ALL-NEXT: ) +;; YES_ALL-NEXT: ) + +;; YES_ALL: (func $byn-split-outlined-A$partial-maybe-inline (param $x i32) +;; YES_ALL-NEXT: (loop $l +;; YES_ALL-NEXT: (call $import) +;; YES_ALL-NEXT: (br $l) +;; YES_ALL-NEXT: ) +;; YES_ALL-NEXT: ) + +;; NO_PART: (func $byn-split-outlined-A$partial-yes-inline (param $x i32) +;; NO_PART-NEXT: (loop $l +;; NO_PART-NEXT: (call $import) +;; NO_PART-NEXT: (br $l) +;; NO_PART-NEXT: ) +;; NO_PART-NEXT: ) + +;; NO_FULL: (func $byn-split-outlined-A$partial-yes-inline (param $x i32) +;; NO_FULL-NEXT: (loop $l +;; NO_FULL-NEXT: (call $import) +;; NO_FULL-NEXT: (br $l) +;; NO_FULL-NEXT: ) +;; NO_FULL-NEXT: ) + +;; NO_FULL: (func $byn-split-outlined-A$partial-maybe-inline (param $x i32) +;; NO_FULL-NEXT: (loop $l +;; NO_FULL-NEXT: (call $import) +;; NO_FULL-NEXT: (br $l) +;; NO_FULL-NEXT: ) +;; NO_FULL-NEXT: ) + +;; NO_BOTH: (func $byn-split-outlined-A$partial-yes-inline (param $x i32) +;; NO_BOTH-NEXT: (loop $l +;; NO_BOTH-NEXT: (call $import) +;; NO_BOTH-NEXT: (br $l) +;; NO_BOTH-NEXT: ) +;; NO_BOTH-NEXT: ) +(module + ;; YES_ALL: (type $0 (func)) + + ;; YES_ALL: (import "out" "func" (func $import)) + ;; NO_PART: (type $0 (func)) + + ;; NO_PART: (type $1 (func (param i32))) + + ;; NO_PART: (import "out" "func" (func $import)) + ;; NO_FULL: (type $0 (func)) + + ;; NO_FULL: (import "out" "func" (func $import)) + ;; NO_BOTH: (type $0 (func)) + + ;; NO_BOTH: (type $1 (func (param i32))) + + ;; NO_BOTH: (import "out" "func" (func $import)) + (import "out" "func" (func $import)) + + ;; NO_PART: (func $maybe-partial-or-full-1 (param $x i32) + ;; NO_PART-NEXT: (if + ;; NO_PART-NEXT: (local.get $x) + ;; NO_PART-NEXT: (call $import) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: ) + ;; NO_BOTH: (func $maybe-partial-or-full-1 (param $x i32) + ;; NO_BOTH-NEXT: (if + ;; NO_BOTH-NEXT: (local.get $x) + ;; NO_BOTH-NEXT: (call $import) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: ) + (func $maybe-partial-or-full-1 (param $x i32) + ;; This function can be partially inlined, but after doing so we want to + ;; inline the remainder as well, so instead we fully inline it. When full + ;; inlining is disabled but partial inlining is enabled, we should only + ;; partially inline it. + (if + (local.get $x) + (call $import) + ) + ) + + ;; NO_PART: (func $maybe-partial-or-full-2 (param $x i32) + ;; NO_PART-NEXT: (if + ;; NO_PART-NEXT: (local.get $x) + ;; NO_PART-NEXT: (return) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (nop) + ;; NO_PART-NEXT: (drop + ;; NO_PART-NEXT: (i32.const 0) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (drop + ;; NO_PART-NEXT: (i32.const 0) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (drop + ;; NO_PART-NEXT: (i32.const 0) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (drop + ;; NO_PART-NEXT: (i32.const 0) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (drop + ;; NO_PART-NEXT: (i32.const 0) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (drop + ;; NO_PART-NEXT: (i32.const 0) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (drop + ;; NO_PART-NEXT: (i32.const 0) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (drop + ;; NO_PART-NEXT: (i32.const 0) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: ) + ;; NO_BOTH: (func $maybe-partial-or-full-2 (param $x i32) + ;; NO_BOTH-NEXT: (if + ;; NO_BOTH-NEXT: (local.get $x) + ;; NO_BOTH-NEXT: (return) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: (nop) + ;; NO_BOTH-NEXT: (drop + ;; NO_BOTH-NEXT: (i32.const 0) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: (drop + ;; NO_BOTH-NEXT: (i32.const 0) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: (drop + ;; NO_BOTH-NEXT: (i32.const 0) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: (drop + ;; NO_BOTH-NEXT: (i32.const 0) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: (drop + ;; NO_BOTH-NEXT: (i32.const 0) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: (drop + ;; NO_BOTH-NEXT: (i32.const 0) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: (drop + ;; NO_BOTH-NEXT: (i32.const 0) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: (drop + ;; NO_BOTH-NEXT: (i32.const 0) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: ) + (func $maybe-partial-or-full-2 (param $x i32) + ;; As above, but for another form of partial inlining. Here we need to add + ;; some extra things to the function size for partial inlining to kick in. + (if + (local.get $x) + (return) + ) + (nop) + (drop + (i32.const 0) + ) + (drop + (i32.const 0) + ) + (drop + (i32.const 0) + ) + (drop + (i32.const 0) + ) + (drop + (i32.const 0) + ) + (drop + (i32.const 0) + ) + (drop + (i32.const 0) + ) + (drop + (i32.const 0) + ) + ) + + ;; YES_ALL: (func $caller + ;; YES_ALL-NEXT: (local $0 i32) + ;; YES_ALL-NEXT: (local $1 i32) + ;; YES_ALL-NEXT: (local $2 i32) + ;; YES_ALL-NEXT: (local $3 i32) + ;; YES_ALL-NEXT: (block + ;; YES_ALL-NEXT: (block $__inlined_func$maybe-partial-or-full-1 + ;; YES_ALL-NEXT: (local.set $0 + ;; YES_ALL-NEXT: (i32.const 0) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (if + ;; YES_ALL-NEXT: (local.get $0) + ;; YES_ALL-NEXT: (call $import) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (block + ;; YES_ALL-NEXT: (block $__inlined_func$maybe-partial-or-full-1$1 + ;; YES_ALL-NEXT: (local.set $1 + ;; YES_ALL-NEXT: (i32.const 1) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (if + ;; YES_ALL-NEXT: (local.get $1) + ;; YES_ALL-NEXT: (call $import) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (block + ;; YES_ALL-NEXT: (block $__inlined_func$maybe-partial-or-full-2$2 + ;; YES_ALL-NEXT: (local.set $2 + ;; YES_ALL-NEXT: (i32.const 0) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (block + ;; YES_ALL-NEXT: (if + ;; YES_ALL-NEXT: (local.get $2) + ;; YES_ALL-NEXT: (br $__inlined_func$maybe-partial-or-full-2$2) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (nop) + ;; YES_ALL-NEXT: (drop + ;; YES_ALL-NEXT: (i32.const 0) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (drop + ;; YES_ALL-NEXT: (i32.const 0) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (drop + ;; YES_ALL-NEXT: (i32.const 0) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (drop + ;; YES_ALL-NEXT: (i32.const 0) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (drop + ;; YES_ALL-NEXT: (i32.const 0) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (drop + ;; YES_ALL-NEXT: (i32.const 0) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (drop + ;; YES_ALL-NEXT: (i32.const 0) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (drop + ;; YES_ALL-NEXT: (i32.const 0) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (block + ;; YES_ALL-NEXT: (block $__inlined_func$maybe-partial-or-full-2$3 + ;; YES_ALL-NEXT: (local.set $3 + ;; YES_ALL-NEXT: (i32.const 1) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (block + ;; YES_ALL-NEXT: (if + ;; YES_ALL-NEXT: (local.get $3) + ;; YES_ALL-NEXT: (br $__inlined_func$maybe-partial-or-full-2$3) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (nop) + ;; YES_ALL-NEXT: (drop + ;; YES_ALL-NEXT: (i32.const 0) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (drop + ;; YES_ALL-NEXT: (i32.const 0) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (drop + ;; YES_ALL-NEXT: (i32.const 0) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (drop + ;; YES_ALL-NEXT: (i32.const 0) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (drop + ;; YES_ALL-NEXT: (i32.const 0) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (drop + ;; YES_ALL-NEXT: (i32.const 0) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (drop + ;; YES_ALL-NEXT: (i32.const 0) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: (drop + ;; YES_ALL-NEXT: (i32.const 0) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; YES_ALL-NEXT: ) + ;; NO_PART: (func $caller + ;; NO_PART-NEXT: (call $maybe-partial-or-full-1 + ;; NO_PART-NEXT: (i32.const 0) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (call $maybe-partial-or-full-1 + ;; NO_PART-NEXT: (i32.const 1) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (call $maybe-partial-or-full-2 + ;; NO_PART-NEXT: (i32.const 0) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: (call $maybe-partial-or-full-2 + ;; NO_PART-NEXT: (i32.const 1) + ;; NO_PART-NEXT: ) + ;; NO_PART-NEXT: ) + ;; NO_FULL: (func $caller + ;; NO_FULL-NEXT: (local $0 i32) + ;; NO_FULL-NEXT: (local $1 i32) + ;; NO_FULL-NEXT: (local $2 i32) + ;; NO_FULL-NEXT: (local $3 i32) + ;; NO_FULL-NEXT: (local $4 i32) + ;; NO_FULL-NEXT: (local $5 i32) + ;; NO_FULL-NEXT: (local $6 i32) + ;; NO_FULL-NEXT: (local $7 i32) + ;; NO_FULL-NEXT: (block + ;; NO_FULL-NEXT: (block $__inlined_func$byn-split-inlineable-B$maybe-partial-or-full-1 + ;; NO_FULL-NEXT: (local.set $0 + ;; NO_FULL-NEXT: (i32.const 0) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (if + ;; NO_FULL-NEXT: (local.get $0) + ;; NO_FULL-NEXT: (block $__inlined_func$byn-split-outlined-B$maybe-partial-or-full-1$4 + ;; NO_FULL-NEXT: (local.set $4 + ;; NO_FULL-NEXT: (local.get $0) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (call $import) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (block + ;; NO_FULL-NEXT: (block $__inlined_func$byn-split-inlineable-B$maybe-partial-or-full-1$1 + ;; NO_FULL-NEXT: (local.set $1 + ;; NO_FULL-NEXT: (i32.const 1) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (if + ;; NO_FULL-NEXT: (local.get $1) + ;; NO_FULL-NEXT: (block $__inlined_func$byn-split-outlined-B$maybe-partial-or-full-1$5 + ;; NO_FULL-NEXT: (local.set $5 + ;; NO_FULL-NEXT: (local.get $1) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (call $import) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (block + ;; NO_FULL-NEXT: (block $__inlined_func$byn-split-inlineable-A$maybe-partial-or-full-2$2 + ;; NO_FULL-NEXT: (local.set $2 + ;; NO_FULL-NEXT: (i32.const 0) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (if + ;; NO_FULL-NEXT: (i32.eqz + ;; NO_FULL-NEXT: (local.get $2) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (block $__inlined_func$byn-split-outlined-A$maybe-partial-or-full-2$6 + ;; NO_FULL-NEXT: (local.set $6 + ;; NO_FULL-NEXT: (local.get $2) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (block + ;; NO_FULL-NEXT: (nop) + ;; NO_FULL-NEXT: (drop + ;; NO_FULL-NEXT: (i32.const 0) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (drop + ;; NO_FULL-NEXT: (i32.const 0) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (drop + ;; NO_FULL-NEXT: (i32.const 0) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (drop + ;; NO_FULL-NEXT: (i32.const 0) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (drop + ;; NO_FULL-NEXT: (i32.const 0) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (drop + ;; NO_FULL-NEXT: (i32.const 0) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (drop + ;; NO_FULL-NEXT: (i32.const 0) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (drop + ;; NO_FULL-NEXT: (i32.const 0) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (block + ;; NO_FULL-NEXT: (block $__inlined_func$byn-split-inlineable-A$maybe-partial-or-full-2$3 + ;; NO_FULL-NEXT: (local.set $3 + ;; NO_FULL-NEXT: (i32.const 1) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (if + ;; NO_FULL-NEXT: (i32.eqz + ;; NO_FULL-NEXT: (local.get $3) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (block $__inlined_func$byn-split-outlined-A$maybe-partial-or-full-2$7 + ;; NO_FULL-NEXT: (local.set $7 + ;; NO_FULL-NEXT: (local.get $3) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (block + ;; NO_FULL-NEXT: (nop) + ;; NO_FULL-NEXT: (drop + ;; NO_FULL-NEXT: (i32.const 0) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (drop + ;; NO_FULL-NEXT: (i32.const 0) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (drop + ;; NO_FULL-NEXT: (i32.const 0) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (drop + ;; NO_FULL-NEXT: (i32.const 0) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (drop + ;; NO_FULL-NEXT: (i32.const 0) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (drop + ;; NO_FULL-NEXT: (i32.const 0) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (drop + ;; NO_FULL-NEXT: (i32.const 0) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: (drop + ;; NO_FULL-NEXT: (i32.const 0) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_FULL-NEXT: ) + ;; NO_BOTH: (func $caller + ;; NO_BOTH-NEXT: (call $maybe-partial-or-full-1 + ;; NO_BOTH-NEXT: (i32.const 0) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: (call $maybe-partial-or-full-1 + ;; NO_BOTH-NEXT: (i32.const 1) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: (call $maybe-partial-or-full-2 + ;; NO_BOTH-NEXT: (i32.const 0) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: (call $maybe-partial-or-full-2 + ;; NO_BOTH-NEXT: (i32.const 1) + ;; NO_BOTH-NEXT: ) + ;; NO_BOTH-NEXT: ) + (func $caller + ;; In YES_ALL we will fully inline all of these. In NO_FULL we will partially + ;; inline. In NO_PART and NO_BOTH we will not inline at all (in theory we + ;; could do full inlining when only partial inlining is disabled, but we only + ;; see that full inlining is possible as a result of partial inlining, so if + ;; partial is disabled we don't get there, and full inlining is not + ;; justified). + (call $maybe-partial-or-full-1 + (i32.const 0) + ) + (call $maybe-partial-or-full-1 + (i32.const 1) + ) + (call $maybe-partial-or-full-2 + (i32.const 0) + ) + (call $maybe-partial-or-full-2 + (i32.const 1) + ) + ) +) |