1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -mtriple=arm-- -run-pass=prologepilog -run-pass=machine-outliner \ 3# RUN: -verify-machineinstrs %s -o - | FileCheck %s 4 5--- | 6 define void @outline_call_arm() #0 { ret void } 7 define void @outline_call_thumb() #1 { ret void } 8 define void @outline_call_tailcall_arm() #0 { ret void } 9 define void @outline_call_tailcall_thumb() #1 { ret void } 10 define void @outline_call_KO_mcount() #0 { ret void } 11 define void @bar() #0 { ret void } 12 declare void @"\01mcount"() 13 14 attributes #0 = { minsize optsize } 15 attributes #1 = { minsize optsize "target-features"="+armv7-a,+thumb-mode" } 16... 17--- 18 19name: outline_call_arm 20tracksRegLiveness: true 21body: | 22 ; CHECK-LABEL: name: outline_call_arm 23 ; CHECK: bb.0: 24 ; CHECK: liveins: $r4, $lr 25 ; CHECK: $sp = frame-setup STMDB_UPD $sp, 14 /* CC::al */, $noreg, killed $r4, killed $lr 26 ; CHECK: frame-setup CFI_INSTRUCTION def_cfa_offset 8 27 ; CHECK: frame-setup CFI_INSTRUCTION offset $lr, -4 28 ; CHECK: frame-setup CFI_INSTRUCTION offset $r4, -8 29 ; CHECK: BL @OUTLINED_FUNCTION_2 30 ; CHECK: bb.1: 31 ; CHECK: BL @OUTLINED_FUNCTION_2 32 ; CHECK: bb.2: 33 ; CHECK: BL @OUTLINED_FUNCTION_2 34 ; CHECK: bb.3: 35 ; CHECK: BL @OUTLINED_FUNCTION_2 36 ; CHECK: bb.4: 37 ; CHECK: BL @OUTLINED_FUNCTION_2 38 ; CHECK: bb.5: 39 ; CHECK: $sp = frame-destroy LDMIA_UPD $sp, 14 /* CC::al */, $noreg, def $r4, def $lr 40 ; CHECK: BX_RET 14 /* CC::al */, $noreg 41 bb.0: 42 BL @bar, implicit-def dead $lr, implicit $sp 43 $r0 = MOVi 1, 14, $noreg, $noreg 44 $r1 = MOVi 1, 14, $noreg, $noreg 45 $r2 = MOVi 1, 14, $noreg, $noreg 46 $r3 = MOVi 1, 14, $noreg, $noreg 47 $r4 = MOVi 1, 14, $noreg, $noreg 48 bb.1: 49 BL @bar, implicit-def dead $lr, implicit $sp 50 $r0 = MOVi 1, 14, $noreg, $noreg 51 $r1 = MOVi 1, 14, $noreg, $noreg 52 $r2 = MOVi 1, 14, $noreg, $noreg 53 $r3 = MOVi 1, 14, $noreg, $noreg 54 $r4 = MOVi 1, 14, $noreg, $noreg 55 bb.2: 56 BL @bar, implicit-def dead $lr, implicit $sp 57 $r0 = MOVi 1, 14, $noreg, $noreg 58 $r1 = MOVi 1, 14, $noreg, $noreg 59 $r2 = MOVi 1, 14, $noreg, $noreg 60 $r3 = MOVi 1, 14, $noreg, $noreg 61 $r4 = MOVi 1, 14, $noreg, $noreg 62 bb.3: 63 BL @bar, implicit-def dead $lr, implicit $sp 64 $r0 = MOVi 1, 14, $noreg, $noreg 65 $r1 = MOVi 1, 14, $noreg, $noreg 66 $r2 = MOVi 1, 14, $noreg, $noreg 67 $r3 = MOVi 1, 14, $noreg, $noreg 68 $r4 = MOVi 1, 14, $noreg, $noreg 69 bb.4: 70 BL @bar, implicit-def dead $lr, implicit $sp 71 $r0 = MOVi 1, 14, $noreg, $noreg 72 $r1 = MOVi 1, 14, $noreg, $noreg 73 $r2 = MOVi 1, 14, $noreg, $noreg 74 $r3 = MOVi 1, 14, $noreg, $noreg 75 $r4 = MOVi 1, 14, $noreg, $noreg 76 bb.5: 77 BX_RET 14, $noreg 78... 79--- 80 81name: outline_call_thumb 82tracksRegLiveness: true 83body: | 84 ; CHECK-LABEL: name: outline_call_thumb 85 ; CHECK: bb.0: 86 ; CHECK: liveins: $r7, $lr 87 ; CHECK: $sp = frame-setup t2STMDB_UPD $sp, 14 /* CC::al */, $noreg, killed $r7, killed $lr 88 ; CHECK: frame-setup CFI_INSTRUCTION def_cfa_offset 8 89 ; CHECK: frame-setup CFI_INSTRUCTION offset $lr, -4 90 ; CHECK: frame-setup CFI_INSTRUCTION offset $r7, -8 91 ; CHECK: tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_4 92 ; CHECK: bb.1: 93 ; CHECK: tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_4 94 ; CHECK: bb.2: 95 ; CHECK: tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_4 96 ; CHECK: bb.3: 97 ; CHECK: tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_4 98 ; CHECK: bb.4: 99 ; CHECK: tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_4 100 ; CHECK: bb.5: 101 ; CHECK: $sp = frame-destroy t2LDMIA_RET $sp, 14 /* CC::al */, $noreg, def $r7, def $pc 102 bb.0: 103 tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp 104 $r0 = t2MOVi 1, 14, $noreg, $noreg 105 $r1 = t2MOVi 1, 14, $noreg, $noreg 106 $r2 = t2MOVi 1, 14, $noreg, $noreg 107 bb.1: 108 tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp 109 $r0 = t2MOVi 1, 14, $noreg, $noreg 110 $r1 = t2MOVi 1, 14, $noreg, $noreg 111 $r2 = t2MOVi 1, 14, $noreg, $noreg 112 bb.2: 113 tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp 114 $r0 = t2MOVi 1, 14, $noreg, $noreg 115 $r1 = t2MOVi 1, 14, $noreg, $noreg 116 $r2 = t2MOVi 1, 14, $noreg, $noreg 117 bb.3: 118 tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp 119 $r0 = t2MOVi 1, 14, $noreg, $noreg 120 $r1 = t2MOVi 1, 14, $noreg, $noreg 121 $r2 = t2MOVi 1, 14, $noreg, $noreg 122 bb.4: 123 tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp 124 $r0 = t2MOVi 1, 14, $noreg, $noreg 125 $r1 = t2MOVi 1, 14, $noreg, $noreg 126 $r2 = t2MOVi 1, 14, $noreg, $noreg 127 bb.5: 128 tBX_RET 14, $noreg 129... 130--- 131 132name: outline_call_tailcall_arm 133tracksRegLiveness: true 134body: | 135 ; CHECK-LABEL: name: outline_call_tailcall_arm 136 ; CHECK: bb.0: 137 ; CHECK: liveins: $r4, $lr 138 ; CHECK: $sp = frame-setup STMDB_UPD $sp, 14 /* CC::al */, $noreg, killed $r4, killed $lr 139 ; CHECK: frame-setup CFI_INSTRUCTION def_cfa_offset 8 140 ; CHECK: frame-setup CFI_INSTRUCTION offset $lr, -4 141 ; CHECK: frame-setup CFI_INSTRUCTION offset $r4, -8 142 ; CHECK: BL @OUTLINED_FUNCTION_0 143 ; CHECK: bb.1: 144 ; CHECK: BL @OUTLINED_FUNCTION_0 145 ; CHECK: bb.2: 146 ; CHECK: BL @OUTLINED_FUNCTION_0 147 ; CHECK: bb.3: 148 ; CHECK: BL @OUTLINED_FUNCTION_0 149 ; CHECK: bb.4: 150 ; CHECK: $sp = frame-destroy LDMIA_UPD $sp, 14 /* CC::al */, $noreg, def $r4, def $lr 151 ; CHECK: BX_RET 14 /* CC::al */, $noreg 152 bb.0: 153 BL @bar, implicit-def dead $lr, implicit $sp 154 $r0 = MOVi 2, 14, $noreg, $noreg 155 $r1 = MOVi 2, 14, $noreg, $noreg 156 $r2 = MOVi 2, 14, $noreg, $noreg 157 $r3 = MOVi 2, 14, $noreg, $noreg 158 $r4 = MOVi 2, 14, $noreg, $noreg 159 BL @bar, implicit-def dead $lr, implicit $sp 160 bb.1: 161 BL @bar, implicit-def dead $lr, implicit $sp 162 $r0 = MOVi 2, 14, $noreg, $noreg 163 $r1 = MOVi 2, 14, $noreg, $noreg 164 $r2 = MOVi 2, 14, $noreg, $noreg 165 $r3 = MOVi 2, 14, $noreg, $noreg 166 $r4 = MOVi 2, 14, $noreg, $noreg 167 BL @bar, implicit-def dead $lr, implicit $sp 168 bb.2: 169 BL @bar, implicit-def dead $lr, implicit $sp 170 $r0 = MOVi 2, 14, $noreg, $noreg 171 $r1 = MOVi 2, 14, $noreg, $noreg 172 $r2 = MOVi 2, 14, $noreg, $noreg 173 $r3 = MOVi 2, 14, $noreg, $noreg 174 $r4 = MOVi 2, 14, $noreg, $noreg 175 BL @bar, implicit-def dead $lr, implicit $sp 176 bb.3: 177 BL @bar, implicit-def dead $lr, implicit $sp 178 $r0 = MOVi 2, 14, $noreg, $noreg 179 $r1 = MOVi 2, 14, $noreg, $noreg 180 $r2 = MOVi 2, 14, $noreg, $noreg 181 $r3 = MOVi 2, 14, $noreg, $noreg 182 $r4 = MOVi 2, 14, $noreg, $noreg 183 BL @bar, implicit-def dead $lr, implicit $sp 184 bb.4: 185 BX_RET 14, $noreg 186... 187--- 188 189name: outline_call_tailcall_thumb 190tracksRegLiveness: true 191body: | 192 ; CHECK-LABEL: name: outline_call_tailcall_thumb 193 ; CHECK: bb.0: 194 ; CHECK: liveins: $r7, $lr 195 ; CHECK: $sp = frame-setup t2STMDB_UPD $sp, 14 /* CC::al */, $noreg, killed $r7, killed $lr 196 ; CHECK: frame-setup CFI_INSTRUCTION def_cfa_offset 8 197 ; CHECK: frame-setup CFI_INSTRUCTION offset $lr, -4 198 ; CHECK: frame-setup CFI_INSTRUCTION offset $r7, -8 199 ; CHECK: tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_3 200 ; CHECK: bb.1: 201 ; CHECK: tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_3 202 ; CHECK: bb.2: 203 ; CHECK: tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_3 204 ; CHECK: bb.3: 205 ; CHECK: tBL 14 /* CC::al */, $noreg, @OUTLINED_FUNCTION_3 206 ; CHECK: bb.4: 207 ; CHECK: $sp = frame-destroy t2LDMIA_RET $sp, 14 /* CC::al */, $noreg, def $r7, def $pc 208 bb.0: 209 tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp 210 $r0 = t2MOVi 2, 14, $noreg, $noreg 211 $r1 = t2MOVi 2, 14, $noreg, $noreg 212 $r2 = t2MOVi 2, 14, $noreg, $noreg 213 tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp 214 bb.1: 215 tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp 216 $r0 = t2MOVi 2, 14, $noreg, $noreg 217 $r1 = t2MOVi 2, 14, $noreg, $noreg 218 $r2 = t2MOVi 2, 14, $noreg, $noreg 219 tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp 220 bb.2: 221 tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp 222 $r0 = t2MOVi 2, 14, $noreg, $noreg 223 $r1 = t2MOVi 2, 14, $noreg, $noreg 224 $r2 = t2MOVi 2, 14, $noreg, $noreg 225 tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp 226 bb.3: 227 tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp 228 $r0 = t2MOVi 2, 14, $noreg, $noreg 229 $r1 = t2MOVi 2, 14, $noreg, $noreg 230 $r2 = t2MOVi 2, 14, $noreg, $noreg 231 tBL 14, $noreg, @bar, implicit-def dead $lr, implicit $sp 232 bb.4: 233 tBX_RET 14, $noreg 234... 235--- 236 237name: outline_call_KO_mcount 238tracksRegLiveness: true 239body: | 240 ; CHECK-LABEL: name: outline_call_KO_mcount 241 ; CHECK: bb.0: 242 ; CHECK: liveins: $r4, $lr 243 ; CHECK: $sp = frame-setup STMDB_UPD $sp, 14 /* CC::al */, $noreg, killed $r4, killed $lr 244 ; CHECK: frame-setup CFI_INSTRUCTION def_cfa_offset 8 245 ; CHECK: frame-setup CFI_INSTRUCTION offset $lr, -4 246 ; CHECK: frame-setup CFI_INSTRUCTION offset $r4, -8 247 ; CHECK: BL @"\01mcount", csr_aapcs, implicit-def dead $lr, implicit $sp 248 ; CHECK: BL @OUTLINED_FUNCTION_1 249 ; CHECK: bb.1: 250 ; CHECK: BL @"\01mcount", csr_aapcs, implicit-def dead $lr, implicit $sp 251 ; CHECK: BL @OUTLINED_FUNCTION_1 252 ; CHECK: bb.2: 253 ; CHECK: BL @"\01mcount", csr_aapcs, implicit-def dead $lr, implicit $sp 254 ; CHECK: BL @OUTLINED_FUNCTION_1 255 ; CHECK: bb.3: 256 ; CHECK: BL @"\01mcount", csr_aapcs, implicit-def dead $lr, implicit $sp 257 ; CHECK: BL @OUTLINED_FUNCTION_1 258 ; CHECK: bb.4: 259 ; CHECK: BL @"\01mcount", csr_aapcs, implicit-def dead $lr, implicit $sp 260 ; CHECK: BL @OUTLINED_FUNCTION_1 261 ; CHECK: bb.5: 262 ; CHECK: $sp = frame-destroy LDMIA_UPD $sp, 14 /* CC::al */, $noreg, def $r4, def $lr 263 ; CHECK: BX_RET 14 /* CC::al */, $noreg 264 bb.0: 265 BL @"\01mcount", csr_aapcs, implicit-def dead $lr, implicit $sp 266 $r0 = MOVi 3, 14, $noreg, $noreg 267 $r1 = MOVi 3, 14, $noreg, $noreg 268 $r2 = MOVi 3, 14, $noreg, $noreg 269 $r3 = MOVi 3, 14, $noreg, $noreg 270 $r4 = MOVi 3, 14, $noreg, $noreg 271 bb.1: 272 BL @"\01mcount", csr_aapcs, implicit-def dead $lr, implicit $sp 273 $r0 = MOVi 3, 14, $noreg, $noreg 274 $r1 = MOVi 3, 14, $noreg, $noreg 275 $r2 = MOVi 3, 14, $noreg, $noreg 276 $r3 = MOVi 3, 14, $noreg, $noreg 277 $r4 = MOVi 3, 14, $noreg, $noreg 278 bb.2: 279 BL @"\01mcount", csr_aapcs, implicit-def dead $lr, implicit $sp 280 $r0 = MOVi 3, 14, $noreg, $noreg 281 $r1 = MOVi 3, 14, $noreg, $noreg 282 $r2 = MOVi 3, 14, $noreg, $noreg 283 $r3 = MOVi 3, 14, $noreg, $noreg 284 $r4 = MOVi 3, 14, $noreg, $noreg 285 bb.3: 286 BL @"\01mcount", csr_aapcs, implicit-def dead $lr, implicit $sp 287 $r0 = MOVi 3, 14, $noreg, $noreg 288 $r1 = MOVi 3, 14, $noreg, $noreg 289 $r2 = MOVi 3, 14, $noreg, $noreg 290 $r3 = MOVi 3, 14, $noreg, $noreg 291 $r4 = MOVi 3, 14, $noreg, $noreg 292 bb.4: 293 BL @"\01mcount", csr_aapcs, implicit-def dead $lr, implicit $sp 294 $r0 = MOVi 3, 14, $noreg, $noreg 295 $r1 = MOVi 3, 14, $noreg, $noreg 296 $r2 = MOVi 3, 14, $noreg, $noreg 297 $r3 = MOVi 3, 14, $noreg, $noreg 298 $r4 = MOVi 3, 14, $noreg, $noreg 299 bb.5: 300 BX_RET 14, $noreg 301... 302--- 303 304name: bar 305tracksRegLiveness: true 306body: | 307 bb.0: 308 BX_RET 14, $noreg 309 310 ; CHECK-LABEL: name: OUTLINED_FUNCTION_0 311 ; CHECK: bb.0: 312 ; CHECK: liveins: $r11, $r10, $r9, $r8, $r7, $r6, $r5, $d15, $d14, $d13, $d12, $d11, $d10, $d9, $d8 313 ; CHECK: $r0 = MOVi 2, 14 /* CC::al */, $noreg, $noreg 314 ; CHECK: $r1 = MOVi 2, 14 /* CC::al */, $noreg, $noreg 315 ; CHECK: $r2 = MOVi 2, 14 /* CC::al */, $noreg, $noreg 316 ; CHECK: $r3 = MOVi 2, 14 /* CC::al */, $noreg, $noreg 317 ; CHECK: $r4 = MOVi 2, 14 /* CC::al */, $noreg, $noreg 318 ; CHECK: TAILJMPd @bar, implicit $sp 319 320 ; CHECK-LABEL: name: OUTLINED_FUNCTION_1 321 ; CHECK: bb.0: 322 ; CHECK: liveins: $r11, $r10, $r9, $r8, $r7, $r6, $r5, $d15, $d14, $d13, $d12, $d11, $d10, $d9, $d8 323 ; CHECK: $r0 = MOVi 3, 14 /* CC::al */, $noreg, $noreg 324 ; CHECK: $r1 = MOVi 3, 14 /* CC::al */, $noreg, $noreg 325 ; CHECK: $r2 = MOVi 3, 14 /* CC::al */, $noreg, $noreg 326 ; CHECK: $r3 = MOVi 3, 14 /* CC::al */, $noreg, $noreg 327 ; CHECK: $r4 = MOVi 3, 14 /* CC::al */, $noreg, $noreg 328 ; CHECK: MOVPCLR 14 /* CC::al */, $noreg 329 330 ; CHECK-LABEL: name: OUTLINED_FUNCTION_2 331 ; CHECK: bb.0: 332 ; CHECK: liveins: $r11, $r10, $r9, $r8, $r7, $r6, $r5, $d15, $d14, $d13, $d12, $d11, $d10, $d9, $d8 333 ; CHECK: $r0 = MOVi 1, 14 /* CC::al */, $noreg, $noreg 334 ; CHECK: $r1 = MOVi 1, 14 /* CC::al */, $noreg, $noreg 335 ; CHECK: $r2 = MOVi 1, 14 /* CC::al */, $noreg, $noreg 336 ; CHECK: $r3 = MOVi 1, 14 /* CC::al */, $noreg, $noreg 337 ; CHECK: $r4 = MOVi 1, 14 /* CC::al */, $noreg, $noreg 338 ; CHECK: MOVPCLR 14 /* CC::al */, $noreg 339 340 ; CHECK-LABEL: name: OUTLINED_FUNCTION_3 341 ; CHECK: bb.0: 342 ; CHECK: liveins: $r11, $r10, $r9, $r8, $r6, $r5, $r4, $d15, $d14, $d13, $d12, $d11, $d10, $d9, $d8 343 ; CHECK: $r0 = t2MOVi 2, 14 /* CC::al */, $noreg, $noreg 344 ; CHECK: $r1 = t2MOVi 2, 14 /* CC::al */, $noreg, $noreg 345 ; CHECK: $r2 = t2MOVi 2, 14 /* CC::al */, $noreg, $noreg 346 ; CHECK: tTAILJMPdND @bar, 14 /* CC::al */, $noreg, implicit $sp 347 348 ; CHECK-LABEL: name: OUTLINED_FUNCTION_4 349 ; CHECK: bb.0: 350 ; CHECK: liveins: $r11, $r10, $r9, $r8, $r6, $r5, $r4, $d15, $d14, $d13, $d12, $d11, $d10, $d9, $d8 351 ; CHECK: $r0 = t2MOVi 1, 14 /* CC::al */, $noreg, $noreg 352 ; CHECK: $r1 = t2MOVi 1, 14 /* CC::al */, $noreg, $noreg 353 ; CHECK: $r2 = t2MOVi 1, 14 /* CC::al */, $noreg, $noreg 354 ; CHECK: tBX_RET 14 /* CC::al */, $noreg 355