1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --include-generated-funcs
2; RUN: llc -enable-machine-outliner -mtriple=wasm32-unknown-linux < %s | FileCheck %s
3
4; NOTE: Machine outliner doesn't run.
5@x = global i32 0, align 4
6
7define dso_local i32 @check_boundaries() #0 {
8  %1 = alloca i32, align 4
9  %2 = alloca i32, align 4
10  %3 = alloca i32, align 4
11  %4 = alloca i32, align 4
12  %5 = alloca i32, align 4
13  store i32 0, i32* %1, align 4
14  store i32 0, i32* %2, align 4
15  %6 = load i32, i32* %2, align 4
16  %7 = icmp ne i32 %6, 0
17  br i1 %7, label %9, label %8
18
19  store i32 1, i32* %2, align 4
20  store i32 2, i32* %3, align 4
21  store i32 3, i32* %4, align 4
22  store i32 4, i32* %5, align 4
23  br label %10
24
25  store i32 1, i32* %4, align 4
26  br label %10
27
28  %11 = load i32, i32* %2, align 4
29  %12 = icmp ne i32 %11, 0
30  br i1 %12, label %14, label %13
31
32  store i32 1, i32* %2, align 4
33  store i32 2, i32* %3, align 4
34  store i32 3, i32* %4, align 4
35  store i32 4, i32* %5, align 4
36  br label %15
37
38  store i32 1, i32* %4, align 4
39  br label %15
40
41  ret i32 0
42}
43
44define dso_local i32 @main() #0 {
45  %1 = alloca i32, align 4
46  %2 = alloca i32, align 4
47  %3 = alloca i32, align 4
48  %4 = alloca i32, align 4
49  %5 = alloca i32, align 4
50
51  store i32 0, i32* %1, align 4
52  store i32 0, i32* @x, align 4
53  store i32 1, i32* %2, align 4
54  store i32 2, i32* %3, align 4
55  store i32 3, i32* %4, align 4
56  store i32 4, i32* %5, align 4
57  store i32 1, i32* @x, align 4
58  call void asm sideeffect "", "~{memory},~{dirflag},~{fpsr},~{flags}"()
59  store i32 1, i32* %2, align 4
60  store i32 2, i32* %3, align 4
61  store i32 3, i32* %4, align 4
62  store i32 4, i32* %5, align 4
63  ret i32 0
64}
65
66attributes #0 = { noredzone nounwind ssp uwtable "frame-pointer"="all" }
67; CHECK-LABEL: check_boundaries:
68; CHECK:         .functype check_boundaries () -> (i32)
69; CHECK-NEXT:    .local i32
70; CHECK-NEXT:  # %bb.0:
71; CHECK-NEXT:    global.get __stack_pointer
72; CHECK-NEXT:    i32.const 32
73; CHECK-NEXT:    i32.sub
74; CHECK-NEXT:    local.tee 0
75; CHECK-NEXT:    global.set __stack_pointer
76; CHECK-NEXT:    local.get 0
77; CHECK-NEXT:    i32.const 0
78; CHECK-NEXT:    i32.store 24
79; CHECK-NEXT:    local.get 0
80; CHECK-NEXT:    i32.const 0
81; CHECK-NEXT:    i32.store 28
82; CHECK-NEXT:    block
83; CHECK-NEXT:    block
84; CHECK-NEXT:    i32.const 0
85; CHECK-NEXT:    br_if 0 # 0: down to label1
86; CHECK-NEXT:  # %bb.1:
87; CHECK-NEXT:    local.get 0
88; CHECK-NEXT:    i32.const 2
89; CHECK-NEXT:    i32.store 20
90; CHECK-NEXT:    local.get 0
91; CHECK-NEXT:    i32.const 1
92; CHECK-NEXT:    i32.store 24
93; CHECK-NEXT:    local.get 0
94; CHECK-NEXT:    i32.const 3
95; CHECK-NEXT:    i32.store 16
96; CHECK-NEXT:    local.get 0
97; CHECK-NEXT:    i32.const 4
98; CHECK-NEXT:    i32.store 12
99; CHECK-NEXT:    br 1 # 1: down to label0
100; CHECK-NEXT:  .LBB0_2:
101; CHECK-NEXT:    end_block # label1:
102; CHECK-NEXT:    local.get 0
103; CHECK-NEXT:    i32.const 1
104; CHECK-NEXT:    i32.store 16
105; CHECK-NEXT:  .LBB0_3:
106; CHECK-NEXT:    end_block # label0:
107; CHECK-NEXT:    block
108; CHECK-NEXT:    block
109; CHECK-NEXT:    local.get 0
110; CHECK-NEXT:    i32.load 24
111; CHECK-NEXT:    br_if 0 # 0: down to label3
112; CHECK-NEXT:  # %bb.4:
113; CHECK-NEXT:    local.get 0
114; CHECK-NEXT:    i32.const 2
115; CHECK-NEXT:    i32.store 20
116; CHECK-NEXT:    local.get 0
117; CHECK-NEXT:    i32.const 1
118; CHECK-NEXT:    i32.store 24
119; CHECK-NEXT:    local.get 0
120; CHECK-NEXT:    i32.const 3
121; CHECK-NEXT:    i32.store 16
122; CHECK-NEXT:    local.get 0
123; CHECK-NEXT:    i32.const 4
124; CHECK-NEXT:    i32.store 12
125; CHECK-NEXT:    br 1 # 1: down to label2
126; CHECK-NEXT:  .LBB0_5:
127; CHECK-NEXT:    end_block # label3:
128; CHECK-NEXT:    local.get 0
129; CHECK-NEXT:    i32.const 1
130; CHECK-NEXT:    i32.store 16
131; CHECK-NEXT:  .LBB0_6:
132; CHECK-NEXT:    end_block # label2:
133; CHECK-NEXT:    local.get 0
134; CHECK-NEXT:    i32.const 32
135; CHECK-NEXT:    i32.add
136; CHECK-NEXT:    global.set __stack_pointer
137; CHECK-NEXT:    i32.const 0
138; CHECK-NEXT:    # fallthrough-return
139;
140; CHECK-LABEL: __original_main:
141; CHECK:         .functype __original_main () -> (i32)
142; CHECK-NEXT:    .local i32
143; CHECK-NEXT:  # %bb.0:
144; CHECK-NEXT:    global.get __stack_pointer
145; CHECK-NEXT:    i32.const 32
146; CHECK-NEXT:    i32.sub
147; CHECK-NEXT:    local.tee 0
148; CHECK-NEXT:    global.set __stack_pointer
149; CHECK-NEXT:    i32.const 0
150; CHECK-NEXT:    i32.const 1
151; CHECK-NEXT:    i32.store x
152; CHECK-NEXT:    local.get 0
153; CHECK-NEXT:    i32.const 0
154; CHECK-NEXT:    i32.store 28
155; CHECK-NEXT:    local.get 0
156; CHECK-NEXT:    i32.const 1
157; CHECK-NEXT:    i32.store 24
158; CHECK-NEXT:    local.get 0
159; CHECK-NEXT:    i32.const 2
160; CHECK-NEXT:    i32.store 20
161; CHECK-NEXT:    local.get 0
162; CHECK-NEXT:    i32.const 3
163; CHECK-NEXT:    i32.store 16
164; CHECK-NEXT:    local.get 0
165; CHECK-NEXT:    i32.const 4
166; CHECK-NEXT:    i32.store 12
167; CHECK-NEXT:    #APP
168; CHECK-NEXT:    #NO_APP
169; CHECK-NEXT:    local.get 0
170; CHECK-NEXT:    i32.const 2
171; CHECK-NEXT:    i32.store 20
172; CHECK-NEXT:    local.get 0
173; CHECK-NEXT:    i32.const 1
174; CHECK-NEXT:    i32.store 24
175; CHECK-NEXT:    local.get 0
176; CHECK-NEXT:    i32.const 3
177; CHECK-NEXT:    i32.store 16
178; CHECK-NEXT:    local.get 0
179; CHECK-NEXT:    i32.const 4
180; CHECK-NEXT:    i32.store 12
181; CHECK-NEXT:    local.get 0
182; CHECK-NEXT:    i32.const 32
183; CHECK-NEXT:    i32.add
184; CHECK-NEXT:    global.set __stack_pointer
185; CHECK-NEXT:    i32.const 0
186; CHECK-NEXT:    # fallthrough-return
187;
188; CHECK-LABEL: main:
189; CHECK:         .functype main (i32, i32) -> (i32)
190; CHECK-NEXT:  # %bb.0: # %body
191; CHECK-NEXT:    call __original_main
192; CHECK-NEXT:    # fallthrough-return
193