blob: b6e3caec2cf661d1d7bbafb279b7610eca5ada02 [file] [log] [blame] [edit]
;; NOTE: Assertions have been generated by update_lit_checks.py and should not be edited.
;; RUN: wasm-opt %s --inlining -all -S -o - | filecheck %s
(module
;; ---------------------------------------------------------------------------
;; CHECK: (import "a" "b" (func $foo (type $2) (result i32)))
(import "a" "b" (func $foo (result i32)))
;; CHECK: (tag $tag$0 (param i32))
(tag $tag$0 (param i32))
(func $callee-with-label
(try $label
(do)
(catch $tag$0
(drop
(pop i32)
)
)
)
)
;; Properly ensure unique try labels after an inlining
;; CHECK: (func $caller-with-label (type $1) (param $x i32)
;; CHECK-NEXT: (loop $label
;; CHECK-NEXT: (block
;; CHECK-NEXT: (block $__inlined_func$callee-with-label
;; CHECK-NEXT: (try $label0
;; CHECK-NEXT: (do
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $tag$0
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (pop i32)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br_if $label
;; CHECK-NEXT: (call $foo)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $caller-with-label (param $x i32)
(loop $label ;; The same label as the try that will be inlined into here
(call $callee-with-label)
(br_if $label
(call $foo)
)
)
)
;; ---------------------------------------------------------------------------
;; CHECK: (func $callee-with-try-delegate (type $0)
;; CHECK-NEXT: (try $label$3
;; CHECK-NEXT: (do
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: (delegate 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $callee-with-try-delegate
(try $label$3
(do)
(delegate 0)
)
)
;; For now, do not inline a try-delegate
;; CHECK: (func $caller (type $0)
;; CHECK-NEXT: (call $callee-with-try-delegate)
;; CHECK-NEXT: )
(func $caller
(call $callee-with-try-delegate)
)
;; ---------------------------------------------------------------------------
(func $callee-a (result i32)
(i32.const 42)
)
;; Properly support inlining into a function with a try-delegate
;; CHECK: (func $caller-with-try-delegate (type $2) (result i32)
;; CHECK-NEXT: (try $label$3
;; CHECK-NEXT: (do
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: (delegate 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (block (result i32)
;; CHECK-NEXT: (block $__inlined_func$callee-a$1 (result i32)
;; CHECK-NEXT: (i32.const 42)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $caller-with-try-delegate (result i32)
(try $label$3
(do)
(delegate 0)
)
(call $callee-a)
)
;; ---------------------------------------------------------------------------
(func $callee-b (param i32))
;; CHECK: (func $caller-with-pop (type $0)
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (local $1 i32)
;; CHECK-NEXT: (try
;; CHECK-NEXT: (do
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: (catch $tag$0
;; CHECK-NEXT: (local.set $1
;; CHECK-NEXT: (pop i32)
;; CHECK-NEXT: )
;; CHECK-NEXT: (block
;; CHECK-NEXT: (block $__inlined_func$callee-b$2
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $caller-with-pop
(try
(do)
(catch $tag$0
;; After this $callee-b is inlined, there will be additional 'block's
;; surrouding this 'pop', which makes its location invalid. We fix it by
;; creating a new local to set the result of 'pop' and later use
;; local.get to get the value within the inlined function body.
(call $callee-b
(pop i32)
)
)
)
)
)