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