xref: /llvm-project/llvm/test/CodeGen/AArch64/machine-outliner-patchable.mir (revision 6b62166b4cf8ec69f40a81d143fa1d623b4b0d0c)
1# RUN: llc -mtriple=aarch64-none-linux-gnu -run-pass machine-outliner -verify-machineinstrs -enable-machine-outliner %s -o - | FileCheck %s
2--- |
3  ; Function Attrs: minsize
4  declare void @foo(i32, i32, i32, i32) #0
5
6  ; Function Attrs: nounwind
7  define void @xray0(i1 %a) #1 {
8  entry:
9    br i1 %a, label %if.then, label %if.end
10
11  if.then:                                          ; preds = %entry
12    call void @foo(i32 1, i32 2, i32 3, i32 4)
13    br label %if.end
14
15  if.end:                                           ; preds = %if.then, %entry
16    call void @foo(i32 5, i32 6, i32 7, i32 8)
17    ret void
18  }
19
20  ; Function Attrs: nounwind
21  define void @xray1(i1 %a) #1 {
22  entry:
23    br i1 %a, label %if.then, label %if.end
24
25  if.then:                                          ; preds = %entry
26    call void @foo(i32 1, i32 2, i32 3, i32 4)
27    br label %if.end
28
29  if.end:                                           ; preds = %if.then, %entry
30    call void @foo(i32 5, i32 6, i32 7, i32 8)
31    ret void
32  }
33
34  attributes #0 = { minsize }
35  attributes #1 = { nounwind "function-instrument"="xray-always" }
36
37...
38---
39name:            xray0
40tracksRegLiveness: true
41liveins:
42  - { reg: '$w0', virtual-reg: '' }
43stack:
44  - { id: 0, name: '', type: spill-slot, offset: -16, size: 8, alignment: 16,
45      stack-id: default, callee-saved-register: '$lr', callee-saved-restored: true,
46      debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
47machineFunctionInfo:
48  hasRedZone:      false
49body:             |
50  ; CHECK-LABEL: name: xray0
51  ; CHECK:       bb.0.entry:
52  ; CHECK:         PATCHABLE_FUNCTION_ENTER
53  ; CHECK:       bb.1.if.then:
54  ; CHECK:         BL @[[OUTLINED_FUNCTION:OUTLINED_FUNCTION_[0-9]]]
55  ; CHECK:       bb.2.if.end:
56  ; CHECK-NEXT:    $w0 = MOVZWi 5, 0
57  ; CHECK-NEXT:    $w1 = MOVZWi 6, 0
58  ; CHECK-NEXT:    $w2 = MOVZWi 7, 0
59  ; CHECK-NEXT:    $w3 = MOVZWi 8, 0
60  ; CHECK-NEXT:    BL @foo, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $w0, implicit killed $w1, implicit killed $w2, implicit killed $w3, implicit-def $sp
61  ; CHECK:         $w0 = MOVZWi 5, 0
62  ; CHECK-NEXT:    $w1 = MOVZWi 6, 0
63  ; CHECK-NEXT:    PATCHABLE_FUNCTION_EXIT
64  ; CHECK-NEXT:    RET undef $lr
65
66  bb.0.entry:
67    successors: %bb.1(0x40000000), %bb.2(0x40000000)
68    liveins: $w0, $lr
69
70    PATCHABLE_FUNCTION_ENTER
71    early-clobber $sp = frame-setup STRXpre killed $lr, $sp, -16 :: (store (s64) into %stack.0)
72    TBZW killed renamable $w0, 0, %bb.2
73
74  bb.1.if.then:
75    successors: %bb.2(0x80000000)
76
77    $w0 = MOVZWi 1, 0
78    $w1 = MOVZWi 2, 0
79    $w2 = MOVZWi 3, 0
80    $w3 = MOVZWi 4, 0
81    BL @foo, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $w0, implicit killed $w1, implicit killed $w2, implicit killed $w3, implicit-def $sp
82
83  bb.2.if.end:
84    $w0 = MOVZWi 5, 0
85    $w1 = MOVZWi 6, 0
86    $w2 = MOVZWi 7, 0
87    $w3 = MOVZWi 8, 0
88    BL @foo, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $w0, implicit killed $w1, implicit killed $w2, implicit killed $w3, implicit-def $sp
89    early-clobber $sp, $lr = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.0)
90    $w0 = MOVZWi 5, 0
91    $w1 = MOVZWi 6, 0
92    PATCHABLE_FUNCTION_EXIT
93    RET undef $lr
94
95...
96---
97name:            xray1
98tracksRegLiveness: true
99liveins:
100  - { reg: '$w0', virtual-reg: '' }
101stack:
102  - { id: 0, name: '', type: spill-slot, offset: -16, size: 8, alignment: 16,
103      stack-id: default, callee-saved-register: '$lr', callee-saved-restored: true,
104      debug-info-variable: '', debug-info-expression: '', debug-info-location: '' }
105machineFunctionInfo:
106  hasRedZone:      false
107body:             |
108  ; CHECK-LABEL: name: xray1
109  ; CHECK:       bb.0.entry:
110  ; CHECK:         PATCHABLE_FUNCTION_ENTER
111  ; CHECK:       bb.1.if.then:
112  ; CHECK:         BL @[[OUTLINED_FUNCTION]]
113  ; CHECK:       bb.2.if.end:
114  ; CHECK-NEXT:    $w0 = MOVZWi 5, 0
115  ; CHECK-NEXT:    $w1 = MOVZWi 6, 0
116  ; CHECK-NEXT:    $w2 = MOVZWi 7, 0
117  ; CHECK-NEXT:    $w3 = MOVZWi 8, 0
118  ; CHECK-NEXT:    BL @foo, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $w0, implicit killed $w1, implicit killed $w2, implicit killed $w3, implicit-def $sp
119  ; CHECK:         $w0 = MOVZWi 5, 0
120  ; CHECK-NEXT:    $w1 = MOVZWi 6, 0
121  ; CHECK-NEXT:    PATCHABLE_FUNCTION_EXIT
122  ; CHECK-NEXT:    RET undef $lr
123
124  bb.0.entry:
125    successors: %bb.1(0x40000000), %bb.2(0x40000000)
126    liveins: $w0, $lr
127
128    PATCHABLE_FUNCTION_ENTER
129    early-clobber $sp = frame-setup STRXpre killed $lr, $sp, -16 :: (store (s64) into %stack.0)
130    TBZW killed renamable $w0, 0, %bb.2
131
132  bb.1.if.then:
133    successors: %bb.2(0x80000000)
134
135    $w0 = MOVZWi 1, 0
136    $w1 = MOVZWi 2, 0
137    $w2 = MOVZWi 3, 0
138    $w3 = MOVZWi 4, 0
139    BL @foo, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $w0, implicit killed $w1, implicit killed $w2, implicit killed $w3, implicit-def $sp
140
141  bb.2.if.end:
142    $w0 = MOVZWi 5, 0
143    $w1 = MOVZWi 6, 0
144    $w2 = MOVZWi 7, 0
145    $w3 = MOVZWi 8, 0
146    BL @foo, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $w0, implicit killed $w1, implicit killed $w2, implicit killed $w3, implicit-def $sp
147    early-clobber $sp, $lr = frame-destroy LDRXpost $sp, 16 :: (load (s64) from %stack.0)
148    $w0 = MOVZWi 5, 0
149    $w1 = MOVZWi 6, 0
150    PATCHABLE_FUNCTION_EXIT
151    RET undef $lr
152
153  ; CHECK: name: [[OUTLINED_FUNCTION]]
154  ; CHECK:     bb.0:
155  ; CHECK:       $w0 = MOVZWi 1, 0
156  ; CHECK-NEXT:  $w1 = MOVZWi 2, 0
157  ; CHECK-NEXT:  $w2 = MOVZWi 3, 0
158  ; CHECK-NEXT:  $w3 = MOVZWi 4, 0
159  ; CHECK-NEXT:  TCRETURNdi @foo, 0, implicit $sp
160
161...
162
163