| ;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited. |
| |
| ;; With `-O3`, we always inline calls to functions that just call other |
| ;; functions with "trivial" arguments. |
| ;; |
| ;; A trivial argument for now is just an instruction with size 1. E.g. |
| ;; `local.get`, constants. |
| ;; |
| ;; In this test we check inlining when the trivial call arguments are |
| ;; constants. In tests inlining-trivial-calls-{1,2,3}.wast we check locals. |
| |
| ;; RUN: foreach %s %t wasm-opt -all -O3 -S -o - | filecheck %s --check-prefix=O3 |
| ;; RUN: foreach %s %t wasm-opt -all -O2 -S -o - | filecheck %s --check-prefix=O2 |
| ;; RUN: foreach %s %t wasm-opt -all -Os -S -o - | filecheck %s --check-prefix=Os |
| |
| (module |
| ;; O3: (type $0 (func (param i32 i32 i32))) |
| ;; O2: (type $1 (func)) |
| |
| ;; O2: (type $0 (func (param i32 i32 i32))) |
| ;; Os: (type $1 (func)) |
| |
| ;; Os: (type $0 (func (param i32 i32 i32))) |
| (type $0 (func (param i32 i32 i32))) |
| |
| ;; O3: (type $1 (func)) |
| (type $1 (func)) |
| |
| (type $2 (func)) |
| |
| ;; O3: (import "env" "foo" (func $imported-foo (type $0) (param i32 i32 i32))) |
| ;; O2: (import "env" "foo" (func $imported-foo (type $0) (param i32 i32 i32))) |
| ;; Os: (import "env" "foo" (func $imported-foo (type $0) (param i32 i32 i32))) |
| (import "env" "foo" (func $imported-foo (type $0) (param i32 i32 i32))) |
| |
| ;; O3: (export "main" (func $main)) |
| ;; O2: (export "main" (func $main)) |
| ;; Os: (export "main" (func $main)) |
| (export "main" (func $main)) |
| |
| ;; O2: (func $call-foo (type $1) |
| ;; O2-NEXT: (call $imported-foo |
| ;; O2-NEXT: (i32.const 1) |
| ;; O2-NEXT: (i32.const 2) |
| ;; O2-NEXT: (i32.const 3) |
| ;; O2-NEXT: ) |
| ;; O2-NEXT: ) |
| ;; Os: (func $call-foo (type $1) |
| ;; Os-NEXT: (call $imported-foo |
| ;; Os-NEXT: (i32.const 1) |
| ;; Os-NEXT: (i32.const 2) |
| ;; Os-NEXT: (i32.const 3) |
| ;; Os-NEXT: ) |
| ;; Os-NEXT: ) |
| (func $call-foo (type $1) |
| (call $imported-foo |
| (i32.const 1) |
| (i32.const 2) |
| (i32.const 3))) |
| |
| ;; O3: (func $main (type $1) |
| ;; O3-NEXT: (call $imported-foo |
| ;; O3-NEXT: (i32.const 1) |
| ;; O3-NEXT: (i32.const 2) |
| ;; O3-NEXT: (i32.const 3) |
| ;; O3-NEXT: ) |
| ;; O3-NEXT: (call $imported-foo |
| ;; O3-NEXT: (i32.const 1) |
| ;; O3-NEXT: (i32.const 2) |
| ;; O3-NEXT: (i32.const 3) |
| ;; O3-NEXT: ) |
| ;; O3-NEXT: (call $imported-foo |
| ;; O3-NEXT: (i32.const 1) |
| ;; O3-NEXT: (i32.const 2) |
| ;; O3-NEXT: (i32.const 3) |
| ;; O3-NEXT: ) |
| ;; O3-NEXT: ) |
| ;; O2: (func $main (type $1) |
| ;; O2-NEXT: (call $call-foo) |
| ;; O2-NEXT: (call $call-foo) |
| ;; O2-NEXT: (call $call-foo) |
| ;; O2-NEXT: ) |
| ;; Os: (func $main (type $1) |
| ;; Os-NEXT: (call $call-foo) |
| ;; Os-NEXT: (call $call-foo) |
| ;; Os-NEXT: (call $call-foo) |
| ;; Os-NEXT: ) |
| (func $main (type $2) |
| ;; All calls below should be inlined in -O3, but not in -O2 or -Os. We call |
| ;; it multiple times to make sure it won't be inlined because there's only |
| ;; one call, instead it will be inlined based on optimization settings and |
| ;; whether the call is trivial. |
| (call $call-foo) |
| (call $call-foo) |
| (call $call-foo))) |