[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / AArch64 / machine-outliner-bad-register.mir
blob500f73a6bd582272c1e1591f429505f737a2f887
1 # RUN: llc -mtriple=aarch64--- -run-pass=machine-outliner \
2 # RUN: -verify-machineinstrs %s -o - | FileCheck %s
4 # Ensure that we don't outline from regions where x16, x17, or nzcv are live
5 # across the outlining candidate. These values are allowed to be clobbered by,
6 # say, the linker, in the presence of function calls. Thus, we can't outline
7 # these, since the insertion of the outlined call could change the values of
8 # these registers.
9 --- |
10   ; No problematic register appears at all. Safe for outlining.
11   define void @reg_never_defined() #0 { ret void }
13   ; A problematic register is live, but after the candidate. Safe for outlining.
14   define void @reg_defined_after_candidate() #0 { ret void }
16   ; A problematic register is live before the candidate, but killed before
17   ; entry to the candidate. Safe for outlining.
18   define void @reg_killed_before_candidate() #0 { ret void }
20   ; Ensure that we never outline when any of the problematic registers we care
21   ; about are defined across the outlining candidate.
22   define void @x16_live() #0 { ret void }
23   define void @x17_live() #0 { ret void }
24   define void @nzcv_live() #0 { ret void }
26   ; Test a combination of the above behaviours.
27   ; [candidate] (1)
28   ; - define a bad register -
29   ; [candidate] (2)
30   ; - kill the bad register -
31   ; [candidate] (3)
32   ;
33   ; (1) and (3) should be outlined, while (2) should not be outlined.
34   define void @multiple_ranges() #0 { ret void }
36   attributes #0 = { noredzone }
37 ...
38 ---
40 # There should be two calls to outlined functions here, since we haven't tripped
41 # any of the cases above.
42 name:           reg_never_defined
43 tracksRegLiveness: true
44 body:             |
45   bb.0:
46     ; CHECK-LABEL: bb.0:
47     ; CHECK: BL
48     liveins: $w8, $wzr
49     $w8 = ORRWri $wzr, 1
50     $w8 = ORRWri $wzr, 2
51     $w8 = ORRWri $wzr, 3
52     $w8 = ORRWri $wzr, 4
53   bb.1:
54     ; CHECK-LABEL: bb.1:
55     ; CHECK: BL
56     liveins: $w8, $wzr
57     $w8 = ORRWri $wzr, 1
58     $w8 = ORRWri $wzr, 2
59     $w8 = ORRWri $wzr, 3
60     $w8 = ORRWri $wzr, 4
61   bb.2:
62     RET undef $lr
63 ...
64 ---
66 name:            reg_defined_after_candidate
67 tracksRegLiveness: true
68 body:             |
69   bb.0:
70     ; CHECK-LABEL: bb.0:
71     ; CHECK: BL
72     ; CHECK-NEXT: $x16 = ORRXri $x8, 5, implicit-def $x16, implicit-def $w16
73     liveins: $w8, $wzr
74     $w8 = ORRWri $wzr, 1
75     $w8 = ORRWri $wzr, 2
76     $w8 = ORRWri $wzr, 3
77     $w8 = ORRWri $wzr, 4
78     $x16 = ORRXri $x8, 5, implicit-def $x16, implicit-def $w16
79     $w8 = ORRWri $w16, 5
80     RET undef $lr
81 ...
82 ---
84 name:            reg_killed_before_candidate
85 tracksRegLiveness: true
86 body:             |
87   bb.0:
88     ; CHECK-LABEL: bb.0:
89     ; CHECK: BL
90     liveins: $w8, $wzr, $x16
91     dead $x16 = ORRXri $x8, 6
92     $w8 = ORRWri $wzr, 1
93     $w8 = ORRWri $wzr, 2
94     $w8 = ORRWri $wzr, 3
95     $w8 = ORRWri $wzr, 4
96     RET undef $lr
97 ...
98 ---
100 name:            x16_live
101 tracksRegLiveness: true
102 body:             |
103   bb.0:
104     ; CHECK-LABEL: bb.0:
105     ; CHECK-NOT: BL
106     liveins: $w8, $wzr, $x16
107     $w8 = ORRWri $wzr, 1
108     $w8 = ORRWri $wzr, 2
109     $w8 = ORRWri $wzr, 3
110     $w8 = ORRWri $wzr, 4
111   bb.1:
112     liveins: $x16
113     RET undef $lr
117 name:            x17_live
118 tracksRegLiveness: true
119 body:             |
120   bb.0:
121     ; CHECK-LABEL: bb.0:
122     ; CHECK-NOT: BL
123     liveins: $w8, $wzr, $x17
124     $w8 = ORRWri $wzr, 1
125     $w8 = ORRWri $wzr, 2
126     $w8 = ORRWri $wzr, 3
127     $w8 = ORRWri $wzr, 4
128     $w8 = ORRWri $w17, 5
129     RET undef $lr
133 name:            nzcv_live
134 tracksRegLiveness: true
135 body:             |
136   bb.0:
137     liveins: $w8, $wzr, $nzcv
138     ; CHECK-LABEL: bb.0:
139     ; CHECK-NOT: BL
140     $w8 = ORRWri $wzr, 1
141     $w8 = ORRWri $wzr, 2
142     $w8 = ORRWri $wzr, 3
143     $w8 = ORRWri $wzr, 4
144   bb.1:
145     liveins: $nzcv
146     RET undef $lr
150 name:            multiple_ranges
151 tracksRegLiveness: true
152 body:             |
153   bb.0:
154     ; CHECK-LABEL: bb.0:
155     ; CHECK: BL
156     liveins: $w8, $wzr
157     $w8 = ORRWri $wzr, 1
158     $w8 = ORRWri $wzr, 2
159     $w8 = ORRWri $wzr, 3
160     $w8 = ORRWri $wzr, 4
161     $x16 = ORRXri $x8, 5, implicit-def $x16
162   bb.1:
163     ; CHECK-LABEL: bb.1:
164     ; CHECK-NOT: BL
165     liveins: $w8, $x16
166     $w8 = ORRWri $wzr, 1
167     $w8 = ORRWri $wzr, 2
168     $w8 = ORRWri $wzr, 3
169     $w8 = ORRWri $wzr, 4
170   bb.2:
171     ; CHECK-LABEL: bb.2:
172     ; CHECK: BL
173     liveins: $w8, $x16
174     dead $x16 = ORRXri $x8, 0
175     $w8 = ORRWri $wzr, 1
176     $w8 = ORRWri $wzr, 2
177     $w8 = ORRWri $wzr, 3
178     $w8 = ORRWri $wzr, 4
179   bb.3:
180     liveins: $w8
181     RET undef $lr