blob: b8871ddf52af27388f4064fc1e8c74b0e078b92c [file] [edit]
;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited.
;; NOTE: This test was ported using port_passes_tests_to_lit.py and could be cleaned up.
;; RUN: foreach %s %t wasm-opt --coalesce-locals-learning -S -o - | filecheck %s
(module
(memory 10)
;; CHECK: (type $2 (func))
;; CHECK: (type $FUNCSIG$iii (func (param i32 i32) (result i32)))
;; CHECK: (type $3 (func (param i32 f32)))
;; CHECK: (type $FUNCSIG$iiii (func (param i32 i32 i32) (result i32)))
(type $FUNCSIG$iiii (func (param i32 i32 i32) (result i32)))
(type $FUNCSIG$iii (func (param i32 i32) (result i32)))
(type $2 (func))
(type $3 (func (param i32 f32)))
;; CHECK: (type $4 (func (param i32)))
(type $4 (func (param i32)))
(import $_emscripten_autodebug_i32 "env" "_emscripten_autodebug_i32" (param i32 i32) (result i32))
;; CHECK: (import "env" "_emscripten_autodebug_i32" (func $_emscripten_autodebug_i32 (param i32 i32) (result i32)))
;; CHECK: (memory $0 10)
;; CHECK: (func $nothing-to-do
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
(func $nothing-to-do (type $2)
(local $x i32)
(nop)
)
;; CHECK: (func $merge
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
(func $merge (type $2)
(local $x i32)
(local $y i32)
(nop)
)
;; CHECK: (func $leave-type
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (local $1 f32)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
(func $leave-type (type $2)
(local $x i32)
(local $y f32)
(nop)
)
;; CHECK: (func $leave-interfere
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (local $1 i32)
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $1
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $leave-interfere (type $2)
(local $x i32)
(local $y i32)
(local.set $x
(i32.const 0)
)
(local.set $y
(i32.const 1)
)
(drop
(local.get $x)
)
(drop
(local.get $y)
)
)
;; CHECK: (func $almost-interfere
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $almost-interfere (type $2)
(local $x i32)
(local $y i32)
(local.set $x
(i32.const 0)
)
(drop
(local.get $x)
)
(local.set $y
(i32.const 0)
)
(drop
(local.get $y)
)
)
;; CHECK: (func $redundant-copy
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $redundant-copy (type $2)
(local $x i32)
(local $y i32)
(local.set $x
(i32.const 0)
)
(local.set $y
(local.get $x)
)
(drop
(local.get $y)
)
)
;; CHECK: (func $ineffective-store
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $ineffective-store (type $2)
(local $x i32)
(local.set $x
(i32.const 0)
)
(local.set $x
(i32.const 0)
)
(drop
(local.get $x)
)
)
;; CHECK: (func $block
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (block $block0
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $block (type $2)
(local $x i32)
(block $block0
(local.set $x
(i32.const 0)
)
)
(drop
(local.get $x)
)
)
;; CHECK: (func $see-both-sides
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (local $1 i32)
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (block $block0
;; CHECK-NEXT: (local.set $1
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $see-both-sides (type $2)
(local $x i32)
(local $y i32)
(local.set $x
(i32.const 0)
)
(block $block0
(local.set $y
(i32.const 1)
)
)
(drop
(local.get $x)
)
(drop
(local.get $y)
)
)
;; CHECK: (func $see-br-and-ignore-dead
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (block $block
;; CHECK-NEXT: (br $block)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const -1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $see-br-and-ignore-dead (type $2)
(local $x i32)
(local $y i32)
(local.set $x
(i32.const 0)
)
(block $block
(br $block)
(local.set $y
(i32.const 0)
)
(drop
(local.get $y)
)
(local.set $x
(i32.const -1)
)
)
(drop
(local.get $x)
)
)
;; CHECK: (func $see-block-body
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (local $1 i32)
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (block $block
;; CHECK-NEXT: (local.set $1
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $block)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $see-block-body (type $2)
(local $x i32)
(local $y i32)
(local.set $x
(i32.const 0)
)
(block $block
(local.set $y
(i32.const 1)
)
(drop
(local.get $y)
)
(br $block)
)
(drop
(local.get $x)
)
)
;; CHECK: (func $zero-init
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $zero-init (type $2)
(local $x i32)
(local $y i32)
(drop
(local.get $x)
)
(drop
(local.get $y)
)
)
;; CHECK: (func $multi
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $multi (type $2)
(local $x i32)
(local $y i32)
(local $z i32)
(drop
(local.get $y)
)
(drop
(local.get $z)
)
)
;; CHECK: (func $if-else
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else (type $2)
(local $x i32)
(local $y i32)
(if
(i32.const 0)
(drop
(local.get $x)
)
(drop
(local.get $y)
)
)
)
;; CHECK: (func $if-else-parallel
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (block $block1
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (block $block3
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else-parallel (type $2)
(local $x i32)
(local $y i32)
(if
(i32.const 0)
(block $block1
(local.set $x
(i32.const 0)
)
(drop
(local.get $x)
)
)
(block $block3
(local.set $y
(i32.const 1)
)
(drop
(local.get $y)
)
)
)
)
;; CHECK: (func $if-else-after
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (local $1 i32)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $1
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else-after (type $2)
(local $x i32)
(local $y i32)
(if
(i32.const 0)
(local.set $x
(i32.const 0)
)
(local.set $y
(i32.const 1)
)
)
(drop
(local.get $x)
)
(drop
(local.get $y)
)
)
;; CHECK: (func $if-else-through
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (local $1 i32)
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $1
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-else-through (type $2)
(local $x i32)
(local $y i32)
(local.set $x
(i32.const 0)
)
(local.set $y
(i32.const 1)
)
(if
(i32.const 0)
(drop
(i32.const 1)
)
(drop
(i32.const 2)
)
)
(drop
(local.get $x)
)
(drop
(local.get $y)
)
)
;; CHECK: (func $if-through
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (local $1 i32)
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $1
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-through (type $2)
(local $x i32)
(local $y i32)
(local.set $x
(i32.const 0)
)
(local.set $y
(i32.const 1)
)
(if
(i32.const 0)
(drop
(i32.const 1)
)
)
(drop
(local.get $x)
)
(drop
(local.get $y)
)
)
;; CHECK: (func $if-through2
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (local $1 i32)
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (local.set $1
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-through2 (type $2)
(local $x i32)
(local $y i32)
(local.set $x
(i32.const 0)
)
(if
(i32.const 0)
(local.set $y
(i32.const 1)
)
)
(drop
(local.get $x)
)
(drop
(local.get $y)
)
)
;; CHECK: (func $if-through3
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (local $1 i32)
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (block $block1
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if-through3 (type $2)
(local $x i32)
(local $y i32)
(local.set $x
(i32.const 1)
)
(if
(i32.const 0)
(block $block1
(drop
(local.get $x)
)
(drop
(local.get $y)
)
)
)
)
;; CHECK: (func $if2
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (local $1 i32)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (local.tee $0
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (block $block1
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if2 (type $2)
(local $x i32)
(local $y i32)
(if
(local.tee $x
(i32.const 1)
)
(block $block1
(drop
(local.get $x)
)
(drop
(local.get $y)
)
)
)
)
;; CHECK: (func $if3
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (local $1 i32)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (block $block1
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if3 (type $2)
(local $x i32)
(local $y i32)
(if
(i32.const 0)
(block $block1
(local.set $x
(i32.const 0)
)
(drop
(local.get $x)
)
)
)
(drop
(local.get $y)
)
)
;; CHECK: (func $if4
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (block $block1
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if4 (type $2)
(local $x i32)
(local $y i32)
(if
(i32.const 0)
(block $block1
(local.set $x
(i32.const 0)
)
(drop
(local.get $x)
)
(local.set $y
(i32.const 1)
)
)
)
(drop
(local.get $y)
)
)
;; CHECK: (func $if5
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (block $block1
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $if5 (type $2)
(local $x i32)
(local $y i32)
(if
(i32.const 0)
(block $block1
(drop
(local.get $x)
)
(local.set $y
(i32.const 1)
)
)
)
(drop
(local.get $y)
)
)
;; CHECK: (func $loop
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (local $1 i32)
;; CHECK-NEXT: (block $out
;; CHECK-NEXT: (loop $in
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $in)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $loop (type $2)
(local $x i32)
(local $y i32)
(block $out
(loop $in
(drop
(local.get $x)
)
(local.set $x
(i32.const 0)
)
(drop
(local.get $y)
)
(br $in)
)
)
)
;; CHECK: (func $interfere-in-dead
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (block $block
;; CHECK-NEXT: (br $block)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $interfere-in-dead (type $2)
(local $x i32)
(local $y i32)
(block $block
(br $block)
(drop
(local.get $x)
)
(drop
(local.get $y)
)
)
)
;; CHECK: (func $interfere-in-dead2
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (block $block
;; CHECK-NEXT: (unreachable)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $interfere-in-dead2 (type $2)
(local $x i32)
(local $y i32)
(block $block
(unreachable)
(drop
(local.get $x)
)
(drop
(local.get $y)
)
)
)
;; CHECK: (func $interfere-in-dead3
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (block $block
;; CHECK-NEXT: (return)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $interfere-in-dead3 (type $2)
(local $x i32)
(local $y i32)
(block $block
(return)
(drop
(local.get $x)
)
(drop
(local.get $y)
)
)
)
;; CHECK: (func $params (param $0 i32) (param $1 f32)
;; CHECK-NEXT: (local $2 i32)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $params (type $3) (param $p i32) (param $q f32)
(local $x i32)
(local $y i32)
(local $z i32)
(local $w i32)
(drop
(local.get $y)
)
(drop
(local.get $z)
)
(drop
(local.get $w)
)
)
;; CHECK: (func $interfere-in-dead4
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (block $block
;; CHECK-NEXT: (br_if $block
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $interfere-in-dead4 (type $2)
(local $x i32)
(local $y i32)
(block $block
(br_if $block
(i32.const 0)
)
(drop
(local.get $x)
)
(drop
(local.get $y)
)
)
)
;; CHECK: (func $switch
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (block $switch$def
;; CHECK-NEXT: (block $switch-case$1
;; CHECK-NEXT: (block $switch-case$2
;; CHECK-NEXT: (br_table $switch-case$1 $switch-case$2 $switch-case$1 $switch-case$1 $switch$def
;; CHECK-NEXT: (i32.const 100)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $switch (type $2)
(local $x i32)
(local $y i32)
(local $z i32)
(local $w i32)
(block $switch$def
(block $switch-case$1
(block $switch-case$2
(br_table $switch-case$1 $switch-case$2 $switch-case$1 $switch-case$1 $switch$def
(i32.const 100)
)
(drop
(local.get $x)
)
)
(drop
(local.get $y)
)
)
(drop
(local.get $z)
)
)
(drop
(local.get $w)
)
)
;; CHECK: (func $greedy-can-be-happy
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (local $1 i32)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: (block $block3
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 100)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $1
;; CHECK-NEXT: (i32.const 101)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (block $block5
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 102)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $1
;; CHECK-NEXT: (i32.const 103)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 3)
;; CHECK-NEXT: (block $block8
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 104)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $1
;; CHECK-NEXT: (i32.const 105)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (block $block10
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 106)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $1
;; CHECK-NEXT: (i32.const 107)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 4)
;; CHECK-NEXT: (block $block13
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 108)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $1
;; CHECK-NEXT: (i32.const 109)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (block $block15
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 110)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $1
;; CHECK-NEXT: (i32.const 111)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $greedy-can-be-happy (type $2)
(local $x1 i32)
(local $x2 i32)
(local $x3 i32)
(local $y1 i32)
(local $y2 i32)
(local $y3 i32)
(if
(i32.const 0)
(if
(i32.const 1)
(if
(i32.const 2)
(block $block3
(local.set $x1
(i32.const 100)
)
(local.set $y2
(i32.const 101)
)
(drop
(local.get $x1)
)
(drop
(local.get $y2)
)
)
(block $block5
(local.set $x1
(i32.const 102)
)
(local.set $y3
(i32.const 103)
)
(drop
(local.get $x1)
)
(drop
(local.get $y3)
)
)
)
(if
(i32.const 3)
(block $block8
(local.set $x2
(i32.const 104)
)
(local.set $y1
(i32.const 105)
)
(drop
(local.get $x2)
)
(drop
(local.get $y1)
)
)
(block $block10
(local.set $x2
(i32.const 106)
)
(local.set $y3
(i32.const 107)
)
(drop
(local.get $x2)
)
(drop
(local.get $y3)
)
)
)
)
(if
(i32.const 4)
(block $block13
(local.set $x3
(i32.const 108)
)
(local.set $y1
(i32.const 109)
)
(drop
(local.get $x3)
)
(drop
(local.get $y1)
)
)
(block $block15
(local.set $x3
(i32.const 110)
)
(local.set $y2
(i32.const 111)
)
(drop
(local.get $x3)
)
(drop
(local.get $y2)
)
)
)
)
)
;; CHECK: (func $greedy-can-be-sad
;; CHECK-NEXT: (local $0 i32)
;; CHECK-NEXT: (local $1 i32)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: (block $block3
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 100)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $1
;; CHECK-NEXT: (i32.const 101)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (block $block5
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 102)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $1
;; CHECK-NEXT: (i32.const 103)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 3)
;; CHECK-NEXT: (block $block8
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 104)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $1
;; CHECK-NEXT: (i32.const 105)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (block $block10
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 106)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $1
;; CHECK-NEXT: (i32.const 107)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 4)
;; CHECK-NEXT: (block $block13
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 108)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $1
;; CHECK-NEXT: (i32.const 109)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (block $block15
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 110)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $1
;; CHECK-NEXT: (i32.const 111)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $greedy-can-be-sad (type $2)
(local $x1 i32)
(local $y1 i32)
(local $x2 i32)
(local $y2 i32)
(local $x3 i32)
(local $y3 i32)
(if
(i32.const 0)
(if
(i32.const 1)
(if
(i32.const 2)
(block $block3
(local.set $x1
(i32.const 100)
)
(local.set $y2
(i32.const 101)
)
(drop
(local.get $x1)
)
(drop
(local.get $y2)
)
)
(block $block5
(local.set $x1
(i32.const 102)
)
(local.set $y3
(i32.const 103)
)
(drop
(local.get $x1)
)
(drop
(local.get $y3)
)
)
)
(if
(i32.const 3)
(block $block8
(local.set $x2
(i32.const 104)
)
(local.set $y1
(i32.const 105)
)
(drop
(local.get $x2)
)
(drop
(local.get $y1)
)
)
(block $block10
(local.set $x2
(i32.const 106)
)
(local.set $y3
(i32.const 107)
)
(drop
(local.get $x2)
)
(drop
(local.get $y3)
)
)
)
)
(if
(i32.const 4)
(block $block13
(local.set $x3
(i32.const 108)
)
(local.set $y1
(i32.const 109)
)
(drop
(local.get $x3)
)
(drop
(local.get $y1)
)
)
(block $block15
(local.set $x3
(i32.const 110)
)
(local.set $y2
(i32.const 111)
)
(drop
(local.get $x3)
)
(drop
(local.get $y2)
)
)
)
)
)
;; CHECK: (func $_memcpy (param $0 i32) (param $1 i32) (param $2 i32) (result i32)
;; CHECK-NEXT: (local $3 i32)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.ge_s
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: (i32.const 4096)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $3
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.eq
;; CHECK-NEXT: (i32.and
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 3)
;; CHECK-NEXT: )
;; CHECK-NEXT: (i32.and
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (i32.const 3)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (block $block2
;; CHECK-NEXT: (block $while-out$0
;; CHECK-NEXT: (loop $while-in$1
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.eqz
;; CHECK-NEXT: (i32.and
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 3)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $while-out$0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (block $block4
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.eqz
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (return
;; CHECK-NEXT: (local.get $3)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (i32.store8
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.load8_s
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $1
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $2
;; CHECK-NEXT: (i32.sub
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $while-in$1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (block $while-out$2
;; CHECK-NEXT: (loop $while-in$3
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.eqz
;; CHECK-NEXT: (i32.ge_s
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: (i32.const 4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $while-out$2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (block $block7
;; CHECK-NEXT: (i32.store
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.load
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $1
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (i32.const 4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $2
;; CHECK-NEXT: (i32.sub
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: (i32.const 4)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $while-in$3)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (block $while-out$4
;; CHECK-NEXT: (loop $while-in$5
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.eqz
;; CHECK-NEXT: (i32.gt_s
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $while-out$4)
;; CHECK-NEXT: )
;; CHECK-NEXT: (block $block9
;; CHECK-NEXT: (i32.store8
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.load8_s
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $1
;; CHECK-NEXT: (i32.add
;; CHECK-NEXT: (local.get $1)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $2
;; CHECK-NEXT: (i32.sub
;; CHECK-NEXT: (local.get $2)
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (br $while-in$5)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (return
;; CHECK-NEXT: (local.get $3)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $_memcpy (type $FUNCSIG$iiii) (param $i1 i32) (param $i2 i32) (param $i3 i32) (result i32)
(local $i4 i32)
(if
(i32.ge_s
(local.get $i3)
(i32.const 4096)
)
(drop
(local.get $i1)
)
)
(local.set $i4
(local.get $i1)
)
(if
(i32.eq
(i32.and
(local.get $i1)
(i32.const 3)
)
(i32.and
(local.get $i2)
(i32.const 3)
)
)
(block $block2
(block $while-out$0
(loop $while-in$1
(if
(i32.eqz
(i32.and
(local.get $i1)
(i32.const 3)
)
)
(br $while-out$0)
)
(block $block4
(if
(i32.eqz
(local.get $i3)
)
(return
(local.get $i4)
)
)
(i32.store8
(local.get $i1)
(i32.load8_s
(local.get $i2)
)
)
(local.set $i1
(i32.add
(local.get $i1)
(i32.const 1)
)
)
(local.set $i2
(i32.add
(local.get $i2)
(i32.const 1)
)
)
(local.set $i3
(i32.sub
(local.get $i3)
(i32.const 1)
)
)
)
(br $while-in$1)
)
)
(block $while-out$2
(loop $while-in$3
(if
(i32.eqz
(i32.ge_s
(local.get $i3)
(i32.const 4)
)
)
(br $while-out$2)
)
(block $block7
(i32.store
(local.get $i1)
(i32.load
(local.get $i2)
)
)
(local.set $i1
(i32.add
(local.get $i1)
(i32.const 4)
)
)
(local.set $i2
(i32.add
(local.get $i2)
(i32.const 4)
)
)
(local.set $i3
(i32.sub
(local.get $i3)
(i32.const 4)
)
)
)
(br $while-in$3)
)
)
)
)
(block $while-out$4
(loop $while-in$5
(if
(i32.eqz
(i32.gt_s
(local.get $i3)
(i32.const 0)
)
)
(br $while-out$4)
)
(block $block9
(i32.store8
(local.get $i1)
(i32.load8_s
(local.get $i2)
)
)
(local.set $i1
(i32.add
(local.get $i1)
(i32.const 1)
)
)
(local.set $i2
(i32.add
(local.get $i2)
(i32.const 1)
)
)
(local.set $i3
(i32.sub
(local.get $i3)
(i32.const 1)
)
)
)
(br $while-in$5)
)
)
(return
(local.get $i4)
)
)
;; CHECK: (func $this-is-effective-i-tell-you (param $0 i32)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const -1)
;; CHECK-NEXT: (block $block1
;; CHECK-NEXT: (if
;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: (local.set $0
;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (nop)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (local.get $0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $this-is-effective-i-tell-you (type $4) (param $x i32)
(if
(i32.const -1)
(block $block1
(if
(i32.const 0)
(nop)
)
(local.set $x
(i32.const 1)
)
)
(nop)
)
(drop
(local.get $x)
)
)
)