1# RUN: llc -mtriple=aarch64-none-linux-gnu -run-pass=postra-machine-sink -verify-machineinstrs -o - %s | FileCheck %s 2 3--- 4# Sink w19 to %bb.1. 5# CHECK-LABEL: name: sinkcopy1 6# CHECK-LABEL: bb.0: 7# CHECK-NOT: $w19 = COPY killed $w0 8# CHECK-LABEL: bb.1: 9# CHECK: liveins: $w1, $w0 10# CHECK: renamable $w19 = COPY killed $w0 11 12name: sinkcopy1 13tracksRegLiveness: true 14body: | 15 bb.0: 16 liveins: $w0, $w1 17 $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv 18 renamable $w19 = COPY killed $w0 19 Bcc 11, %bb.1, implicit $nzcv 20 B %bb.2 21 22 bb.1: 23 liveins: $w1, $w19 24 $w0 = ADDWrr $w1, $w19 25 RET $x0 26 27 bb.2: 28 $w0 = COPY $wzr 29 RET $x0 30... 31 32--- 33# Sink w19 to %bb.2. 34# CHECK-LABEL: name: sinkcopy2 35# CHECK-LABEL: bb.0: 36# CHECK-NOT: renamable $w19 = COPY killed $w0 37# CHECK-LABEL: bb.2: 38# CHECK: liveins: $w1, $w0 39# CHECK: renamable $w19 = COPY killed $w0 40name: sinkcopy2 41tracksRegLiveness: true 42body: | 43 bb.0: 44 liveins: $w0, $w1 45 $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv 46 renamable $w19 = COPY killed $w0 47 Bcc 11, %bb.2, implicit $nzcv 48 B %bb.1 49 50 bb.1: 51 $w0 = COPY $wzr 52 RET $x0 53 54 bb.2: 55 liveins: $w1, $w19 56 $w0 = ADDWrr $w1, $w19 57 RET $x0 58... 59 60--- 61# Sink w19 and w20 to %bb.1. 62# CHECK-LABEL: name: sinkcopy3 63# CHECK-LABEL: bb.0: 64# CHECK-NOT: renamable $w19 = COPY killed $w0 65# CHECK-LABEL: bb.1: 66# CHECK: liveins: $w1, $w0 67# CHECK: renamable $w19 = COPY killed $w0 68# CHECK: renamable $w20 = COPY killed $w1 69name: sinkcopy3 70tracksRegLiveness: true 71body: | 72 bb.0: 73 liveins: $w0, $w1 74 $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv 75 renamable $w19 = COPY killed $w0 76 renamable $w20 = COPY killed $w1 77 78 bb.1: 79 liveins: $w19, $w20 80 $w0 = COPY $w19 81 $w1 = COPY $w20 82 RET $x0 83... 84 85 86# Sink w19 to %bb.1 and w20 to %bb.2. 87# CHECK-LABEL: name: sinkcopy4 88# CHECK-LABEL: bb.0: 89# CHECK-NOT: renamable $w19 = COPY killed $w0 90# CHECK-NOT: renamable $w20 = COPY killed $w1 91# CHECK-LABEL: bb.1: 92# CHECK: liveins: $w1, $w0 93# CHECK: renamable $w19 = COPY killed $w0 94# CHECK-LABEL: bb.2: 95# CHECK: liveins: $w0, $w1 96# CHECK: renamable $w20 = COPY killed $w1 97name: sinkcopy4 98tracksRegLiveness: true 99body: | 100 bb.0: 101 liveins: $w0, $w1 102 $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv 103 renamable $w19 = COPY killed $w0 104 renamable $w20 = COPY killed $w1 105 Bcc 11, %bb.2, implicit $nzcv 106 B %bb.1 107 108 bb.1: 109 liveins: $w1, $w19 110 $w0 = ADDWrr $w1, $w19 111 RET $x0 112 113 bb.2: 114 liveins: $w0, $w20 115 $w0 = ADDWrr $w0, $w20 116 RET $x0 117... 118 119# Sink w19 to %bb.3 through %bb.2. 120# CHECK-LABEL: name: sinkcopy5 121# CHECK-LABEL: bb.0: 122# CHECK-NOT: renamable $w19 = COPY $w0 123# CHECK-LABEL: bb.2: 124# CHECK: $w1 = ADDWrr $w1, $w0 125# CHECK-LABEL: bb.3: 126# CHECK: liveins: $w1, $w0 127# CHECK: renamable $w19 = COPY killed $w0 128name: sinkcopy5 129tracksRegLiveness: true 130body: | 131 bb.0: 132 liveins: $w0, $w1 133 $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv 134 renamable $w19 = COPY $w0 135 Bcc 11, %bb.2, implicit $nzcv 136 137 bb.1: 138 liveins: $x0 139 $w19 = COPY $wzr 140 RET $x0 141 142 bb.2: 143 liveins: $w0, $w1, $w19 144 $w1 = ADDWrr $w1, killed $w0 145 146 bb.3: 147 liveins: $w1, $w19 148 $w0 = ADDWrr $w1, $w19 149 RET $x0 150... 151 152# Sink w19 to %bb.3, but through %bb.2. 153# CHECK-LABEL: name: sinkcopy6 154# CHECK-LABEL: bb.0: 155# CHECK-NOT: renamable $w19 = COPY $w0 156# CHECK-NOT: renamable $w20 = COPY $w0 157# CHECK-LABEL: bb.2: 158# CHECK: liveins: $w1, $w0 159# CHECK: renamable $w19 = COPY $w0 160# CHECK: renamable $w20 = COPY $w19 161name: sinkcopy6 162tracksRegLiveness: true 163body: | 164 bb.0: 165 liveins: $w0, $w1 166 $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv 167 renamable $w19 = COPY $w0 168 renamable $w20 = COPY $w19 169 Bcc 11, %bb.2, implicit $nzcv 170 171 bb.1: 172 $w0 = COPY $wzr 173 RET $x0 174 175 bb.2: 176 liveins: $w1, $w20 177 $w0 = ADDWrr killed $w1, $w20 178 RET $x0 179... 180 181--- 182# Sink w19 regardless of the def of wzr in bb.0. 183# CHECK-LABEL: name: sinkcopy7 184# CHECK-LABEL: bb.0: 185# CHECK-NOT: renamable $w19 = COPY $w0 186# CHECK-LABEL: bb.2: 187# CHECK: renamable $w19 = COPY $wzr 188name: sinkcopy7 189tracksRegLiveness: true 190body: | 191 bb.0: 192 liveins: $w0, $w1 193 renamable $w19 = COPY $wzr 194 $wzr = SUBSWri $w1, 1, 0, implicit-def $nzcv 195 Bcc 11, %bb.2, implicit $nzcv 196 B %bb.1 197 198 bb.1: 199 $x0 = COPY $xzr 200 RET $x0 201 202 bb.2: 203 liveins: $w0, $w19 204 $w0 = ADDWrr $w0, $w19 205 RET $x0 206... 207 208--- 209# Sink w19 to %bb.3 through %bb.2. 210# CHECK-LABEL: name: sinkcopy8 211# CHECK-LABEL: bb.0: 212# CHECK-NOT: renamable $w19 = COPY $w0, implicit-def $x19 213# CHECK-LABEL: bb.2: 214# CHECK: $w1 = ADDWrr $w1, $w0, implicit $x0 215# CHECK-LABEL: bb.3: 216# CHECK: liveins: $x1, $w0 217# CHECK: renamable $w19 = COPY killed $w0, implicit-def $x19 218name: sinkcopy8 219tracksRegLiveness: true 220body: | 221 bb.0: 222 liveins: $w0, $x1 223 $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv 224 renamable $w19 = COPY $w0, implicit-def $x19 225 Bcc 11, %bb.2, implicit $nzcv 226 227 bb.1: 228 liveins: $x0 229 $w19 = COPY $wzr 230 RET $x0 231 232 bb.2: 233 liveins: $w0, $x1, $x19 234 $w1 = ADDWrr $w1, $w0, implicit killed $x0 235 236 bb.3: 237 liveins: $x1, $x19 238 $x0 = ADDXrr $x1, $x19 239 RET $x0 240... 241 242--- 243# Don't sink w19 as w0 is defined in bb.0. 244# CHECK-LABEL: name: donotsinkcopy1 245# CHECK-LABEL: bb.0: 246# CHECK: renamable $w19 = COPY $w0 247# CHECK: $w0 = LDRWui $sp, 0 248name: donotsinkcopy1 249tracksRegLiveness: true 250body: | 251 bb.0: 252 liveins: $w0, $w1 253 $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv 254 renamable $w19 = COPY $w0 255 $w0 = LDRWui $sp, 0 :: (load 4) 256 Bcc 11, %bb.2, implicit $nzcv 257 B %bb.1 258 259 bb.1: 260 $x0 = COPY $xzr 261 RET $x0 262 263 bb.2: 264 liveins: $w0, $w19 265 $w0 = ADDWrr $w0, $w19 266 RET $x0 267... 268 269--- 270# Don't sink w19 as w19 is used in bb.0. 271# CHECK-LABEL: name: donotsinkcopy2 272# CHECK-LABEL: bb.0: 273# CHECK: renamable $w19 = COPY $w0 274# CHECK: STRWui $w1, $x19, 0 275name: donotsinkcopy2 276tracksRegLiveness: true 277body: | 278 bb.0: 279 liveins: $w0, $w1 280 $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv 281 renamable $w19 = COPY $w0 282 STRWui $w1, $x19, 0 :: (store 4) 283 Bcc 11, %bb.2, implicit $nzcv 284 B %bb.1 285 286 bb.1: 287 $x0 = COPY $xzr 288 RET $x0 289 290 bb.2: 291 liveins: $w0, $w19 292 $w0 = ADDWrr $w0, $w19 293 RET $x0 294... 295 296--- 297# Don't sink w19 as w19 is used in both %bb.1 and %bb.2. 298# CHECK-LABEL: name: donotsinkcopy3 299# CHECK-LABEL: bb.0: 300# CHECK: renamable $w19 = COPY $w0 301name: donotsinkcopy3 302tracksRegLiveness: true 303body: | 304 bb.0: 305 liveins: $w0, $w1 306 $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv 307 renamable $w19 = COPY $w0 308 Bcc 11, %bb.2, implicit $nzcv 309 B %bb.1 310 311 bb.1: 312 liveins: $w19 313 $w0 = COPY $w19 314 RET $x0 315 316 bb.2: 317 liveins: $w0, $w19 318 $w0 = ADDWrr $w0, $w19 319 RET $x0 320... 321 322--- 323# Don't sink w19 as %bb.2 has multiple predecessors. 324# CHECK-LABEL: name: donotsinkcopy4 325# CHECK-LABEL: bb.0: 326# CHECK: renamable $w19 = COPY $w0 327name: donotsinkcopy4 328tracksRegLiveness: true 329body: | 330 bb.0: 331 liveins: $w0, $w1 332 $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv 333 renamable $w19 = COPY $w0 334 Bcc 11, %bb.2, implicit $nzcv 335 B %bb.1 336 337 bb.1: 338 liveins: $w0 339 $w19 = COPY $w0 340 B %bb.2 341 342 bb.2: 343 liveins: $w0, $w19 344 $w0 = ADDWrr $w0, $w19 345 RET $x0 346... 347 348 349# Don't sink w19 after sinking w20. 350# CHECK-LABEL: name: donotsinkcopy5 351# CHECK-LABEL: bb.0: 352# CHECK: renamable $w19 = COPY $w0 353# CHECK-LABEL: bb.2: 354# CHECK: liveins: $w0, $w19 355# CHECK: renamable $w20 = COPY $w19 356name: donotsinkcopy5 357tracksRegLiveness: true 358body: | 359 bb.0: 360 liveins: $w0, $w1 361 $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv 362 renamable $w19 = COPY $w0 363 renamable $w20 = COPY $w19 364 Bcc 11, %bb.2, implicit $nzcv 365 366 bb.1: 367 liveins: $w19 368 $w0 = COPY $w19 369 RET $x0 370 371 bb.2: 372 liveins: $w0, $w20 373 $w0 = ADDWrr killed $w0, $w20 374 RET $x0 375... 376 377--- 378# Don't sink w19 as x19 is live-in in %bb.2. 379# CHECK-LABEL: name: donotsinkcopy6 380# CHECK-LABEL: bb.0: 381name: donotsinkcopy6 382tracksRegLiveness: true 383body: | 384 bb.0: 385 liveins: $x0, $w1 386 $w1 = SUBSWri $w1, 1, 0, implicit-def $nzcv 387 renamable $x19 = COPY $x0 388 Bcc 11, %bb.2, implicit $nzcv 389 B %bb.1 390 391 bb.1: 392 liveins: $w19 393 $w0 = COPY $w19 394 RET $x0 395 396 bb.2: 397 liveins: $x0, $x19 398 $x0 = ADDXrr $x0, $x19 399 RET $x0 400... 401