1# REQUIRES: asserts
2# RUN: llc -mtriple=aarch64-linux-gnu -run-pass=machine-outliner \
3# RUN:   -machine-outliner-reruns=0 -verify-machineinstrs %s -o - | FileCheck --check-prefix=ITER1 %s
4
5# RUN: llc -mtriple=aarch64-linux-gnu -run-pass=machine-outliner \
6# RUN:   -machine-outliner-reruns=1 -verify-machineinstrs %s -o - | FileCheck --check-prefix=ITER2 %s
7
8# RUN: llc -mtriple=aarch64-linux-gnu -run-pass=machine-outliner \
9# RUN:   -machine-outliner-reruns=2 -debug-only=machine-outliner \
10# RUN:   -verify-machineinstrs %s -o /dev/null 2>&1  | FileCheck --check-prefix=ITER3 %s
11
12--- |
13  declare void @z1(i32, i32)
14  declare void @z2(i32, i32, i32)
15  define void @a(i32 %p1) { unreachable }
16  define void @b(i32 %p1) { unreachable }
17...
18---
19#ITER1-LABEL: name: a
20#ITER1:      $w19 = ORRWrs $wzr, killed $w0, 0
21#ITER1-NEXT: BL @OUTLINED_FUNCTION_{{[0-9]+}}
22#ITER1-NEXT: $w1 = ORRWri $wzr, 1
23#ITER1-NEXT: BL @OUTLINED_FUNCTION_{{[0-9]+}}
24#ITER1-NEXT: $w1 = ORRWri $wzr, 1984
25#ITER1-NEXT: BL @OUTLINED_FUNCTION_{{[0-9]+}}
26#ITER1-NEXT: BL @OUTLINED_FUNCTION_{{[0-9]+}}
27
28#ITER2-LABEL: name: a
29#ITER2:      $w19 = ORRWrs $wzr, killed $w0, 0
30#ITER2-NEXT: BL @OUTLINED_FUNCTION_{{[0-9]+}}
31#ITER2-NEXT: $w1 = ORRWri $wzr, 1
32#ITER2-NEXT: BL @OUTLINED_FUNCTION_{{[0-9]+}}
33#ITER2-NEXT: BL @OUTLINED_FUNCTION_{{[0-9]+}}
34#ITER2-NEXT: BL @OUTLINED_FUNCTION_{{[0-9]+}}
35name:            a
36tracksRegLiveness: true
37liveins:
38  - { reg: '$w0', virtual-reg: '' }
39machineFunctionInfo:
40  hasRedZone:      false
41body:             |
42  bb.0:
43    liveins: $w0, $lr, $x19
44
45    early-clobber $sp = frame-setup STPXpre killed $x19, killed $lr, $sp, -2 :: (store 8), (store 8)
46    $w19 = ORRWrs $wzr, killed $w0, 0
47    $w0 = ORRWri $wzr, 0
48    $w1 = ORRWri $wzr, 1
49    BL @z1, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $w0, implicit killed $w1, implicit-def $sp
50    $w1 = ORRWri $wzr, 1
51    $w2 = ORRWri $wzr, 1920
52    $w0 = ORRWrs $wzr, $w19, 0
53    BL @z2, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $w0, implicit killed $w1, implicit killed $w2, implicit-def $sp
54    $w1 = ORRWri $wzr, 1984
55    $w2 = ORRWri $wzr, 1920
56    $w0 = ORRWrs $wzr, killed $w19, 0
57    BL @z2, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $w0, implicit killed $w1, implicit killed $w2, implicit-def $sp
58    $w0 = ORRWri $wzr, 0
59    $w1 = ORRWri $wzr, 1
60    BL @z1, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $w0, implicit killed $w1, implicit-def $sp
61    early-clobber $sp, $x19, $lr = frame-destroy LDPXpost $sp, 2 :: (load 8), (load 8)
62    RET undef $lr
63
64...
65---
66#ITER1-LABEL: name: b
67#ITER1:      $w19 = ORRWrs $wzr, killed $w0, 0
68#ITER1-NEXT: BL @OUTLINED_FUNCTION_{{[0-9]+}}
69#ITER1-NEXT: $w1 = ORRWri $wzr, 1984
70#ITER1-NEXT: BL @OUTLINED_FUNCTION_{{[0-9]+}}
71#ITER1-NEXT: $w1 = ORRWri $wzr, 1984
72#ITER1-NEXT: BL @OUTLINED_FUNCTION_{{[0-9]+}}
73#ITER1-NEXT: BL @OUTLINED_FUNCTION_{{[0-9]+}}
74
75#ITER2-LABEL: name: b
76#ITER2:      $w19 = ORRWrs $wzr, killed $w0, 0
77#ITER2-NEXT: BL @OUTLINED_FUNCTION_{{[0-9]+}}
78#ITER2-NEXT: BL @OUTLINED_FUNCTION_{{[0-9]+}}
79#ITER2-NEXT: BL @OUTLINED_FUNCTION_{{[0-9]+}}
80#ITER2-NEXT: BL @OUTLINED_FUNCTION_{{[0-9]+}}
81name:            b
82tracksRegLiveness: true
83liveins:
84  - { reg: '$w0', virtual-reg: '' }
85machineFunctionInfo:
86  hasRedZone:      false
87body:             |
88  bb.0:
89    liveins: $w0, $lr, $x19
90
91    early-clobber $sp = frame-setup STPXpre killed $x19, killed $lr, $sp, -2 :: (store 8), (store 8)
92    $w19 = ORRWrs $wzr, killed $w0, 0
93    $w0 = ORRWri $wzr, 0
94    $w1 = ORRWri $wzr, 1
95    BL @z1, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $w0, implicit killed $w1, implicit-def $sp
96    $w1 = ORRWri $wzr, 1984
97    $w2 = ORRWri $wzr, 1920
98    $w0 = ORRWrs $wzr, $w19, 0
99    BL @z2, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $w0, implicit killed $w1, implicit killed $w2, implicit-def $sp
100    $w1 = ORRWri $wzr, 1984
101    $w2 = ORRWri $wzr, 1920
102    $w0 = ORRWrs $wzr, killed $w19, 0
103    BL @z2, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $w0, implicit killed $w1, implicit killed $w2, implicit-def $sp
104    $w0 = ORRWri $wzr, 0
105    $w1 = ORRWri $wzr, 1
106    BL @z1, csr_aarch64_aapcs, implicit-def dead $lr, implicit $sp, implicit killed $w0, implicit killed $w1, implicit-def $sp
107    early-clobber $sp, $x19, $lr = frame-destroy LDPXpost $sp, 2 :: (load 8), (load 8)
108    RET undef $lr
109...
110
111#ITER1-LABEL: name: OUTLINED_FUNCTION_{{[0-9]+}}
112#ITER1-LABEL: name: OUTLINED_FUNCTION_{{[0-9]+}}
113
114#ITER2-LABEL: name: OUTLINED_FUNCTION_{{[0-9]+}}
115#ITER2-LABEL: name: OUTLINED_FUNCTION_{{[0-9]+}}
116#ITER2-LABEL: name: OUTLINED_FUNCTION_{{[0-9]+}}
117
118# ITER3: Did not outline on iteration 3 out of 3
119