1*b3e88ccbSHeejin Ahn# RUN: llc -mtriple=wasm32-unknown-unknown -exception-model=wasm -mattr=+exception-handling,+multivalue,+simd128 -run-pass wasm-cfg-sort -run-pass wasm-cfg-stackify %s -o - | FileCheck %s
252221d56SHeejin Ahn
351fb5bf4SHeejin Ahn--- |
451fb5bf4SHeejin Ahn  target triple = "wasm32-unknown-unknown"
551fb5bf4SHeejin Ahn
651fb5bf4SHeejin Ahn  declare i32 @__gxx_wasm_personality_v0(...)
751fb5bf4SHeejin Ahn  declare void @foo()
851fb5bf4SHeejin Ahn  define void @function_property_test() {
951fb5bf4SHeejin Ahn    ret void
1051fb5bf4SHeejin Ahn  }
1151fb5bf4SHeejin Ahn  define void @wasm_eh_info_test() personality i8* bitcast (i32 (...)* @__gxx_wasm_personality_v0 to i8*) {
1251fb5bf4SHeejin Ahn    ret void
1351fb5bf4SHeejin Ahn  }
14*b3e88ccbSHeejin Ahn
15*b3e88ccbSHeejin Ahn  ;; Param / results tests
16*b3e88ccbSHeejin Ahn  define i32 @i32__i64(i64) {
17*b3e88ccbSHeejin Ahn    ret i32 0
18*b3e88ccbSHeejin Ahn  }
19*b3e88ccbSHeejin Ahn  define void @void__i32_i64_f32_f64() {
20*b3e88ccbSHeejin Ahn    ret void
21*b3e88ccbSHeejin Ahn  }
22*b3e88ccbSHeejin Ahn  define void @void__v16i8_v8i16_v4i32_v2i64(<16 x i8>, <8 x i16>, <4 x i32>, <2 x i64>) {
23*b3e88ccbSHeejin Ahn    ret void
24*b3e88ccbSHeejin Ahn  }
25*b3e88ccbSHeejin Ahn  %pair = type { i32, i64 }
26*b3e88ccbSHeejin Ahn  define %pair @i32_i64__i32_i64(%pair %p) {
27*b3e88ccbSHeejin Ahn    ret %pair %p
28*b3e88ccbSHeejin Ahn  }
2951fb5bf4SHeejin Ahn...
3051fb5bf4SHeejin Ahn
3151fb5bf4SHeejin Ahn# CHECK-LABEL: name: function_property_test
321aaa481fSHeejin Ahn# CHECK: machineFunctionInfo:
331aaa481fSHeejin Ahn# CHECK:   isCFGStackified:   true
3452221d56SHeejin Ahnname: function_property_test
3552221d56SHeejin Ahnliveins:
3652221d56SHeejin Ahn  - { reg: '$arguments' }
3752221d56SHeejin Ahnbody: |
3852221d56SHeejin Ahn  bb.0:
3900f9e5aaSThomas Lively    RETURN implicit-def dead $arguments
4052221d56SHeejin Ahn...
4151fb5bf4SHeejin Ahn
4251fb5bf4SHeejin Ahn---
4351fb5bf4SHeejin Ahn# CHECK-LABEL: name: wasm_eh_info_test
4451fb5bf4SHeejin Ahn# CHECK: machineFunctionInfo:
4551fb5bf4SHeejin Ahnname: wasm_eh_info_test
4651fb5bf4SHeejin Ahnliveins:
4751fb5bf4SHeejin Ahn  - { reg: '$arguments' }
4851fb5bf4SHeejin Ahn# CHECK:  wasmEHFuncInfo:
4951fb5bf4SHeejin Ahn# bb.2 becomes bb.1 and bb.3 becomes bb.2 after CFGSort.
5051fb5bf4SHeejin Ahn# CHECK-NEXT:    1:               2
5151fb5bf4SHeejin AhnmachineFunctionInfo:
5251fb5bf4SHeejin Ahn  wasmEHFuncInfo:
5351fb5bf4SHeejin Ahn    2:               3
5451fb5bf4SHeejin Ahnbody:             |
5551fb5bf4SHeejin Ahn  bb.0:
5651fb5bf4SHeejin Ahn    successors: %bb.1, %bb.2
5751fb5bf4SHeejin Ahn    CALL @foo, implicit-def dead $arguments, implicit $sp32, implicit $sp64, implicit-def dead $arguments, implicit $sp32, implicit $sp64
5851fb5bf4SHeejin Ahn
5951fb5bf4SHeejin Ahn  bb.1:
6051fb5bf4SHeejin Ahn    RETURN implicit-def dead $arguments
6151fb5bf4SHeejin Ahn
6251fb5bf4SHeejin Ahn  bb.2 (landing-pad):
6351fb5bf4SHeejin Ahn    successors: %bb.1, %bb.3
6451fb5bf4SHeejin Ahn    %0:i32 = CATCH &__cpp_exception, implicit-def dead $arguments
6551fb5bf4SHeejin Ahn    CALL @foo, implicit-def dead $arguments, implicit $sp32, implicit $sp64, implicit-def dead $arguments, implicit $sp32, implicit $sp64
6651fb5bf4SHeejin Ahn    BR %bb.1, implicit-def $arguments
6751fb5bf4SHeejin Ahn
6851fb5bf4SHeejin Ahn  bb.3 (landing-pad):
6951fb5bf4SHeejin Ahn    CATCH_ALL implicit-def $arguments
7051fb5bf4SHeejin Ahn    RETHROW 0, implicit-def $arguments
7151fb5bf4SHeejin Ahn...
72*b3e88ccbSHeejin Ahn
73*b3e88ccbSHeejin Ahn# Param / results tests
74*b3e88ccbSHeejin Ahn---
75*b3e88ccbSHeejin Ahn# CHECK-LABEL: name: i32__i64
76*b3e88ccbSHeejin Ahn# CHECK:    machineFunctionInfo:
77*b3e88ccbSHeejin Ahn# CHECK:      params:          [ i64 ]
78*b3e88ccbSHeejin Ahn# CHECK-NEXT: results:         [ i32 ]
79*b3e88ccbSHeejin Ahnname: i32__i64
80*b3e88ccbSHeejin Ahnliveins:
81*b3e88ccbSHeejin Ahn  - { reg: '$arguments' }
82*b3e88ccbSHeejin AhnmachineFunctionInfo:
83*b3e88ccbSHeejin Ahn  params:          [ i64 ]
84*b3e88ccbSHeejin Ahn  results:         [ i32 ]
85*b3e88ccbSHeejin Ahnbody: |
86*b3e88ccbSHeejin Ahn  bb.0:
87*b3e88ccbSHeejin Ahn    %0:i32 = CONST_I32 3, implicit-def dead $arguments
88*b3e88ccbSHeejin Ahn    RETURN %0:i32, implicit-def dead $arguments
89*b3e88ccbSHeejin Ahn...
90*b3e88ccbSHeejin Ahn---
91*b3e88ccbSHeejin Ahn# CHECK-LABEL: name: void__i32_i64_f32_f64
92*b3e88ccbSHeejin Ahn# CHECK:    machineFunctionInfo:
93*b3e88ccbSHeejin Ahn# CHECK:      params:          [ i32, i64, f32, f64 ]
94*b3e88ccbSHeejin Ahn# CHECK-NEXT: results:         [  ]
95*b3e88ccbSHeejin Ahnname: void__i32_i64_f32_f64
96*b3e88ccbSHeejin Ahnliveins:
97*b3e88ccbSHeejin Ahn  - { reg: '$arguments' }
98*b3e88ccbSHeejin AhnmachineFunctionInfo:
99*b3e88ccbSHeejin Ahn  params:          [ i32, i64, f32, f64 ]
100*b3e88ccbSHeejin Ahn  results:         [  ]
101*b3e88ccbSHeejin Ahnbody: |
102*b3e88ccbSHeejin Ahn  bb.0:
103*b3e88ccbSHeejin Ahn    RETURN implicit-def dead $arguments
104*b3e88ccbSHeejin Ahn...
105*b3e88ccbSHeejin Ahn---
106*b3e88ccbSHeejin Ahn# CHECK-LABEL: name: void__v16i8_v8i16_v4i32_v2i64
107*b3e88ccbSHeejin Ahn# CHECK:    machineFunctionInfo:
108*b3e88ccbSHeejin Ahn# CHECK:      params:          [ v16i8, v8i16, v4i32, v2i64 ]
109*b3e88ccbSHeejin Ahn# CHECK-NEXT: results:         [  ]
110*b3e88ccbSHeejin Ahnname: void__v16i8_v8i16_v4i32_v2i64
111*b3e88ccbSHeejin Ahnliveins:
112*b3e88ccbSHeejin Ahn  - { reg: '$arguments' }
113*b3e88ccbSHeejin AhnmachineFunctionInfo:
114*b3e88ccbSHeejin Ahn  params:          [ v16i8, v8i16, v4i32, v2i64 ]
115*b3e88ccbSHeejin Ahn  results:         [  ]
116*b3e88ccbSHeejin Ahnbody: |
117*b3e88ccbSHeejin Ahn  bb.0:
118*b3e88ccbSHeejin Ahn    RETURN implicit-def dead $arguments
119*b3e88ccbSHeejin Ahn...
120*b3e88ccbSHeejin Ahn---
121*b3e88ccbSHeejin Ahn# CHECK-LABEL: name: i32_i64__i32_i64
122*b3e88ccbSHeejin Ahn# CHECK:    machineFunctionInfo:
123*b3e88ccbSHeejin Ahn# CHECK:      params:          [ i32, i64 ]
124*b3e88ccbSHeejin Ahn# CHECK-NEXT: results:         [ i32, i64 ]
125*b3e88ccbSHeejin Ahnname: i32_i64__i32_i64
126*b3e88ccbSHeejin Ahnliveins:
127*b3e88ccbSHeejin Ahn  - { reg: '$arguments' }
128*b3e88ccbSHeejin AhnmachineFunctionInfo:
129*b3e88ccbSHeejin Ahn  params:          [ i32, i64 ]
130*b3e88ccbSHeejin Ahn  results:         [ i32, i64 ]
131*b3e88ccbSHeejin Ahnbody: |
132*b3e88ccbSHeejin Ahn  bb.0:
133*b3e88ccbSHeejin Ahn    %0:i32 = ARGUMENT_i32 0, implicit $arguments
134*b3e88ccbSHeejin Ahn    %1:i64 = ARGUMENT_i64 1, implicit $arguments
135*b3e88ccbSHeejin Ahn    RETURN %0, %1, implicit-def dead $arguments
136*b3e88ccbSHeejin Ahn...
137