summaryrefslogtreecommitdiff
path: root/test/lit/binary/stacky-eh.test
blob: 09406bfea9043c79bd17549422489d371a0543fc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# Verify stacky EH binary can be parsed correctly.
#
# stacky-eh.test.wasm contains below:
# try
#   nop
# catch 0 # tag type i32
#   i32.const 3
#   local.set 1
#   local.set 2
#
# (This binary was generated by
#  'wasm-opt --optimize-level=3 --generate-stack-ir -optimize-stack-ir')
#
# This code is 'stacky' in Binaryen parlance. In the binary reader, Binaryen has
# a special routine of creating a block and a local.get/local.set to read stacky
# code into Binaryen AST. So if we don't do any post-fixup, the 'catch' block
# becomes:
# (catch $e-i32
#   (local.set 2
#     (block (result i32)
#       (local.set $new
#         (pop i32)
#       )
#       (local.set 1
#         (i32.const 3)
#       )
#       (local.get $new)
#     )
#   )
# )
# Here the 'block' and `local $new' are newly created to read the stacky code.
# But now the 'pop' ends up nested within the 'block', which is invalid. This
# test tests if this invalid code is correctly fixed up in the binary reader.
# The fixup will hoist the 'pop' and create another local to store it right
# after 'catch'.

RUN: wasm-opt -all %s.wasm --print | filecheck %s

# CHECK:      (func $0
# CHECK-NEXT:  (local $0 i32)
# CHECK-NEXT:  (local $1 i32)
# CHECK-NEXT:  (local $2 i32)
# CHECK-NEXT:  (local $3 i32)
# CHECK-NEXT:  (local $4 i32)
# CHECK-NEXT:  (try $label$3
# CHECK-NEXT:   (do
# CHECK-NEXT:    (nop)
# CHECK-NEXT:   )
# CHECK-NEXT:   (catch $tag$0
# CHECK-NEXT:    (local.set $4
# CHECK-NEXT:     (pop i32)
# CHECK-NEXT:    )
# CHECK-NEXT:    (local.set $2
# CHECK-NEXT:     (block (result i32)
# CHECK-NEXT:      (local.set $3
# CHECK-NEXT:       (local.get $4)
# CHECK-NEXT:      )
# CHECK-NEXT:      (local.set $1
# CHECK-NEXT:       (i32.const 3)
# CHECK-NEXT:      )
# CHECK-NEXT:      (local.get $3)
# CHECK-NEXT:     )
# CHECK-NEXT:    )
# CHECK-NEXT:   )
# CHECK-NEXT:  )
# CHECK-NEXT: )