1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -enable-machine-outliner -mtriple=x86_64-unknown-linux < %s | FileCheck %s
3@x = dso_local global i32 0, align 4
4
5define dso_local i32 @check_boundaries() #0 {
6; CHECK-LABEL: check_boundaries:
7; CHECK:       # %bb.0:
8; CHECK-NEXT:    pushq %rbp
9; CHECK-NEXT:    .cfi_def_cfa_offset 16
10; CHECK-NEXT:    .cfi_offset %rbp, -16
11; CHECK-NEXT:    movq %rsp, %rbp
12; CHECK-NEXT:    .cfi_def_cfa_register %rbp
13; CHECK-NEXT:    subq $20, %rsp
14; CHECK-NEXT:    movl $0, -20(%rbp)
15; CHECK-NEXT:    movl $0, -8(%rbp)
16; CHECK-NEXT:    xorl %eax, %eax
17; CHECK-NEXT:    testb %al, %al
18; CHECK-NEXT:    je .LBB0_1
19; CHECK-NEXT:  # %bb.2:
20; CHECK-NEXT:    movl $1, -4(%rbp)
21; CHECK-NEXT:    cmpl $0, -8(%rbp)
22; CHECK-NEXT:    je .LBB0_4
23; CHECK-NEXT:  .LBB0_5:
24; CHECK-NEXT:    movl $1, -4(%rbp)
25; CHECK-NEXT:    jmp .LBB0_6
26; CHECK-NEXT:  .LBB0_1:
27; CHECK-NEXT:    callq OUTLINED_FUNCTION_0
28; CHECK-NEXT:    cmpl $0, -8(%rbp)
29; CHECK-NEXT:    jne .LBB0_5
30; CHECK-NEXT:  .LBB0_4:
31; CHECK-NEXT:    callq OUTLINED_FUNCTION_0
32; CHECK-NEXT:  .LBB0_6:
33; CHECK-NEXT:    xorl %eax, %eax
34; CHECK-NEXT:    addq $20, %rsp
35; CHECK-NEXT:    popq %rbp
36; CHECK-NEXT:    .cfi_def_cfa %rsp, 8
37; CHECK-NEXT:    retq
38  %1 = alloca i32, align 4
39  %2 = alloca i32, align 4
40  %3 = alloca i32, align 4
41  %4 = alloca i32, align 4
42  %5 = alloca i32, align 4
43  store i32 0, i32* %1, align 4
44  store i32 0, i32* %2, align 4
45  %6 = load i32, i32* %2, align 4
46  %7 = icmp ne i32 %6, 0
47  br i1 %7, label %9, label %8
48
49  store i32 1, i32* %2, align 4
50  store i32 2, i32* %3, align 4
51  store i32 3, i32* %4, align 4
52  store i32 4, i32* %5, align 4
53  br label %10
54
55  store i32 1, i32* %4, align 4
56  br label %10
57
58  %11 = load i32, i32* %2, align 4
59  %12 = icmp ne i32 %11, 0
60  br i1 %12, label %14, label %13
61
62  store i32 1, i32* %2, align 4
63  store i32 2, i32* %3, align 4
64  store i32 3, i32* %4, align 4
65  store i32 4, i32* %5, align 4
66  br label %15
67
68  store i32 1, i32* %4, align 4
69  br label %15
70
71  ret i32 0
72}
73
74define dso_local i32 @main() #0 {
75; CHECK-LABEL: main:
76; CHECK:       # %bb.0:
77; CHECK-NEXT:    pushq %rbp
78; CHECK-NEXT:    .cfi_def_cfa_offset 16
79; CHECK-NEXT:    .cfi_offset %rbp, -16
80; CHECK-NEXT:    movq %rsp, %rbp
81; CHECK-NEXT:    .cfi_def_cfa_register %rbp
82; CHECK-NEXT:    subq $20, %rsp
83; CHECK-NEXT:    movl $0, -20(%rbp)
84; CHECK-NEXT:    callq OUTLINED_FUNCTION_1
85; CHECK-NEXT:    movl $1, x(%rip)
86; CHECK-NEXT:    #APP
87; CHECK-NEXT:    #NO_APP
88; CHECK-NEXT:    callq OUTLINED_FUNCTION_1
89; CHECK-NEXT:    xorl %eax, %eax
90; CHECK-NEXT:    addq $20, %rsp
91; CHECK-NEXT:    popq %rbp
92; CHECK-NEXT:    .cfi_def_cfa %rsp, 8
93; CHECK-NEXT:    retq
94  %1 = alloca i32, align 4
95  %2 = alloca i32, align 4
96  %3 = alloca i32, align 4
97  %4 = alloca i32, align 4
98  %5 = alloca i32, align 4
99
100  store i32 0, i32* %1, align 4
101  store i32 0, i32* @x, align 4
102  store i32 1, i32* %2, align 4
103  store i32 2, i32* %3, align 4
104  store i32 3, i32* %4, align 4
105  store i32 4, i32* %5, align 4
106  store i32 1, i32* @x, align 4
107  call void asm sideeffect "", "~{memory},~{dirflag},~{fpsr},~{flags}"()
108  store i32 1, i32* %2, align 4
109  store i32 2, i32* %3, align 4
110  store i32 3, i32* %4, align 4
111  store i32 4, i32* %5, align 4
112  ret i32 0
113}
114
115attributes #0 = { noredzone nounwind ssp uwtable "frame-pointer"="all" }
116