1# RUN: llc -mtriple=aarch64--- -run-pass=machine-outliner \
2# RUN: -verify-machineinstrs %s -o - | FileCheck %s
3
4# Show that, when instructions that use the stack are present, it's possible
5# for us to outline everything as the default outlining type.
6# It's possible for reg-save-possible to outline by storing LR to a register,
7# but most candidates in this case require us to modify the stack. The outliner
8# should see that it's more beneficial to fix up instructions and save LR to
9# the stack in this case.
10
11--- |
12  define void @reg-save-possible() #0 { ret void }
13  define void @stack-save1() #0 { ret void }
14  define void @stack-save2() #0 { ret void }
15  define void @stack-save3() #0 { ret void }
16  attributes #0 = { minsize noinline noredzone "frame-pointer"="all" }
17...
18---
19
20name:            reg-save-possible
21tracksRegLiveness: true
22body:             |
23  bb.0:
24  liveins: $lr
25  $lr = ORRXri $xzr, 1
26  $x19 = ORRXri $xzr, 1
27  $x20 = ORRXri $xzr, 1
28  bb.1:
29    liveins: $lr
30    ; CHECK-LABEL: name:            reg-save-possible
31    ; CHECK: $sp = STRXpre $lr, $sp, -16
32    ; CHECK-NEXT: BL [[FN:@OUTLINED_FUNCTION_[0-9]+]]
33    ; CHECK-NEXT: $sp, $lr = LDRXpost $sp, 16
34    $x20, $x19 = LDPXi $sp, 10
35    $x20, $x19 = LDPXi $sp, 10
36    $x20, $x19 = LDPXi $sp, 10
37    $x20, $x19 = LDPXi $sp, 10
38    $x20, $x19 = LDPXi $sp, 10
39  bb.2:
40    RET undef $lr
41
42...
43---
44
45name:            stack-save1
46tracksRegLiveness: true
47body:             |
48  bb.0:
49  liveins: $lr, $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15, $x18, $x19, $x20, $x21, $x22, $x23, $x20, $x21, $x22, $x23, $x24, $x25, $x26, $x27, $x28, $fp
50  $lr = ORRXri $xzr, 1
51  bb.1:
52  liveins: $lr, $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15, $x18, $x19, $x20, $x21, $x22, $x23, $x20, $x21, $x22, $x23, $x24, $x25, $x26, $x27, $x28, $fp
53    ; CHECK-LABEL: name:            stack-save1
54    ; CHECK: $sp = STRXpre $lr, $sp, -16
55    ; CHECK-NEXT: BL [[FN]]
56    ; CHECK-NEXT: $sp, $lr = LDRXpost $sp, 16
57    $x20, $x19 = LDPXi $sp, 10
58    $x20, $x19 = LDPXi $sp, 10
59    $x20, $x19 = LDPXi $sp, 10
60    $x20, $x19 = LDPXi $sp, 10
61    $x20, $x19 = LDPXi $sp, 10
62  bb.2:
63  liveins: $lr, $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15, $x18, $x19, $x20, $x21, $x22, $x23, $x20, $x21, $x22, $x23, $x24, $x25, $x26, $x27, $x28, $fp
64    RET undef $lr
65
66...
67---
68
69name:            stack-save2
70tracksRegLiveness: true
71body:             |
72  bb.0:
73  liveins: $lr, $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15, $x18, $x19, $x20, $x21, $x22, $x23, $x20, $x21, $x22, $x23, $x24, $x25, $x26, $x27, $x28, $fp
74  $lr = ORRXri $xzr, 1
75  bb.1:
76  liveins: $lr, $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15, $x18, $x19, $x20, $x21, $x22, $x23, $x20, $x21, $x22, $x23, $x24, $x25, $x26, $x27, $x28, $fp
77    ; CHECK-LABEL: name:            stack-save2
78    ; CHECK: $sp = STRXpre $lr, $sp, -16
79    ; CHECK-NEXT: BL [[FN]]
80    ; CHECK-NEXT: $sp, $lr = LDRXpost $sp, 16
81    $x20, $x19 = LDPXi $sp, 10
82    $x20, $x19 = LDPXi $sp, 10
83    $x20, $x19 = LDPXi $sp, 10
84    $x20, $x19 = LDPXi $sp, 10
85    $x20, $x19 = LDPXi $sp, 10
86  bb.2:
87  liveins: $lr, $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15, $x18, $x19, $x20, $x21, $x22, $x23, $x20, $x21, $x22, $x23, $x24, $x25, $x26, $x27, $x28, $fp
88    RET undef $lr
89
90...
91---
92
93name:            stack-save3
94tracksRegLiveness: true
95body:             |
96  bb.0:
97  liveins: $lr, $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15, $x18, $x19, $x20, $x21, $x22, $x23, $x20, $x21, $x22, $x23, $x24, $x25, $x26, $x27, $x28, $fp
98  $lr = ORRXri $xzr, 1
99  bb.1:
100  liveins: $lr, $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15, $x18, $x19, $x20, $x21, $x22, $x23, $x20, $x21, $x22, $x23, $x24, $x25, $x26, $x27, $x28, $fp
101    ; CHECK-LABEL: name:            stack-save3
102    ; CHECK: $sp = STRXpre $lr, $sp, -16
103    ; CHECK-NEXT: BL [[FN]]
104    ; CHECK-NEXT: $sp, $lr = LDRXpost $sp, 16
105    $x20, $x19 = LDPXi $sp, 10
106    $x20, $x19 = LDPXi $sp, 10
107    $x20, $x19 = LDPXi $sp, 10
108    $x20, $x19 = LDPXi $sp, 10
109    $x20, $x19 = LDPXi $sp, 10
110  bb.2:
111  liveins: $lr, $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15, $x18, $x19, $x20, $x21, $x22, $x23, $x20, $x21, $x22, $x23, $x24, $x25, $x26, $x27, $x28, $fp
112    RET undef $lr
113