xref: /llvm-project/llvm/test/CodeGen/X86/machine-outliner.ll (revision 2f448bf509432c1a19ec46ab8cbc7353c03c6280)
1; RUN: llc -enable-machine-outliner -mtriple=x86_64-apple-darwin < %s | FileCheck %s
2
3@x = global i32 0, align 4
4
5define i32 @check_boundaries() #0 {
6  ; CHECK-LABEL: _check_boundaries:
7  %1 = alloca i32, align 4
8  %2 = alloca i32, align 4
9  %3 = alloca i32, align 4
10  %4 = alloca i32, align 4
11  %5 = alloca i32, align 4
12  store i32 0, ptr %1, align 4
13  store i32 0, ptr %2, align 4
14  %6 = load i32, ptr %2, align 4
15  %7 = icmp ne i32 %6, 0
16  br i1 %7, label %9, label %8
17
18  ; CHECK: callq
19  ; CHECK-SAME: [[OFUNC1:OUTLINED_FUNCTION_[0-9]+]]
20  ; CHECK: cmpl  $0, -{{[0-9]+}}(%rbp)
21  store i32 1, ptr %2, align 4
22  store i32 2, ptr %3, align 4
23  store i32 3, ptr %4, align 4
24  store i32 4, ptr %5, align 4
25  br label %10
26
27  store i32 1, ptr %4, align 4
28  br label %10
29
30  %11 = load i32, ptr %2, align 4
31  %12 = icmp ne i32 %11, 0
32  br i1 %12, label %14, label %13
33
34  ; CHECK: callq
35  ; CHECK-SAME: [[OFUNC1]]
36  store i32 1, ptr %2, align 4
37  store i32 2, ptr %3, align 4
38  store i32 3, ptr %4, align 4
39  store i32 4, ptr %5, align 4
40  br label %15
41
42  store i32 1, ptr %4, align 4
43  br label %15
44
45  ret i32 0
46}
47
48define i32 @empty_1() #0 {
49  ; CHECK-LABEL: _empty_1:
50  ; CHECK-NOT: OUTLINED_FUNCTION
51  ret i32 1
52}
53
54define i32 @empty_2() #0 {
55  ; CHECK-LABEL: _empty_2
56  ; CHECK-NOT: OUTLINED_FUNCTION
57  ret i32 1
58}
59
60define i32 @no_empty_outlining() #0 {
61  ; CHECK-LABEL: _no_empty_outlining:
62  %1 = alloca i32, align 4
63  store i32 0, ptr %1, align 4
64  ; CHECK-NOT: OUTLINED_FUNCTION
65  %2 = call i32 @empty_1() #1
66  %3 = call i32 @empty_2() #1
67  %4 = call i32 @empty_1() #1
68  %5 = call i32 @empty_2() #1
69  %6 = call i32 @empty_1() #1
70  %7 = call i32 @empty_2() #1
71  ret i32 0
72}
73
74define i32 @main() #0 {
75  ; CHECK-LABEL: _main:
76  %1 = alloca i32, align 4
77  %2 = alloca i32, align 4
78  %3 = alloca i32, align 4
79  %4 = alloca i32, align 4
80  %5 = alloca i32, align 4
81
82  store i32 0, ptr %1, align 4
83  store i32 0, ptr @x, align 4
84  ; CHECK: callq
85  ; CHECK-SAME: [[OFUNC2:OUTLINED_FUNCTION_[0-9]+]]
86  store i32 1, ptr %2, align 4
87  store i32 2, ptr %3, align 4
88  store i32 3, ptr %4, align 4
89  store i32 4, ptr %5, align 4
90  store i32 1, ptr @x, align 4
91  call void asm sideeffect "", "~{memory},~{dirflag},~{fpsr},~{flags}"()
92  ; CHECK: callq
93  ; CHECK-SAME: [[OFUNC2]]
94  store i32 1, ptr %2, align 4
95  store i32 2, ptr %3, align 4
96  store i32 3, ptr %4, align 4
97  store i32 4, ptr %5, align 4
98  ret i32 0
99}
100
101attributes #0 = { noredzone nounwind ssp uwtable "frame-pointer"="all" }
102
103; CHECK: OUTLINED_FUNCTION_{{[0-9]+}}:
104; CHECK-DAG:      movl  $1, -{{[0-9]+}}(%rbp)
105; CHECK-NEXT: movl  $2, -{{[0-9]+}}(%rbp)
106; CHECK-NEXT: movl  $3, -{{[0-9]+}}(%rbp)
107; CHECK-NEXT: movl  $4, -{{[0-9]+}}(%rbp)
108; CHECK-NEXT: retq
109
110; CHECK: OUTLINED_FUNCTION_{{[0-9]+}}:
111; CHECK-DAG:      movl  $1, -{{[0-9]+}}(%rbp)
112; CHECK-NEXT: movl  $2, -{{[0-9]+}}(%rbp)
113; CHECK-NEXT: movl  $3, -{{[0-9]+}}(%rbp)
114; CHECK-NEXT: movl  $4, -{{[0-9]+}}(%rbp)
115; CHECK-NEXT: retq
116