summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/lit/passes/inlining_splitting_basics.wast207
1 files changed, 207 insertions, 0 deletions
diff --git a/test/lit/passes/inlining_splitting_basics.wast b/test/lit/passes/inlining_splitting_basics.wast
new file mode 100644
index 000000000..443686101
--- /dev/null
+++ b/test/lit/passes/inlining_splitting_basics.wast
@@ -0,0 +1,207 @@
+;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited.
+
+;; Test code that can be partially inlined, with and without that option.
+;;
+;; This is similar to inlining_splitting.wast but focuses on testing that we
+;; only partially inline when the commandline flag is provided. In both of the
+;; $call-* functions below, we should partially inline when that flag is set.
+
+;; RUN: foreach %s %t wasm-opt --inlining --optimize-level=3 --all-features -S -o - | filecheck %s --check-prefix NORMAL_
+;; RUN: foreach %s %t wasm-opt --inlining --optimize-level=3 --partial-inlining-ifs=1 --all-features -S -o - | filecheck %s --check-prefix PARTIAL
+
+(module
+ ;; NORMAL_: (type $none_=>_none (func))
+
+ ;; NORMAL_: (type $i32_=>_none (func (param i32)))
+
+ ;; NORMAL_: (type $i32_=>_i32 (func (param i32) (result i32)))
+
+ ;; NORMAL_: (import "a" "b" (func $import))
+ ;; PARTIAL: (type $none_=>_none (func))
+
+ ;; PARTIAL: (type $i32_=>_none (func (param i32)))
+
+ ;; PARTIAL: (type $i32_=>_i32 (func (param i32) (result i32)))
+
+ ;; PARTIAL: (import "a" "b" (func $import))
+ (import "a" "b" (func $import))
+
+ ;; Pattern A: functions beginning with
+ ;;
+ ;; if (simple) return;
+
+ ;; NORMAL_: (func $pattern-A (type $i32_=>_none) (param $x i32)
+ ;; NORMAL_-NEXT: (if
+ ;; NORMAL_-NEXT: (local.get $x)
+ ;; NORMAL_-NEXT: (return)
+ ;; NORMAL_-NEXT: )
+ ;; NORMAL_-NEXT: (loop $l
+ ;; NORMAL_-NEXT: (call $import)
+ ;; NORMAL_-NEXT: (br $l)
+ ;; NORMAL_-NEXT: )
+ ;; NORMAL_-NEXT: )
+ (func $pattern-A (param $x i32)
+ (if
+ (local.get $x)
+ (return)
+ )
+ (loop $l
+ (call $import)
+ (br $l)
+ )
+ )
+
+ ;; NORMAL_: (func $call-pattern-A (type $none_=>_none)
+ ;; NORMAL_-NEXT: (call $pattern-A
+ ;; NORMAL_-NEXT: (i32.const 1)
+ ;; NORMAL_-NEXT: )
+ ;; NORMAL_-NEXT: (call $pattern-A
+ ;; NORMAL_-NEXT: (i32.const 2)
+ ;; NORMAL_-NEXT: )
+ ;; NORMAL_-NEXT: )
+ ;; PARTIAL: (func $call-pattern-A (type $none_=>_none)
+ ;; PARTIAL-NEXT: (local $0 i32)
+ ;; PARTIAL-NEXT: (local $1 i32)
+ ;; PARTIAL-NEXT: (block
+ ;; PARTIAL-NEXT: (block $__inlined_func$byn-split-inlineable-A$pattern-A
+ ;; PARTIAL-NEXT: (local.set $0
+ ;; PARTIAL-NEXT: (i32.const 1)
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: (if
+ ;; PARTIAL-NEXT: (i32.eqz
+ ;; PARTIAL-NEXT: (local.get $0)
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: (call $byn-split-outlined-A$pattern-A
+ ;; PARTIAL-NEXT: (local.get $0)
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: (block
+ ;; PARTIAL-NEXT: (block $__inlined_func$byn-split-inlineable-A$pattern-A$1
+ ;; PARTIAL-NEXT: (local.set $1
+ ;; PARTIAL-NEXT: (i32.const 2)
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: (if
+ ;; PARTIAL-NEXT: (i32.eqz
+ ;; PARTIAL-NEXT: (local.get $1)
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: (call $byn-split-outlined-A$pattern-A
+ ;; PARTIAL-NEXT: (local.get $1)
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: )
+ (func $call-pattern-A
+ (call $pattern-A (i32.const 1))
+ (call $pattern-A (i32.const 2))
+ )
+
+ ;; Pattern B: functions containing
+ ;;
+ ;; if (simple1) heavy-work-that-is-unreachable;
+ ;; if (simple..) heavy-work-that-is-unreachable;
+ ;; simplek
+
+ ;; NORMAL_: (func $pattern-B (type $i32_=>_i32) (param $x i32) (result i32)
+ ;; NORMAL_-NEXT: (if
+ ;; NORMAL_-NEXT: (i32.eqz
+ ;; NORMAL_-NEXT: (local.get $x)
+ ;; NORMAL_-NEXT: )
+ ;; NORMAL_-NEXT: (block
+ ;; NORMAL_-NEXT: (call $import)
+ ;; NORMAL_-NEXT: (unreachable)
+ ;; NORMAL_-NEXT: )
+ ;; NORMAL_-NEXT: )
+ ;; NORMAL_-NEXT: (local.get $x)
+ ;; NORMAL_-NEXT: )
+ (func $pattern-B (param $x i32) (result i32)
+ (if
+ (i32.eqz
+ (local.get $x)
+ )
+ (block
+ (call $import)
+ (unreachable)
+ )
+ )
+ (local.get $x)
+ )
+
+ ;; NORMAL_: (func $call-pattern-B (type $none_=>_none)
+ ;; NORMAL_-NEXT: (drop
+ ;; NORMAL_-NEXT: (call $pattern-B
+ ;; NORMAL_-NEXT: (i32.const 1)
+ ;; NORMAL_-NEXT: )
+ ;; NORMAL_-NEXT: )
+ ;; NORMAL_-NEXT: (drop
+ ;; NORMAL_-NEXT: (call $pattern-B
+ ;; NORMAL_-NEXT: (i32.const 2)
+ ;; NORMAL_-NEXT: )
+ ;; NORMAL_-NEXT: )
+ ;; NORMAL_-NEXT: )
+ ;; PARTIAL: (func $call-pattern-B (type $none_=>_none)
+ ;; PARTIAL-NEXT: (local $0 i32)
+ ;; PARTIAL-NEXT: (local $1 i32)
+ ;; PARTIAL-NEXT: (drop
+ ;; PARTIAL-NEXT: (block (result i32)
+ ;; PARTIAL-NEXT: (block $__inlined_func$byn-split-inlineable-B$pattern-B$2 (result i32)
+ ;; PARTIAL-NEXT: (local.set $0
+ ;; PARTIAL-NEXT: (i32.const 1)
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: (block (result i32)
+ ;; PARTIAL-NEXT: (if
+ ;; PARTIAL-NEXT: (i32.eqz
+ ;; PARTIAL-NEXT: (local.get $0)
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: (br $__inlined_func$byn-split-inlineable-B$pattern-B$2
+ ;; PARTIAL-NEXT: (call $byn-split-outlined-B$pattern-B
+ ;; PARTIAL-NEXT: (local.get $0)
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: (local.get $0)
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: (drop
+ ;; PARTIAL-NEXT: (block (result i32)
+ ;; PARTIAL-NEXT: (block $__inlined_func$byn-split-inlineable-B$pattern-B$3 (result i32)
+ ;; PARTIAL-NEXT: (local.set $1
+ ;; PARTIAL-NEXT: (i32.const 2)
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: (block (result i32)
+ ;; PARTIAL-NEXT: (if
+ ;; PARTIAL-NEXT: (i32.eqz
+ ;; PARTIAL-NEXT: (local.get $1)
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: (br $__inlined_func$byn-split-inlineable-B$pattern-B$3
+ ;; PARTIAL-NEXT: (call $byn-split-outlined-B$pattern-B
+ ;; PARTIAL-NEXT: (local.get $1)
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: (local.get $1)
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: )
+ ;; PARTIAL-NEXT: )
+ (func $call-pattern-B
+ (drop (call $pattern-B (i32.const 1)))
+ (drop (call $pattern-B (i32.const 2)))
+ )
+)
+;; PARTIAL: (func $byn-split-outlined-A$pattern-A (type $i32_=>_none) (param $x i32)
+;; PARTIAL-NEXT: (loop $l
+;; PARTIAL-NEXT: (call $import)
+;; PARTIAL-NEXT: (br $l)
+;; PARTIAL-NEXT: )
+;; PARTIAL-NEXT: )
+
+;; PARTIAL: (func $byn-split-outlined-B$pattern-B (type $i32_=>_i32) (param $x i32) (result i32)
+;; PARTIAL-NEXT: (call $import)
+;; PARTIAL-NEXT: (unreachable)
+;; PARTIAL-NEXT: )