1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -enable-machine-outliner -mtriple=lanai-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; CHECK-LABEL: check_boundaries:
9; CHECK:       .Lcheck_boundaries$local:
10; CHECK-NEXT:    .type .Lcheck_boundaries$local,@function
11; CHECK-NEXT:    .cfi_startproc
12; CHECK-NEXT:  ! %bb.0:
13; CHECK-NEXT:    st %fp, [--%sp]
14; CHECK-NEXT:    add %sp, 0x8, %fp
15; CHECK-NEXT:    sub %sp, 0x20, %sp
16; CHECK-NEXT:    st %r0, -12[%fp]
17; CHECK-NEXT:    sub.f %r0, 0x0, %r0
18; CHECK-NEXT:    st %r0, -16[%fp]
19; CHECK-NEXT:    beq .LBB0_1
20; CHECK-NEXT:    mov 0x1, %r3
21; CHECK-NEXT:  .LBB0_2:
22; CHECK-NEXT:    bt .LBB0_3
23; CHECK-NEXT:    st %r3, -24[%fp]
24; CHECK-NEXT:  .LBB0_1:
25; CHECK-NEXT:    st %r3, -16[%fp]
26; CHECK-NEXT:    mov 0x2, %r3
27; CHECK-NEXT:    st %r3, -20[%fp]
28; CHECK-NEXT:    mov 0x3, %r3
29; CHECK-NEXT:    st %r3, -24[%fp]
30; CHECK-NEXT:    mov 0x4, %r3
31; CHECK-NEXT:    st %r3, -28[%fp]
32; CHECK-NEXT:  .LBB0_3:
33; CHECK-NEXT:    ld -16[%fp], %r3
34; CHECK-NEXT:    sub.f %r3, 0x0, %r0
35; CHECK-NEXT:    beq .LBB0_4
36; CHECK-NEXT:    nop
37; CHECK-NEXT:  .LBB0_5:
38; CHECK-NEXT:    mov 0x1, %r3
39; CHECK-NEXT:    bt .LBB0_6
40; CHECK-NEXT:    st %r3, -24[%fp]
41; CHECK-NEXT:  .LBB0_4:
42; CHECK-NEXT:    mov 0x1, %r3
43; CHECK-NEXT:    st %r3, -16[%fp]
44; CHECK-NEXT:    mov 0x2, %r3
45; CHECK-NEXT:    st %r3, -20[%fp]
46; CHECK-NEXT:    mov 0x3, %r3
47; CHECK-NEXT:    st %r3, -24[%fp]
48; CHECK-NEXT:    mov 0x4, %r3
49; CHECK-NEXT:    st %r3, -28[%fp]
50; CHECK-NEXT:  .LBB0_6:
51; CHECK-NEXT:    or %r0, 0x0, %rv
52; CHECK-NEXT:    ld -4[%fp], %pc ! return
53; CHECK-NEXT:    add %fp, 0x0, %sp
54; CHECK-NEXT:    ld -8[%fp], %fp
55  %1 = alloca i32, align 4
56  %2 = alloca i32, align 4
57  %3 = alloca i32, align 4
58  %4 = alloca i32, align 4
59  %5 = alloca i32, align 4
60  store i32 0, i32* %1, align 4
61  store i32 0, i32* %2, align 4
62  %6 = load i32, i32* %2, align 4
63  %7 = icmp ne i32 %6, 0
64  br i1 %7, label %9, label %8
65
66  store i32 1, i32* %2, align 4
67  store i32 2, i32* %3, align 4
68  store i32 3, i32* %4, align 4
69  store i32 4, i32* %5, align 4
70  br label %10
71
72  store i32 1, i32* %4, align 4
73  br label %10
74
75  %11 = load i32, i32* %2, align 4
76  %12 = icmp ne i32 %11, 0
77  br i1 %12, label %14, label %13
78
79  store i32 1, i32* %2, align 4
80  store i32 2, i32* %3, align 4
81  store i32 3, i32* %4, align 4
82  store i32 4, i32* %5, align 4
83  br label %15
84
85  store i32 1, i32* %4, align 4
86  br label %15
87
88  ret i32 0
89}
90
91define dso_local i32 @main() #0 {
92; CHECK-LABEL: main:
93; CHECK:       .Lmain$local:
94; CHECK-NEXT:    .type .Lmain$local,@function
95; CHECK-NEXT:    .cfi_startproc
96; CHECK-NEXT:  ! %bb.0:
97; CHECK-NEXT:    st %fp, [--%sp]
98; CHECK-NEXT:    add %sp, 0x8, %fp
99; CHECK-NEXT:    sub %sp, 0x20, %sp
100; CHECK-NEXT:    st %r0, -12[%fp]
101; CHECK-NEXT:    mov hi(x), %r3
102; CHECK-NEXT:    or %r3, lo(x), %r3
103; CHECK-NEXT:    mov 0x1, %r9
104; CHECK-NEXT:    st %r9, -16[%fp]
105; CHECK-NEXT:    mov 0x2, %r12
106; CHECK-NEXT:    st %r12, -20[%fp]
107; CHECK-NEXT:    mov 0x3, %r13
108; CHECK-NEXT:    st %r13, -24[%fp]
109; CHECK-NEXT:    mov 0x4, %r14
110; CHECK-NEXT:    st %r14, -28[%fp]
111; CHECK-NEXT:    st %r9, 0[%r3]
112; CHECK-NEXT:    !APP
113; CHECK-NEXT:    !NO_APP
114; CHECK-NEXT:    st %r9, -16[%fp]
115; CHECK-NEXT:    st %r12, -20[%fp]
116; CHECK-NEXT:    st %r13, -24[%fp]
117; CHECK-NEXT:    st %r14, -28[%fp]
118; CHECK-NEXT:    or %r0, 0x0, %rv
119; CHECK-NEXT:    ld -4[%fp], %pc ! return
120; CHECK-NEXT:    add %fp, 0x0, %sp
121; CHECK-NEXT:    ld -8[%fp], %fp
122  %1 = alloca i32, align 4
123  %2 = alloca i32, align 4
124  %3 = alloca i32, align 4
125  %4 = alloca i32, align 4
126  %5 = alloca i32, align 4
127
128  store i32 0, i32* %1, align 4
129  store i32 0, i32* @x, align 4
130  store i32 1, i32* %2, align 4
131  store i32 2, i32* %3, align 4
132  store i32 3, i32* %4, align 4
133  store i32 4, i32* %5, align 4
134  store i32 1, i32* @x, align 4
135  call void asm sideeffect "", "~{memory},~{dirflag},~{fpsr},~{flags}"()
136  store i32 1, i32* %2, align 4
137  store i32 2, i32* %3, align 4
138  store i32 3, i32* %4, align 4
139  store i32 4, i32* %5, align 4
140  ret i32 0
141}
142
143attributes #0 = { noredzone nounwind ssp uwtable "frame-pointer"="all" }
144