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