611 lines · plain
1# RUN: llc -mtriple=aarch64--linux-gnu -run-pass=aarch64-copyelim %s -verify-machineinstrs -o - | FileCheck %s2---3# Check that bb.0 COPY is seen through to allow the bb.1 COPY of XZR to be removed.4# CHECK-LABEL: name: test15# CHECK-NOT: COPY $xzr6name: test17tracksRegLiveness: true8body: |9 bb.0:10 liveins: $x0, $x111 12 $x0 = COPY $x113 CBNZX $x1, %bb.214 15 bb.1:16 $x0 = COPY $xzr17 B %bb.318 19 bb.2:20 liveins: $x121 22 $x0 = LDRXui $x1, 023 24 bb.3:25 liveins: $x026 27 RET_ReallyLR implicit $x028 29...30# Similar to test1, but with reversed COPY.31# CHECK-LABEL: name: test232# CHECK-NOT: COPY $xzr33name: test234tracksRegLiveness: true35body: |36 bb.0:37 liveins: $x0, $x138 39 $x1 = COPY $x040 CBNZX $x1, %bb.241 42 bb.1:43 $x0 = COPY $xzr44 B %bb.345 46 bb.2:47 liveins: $x148 49 $x0 = LDRXui $x1, 050 51 bb.3:52 liveins: $x053 54 RET_ReallyLR implicit $x055 56...57# Similar to test1, but with a clobber that prevents removal of the XZR COPY.58# CHECK-LABEL: name: test359# CHECK: COPY $xzr60name: test361tracksRegLiveness: true62body: |63 bb.0:64 liveins: $x0, $x1, $x265 66 $x0 = COPY $x167 $x1 = LDRXui $x1, 068 CBNZX $x1, %bb.269 70 bb.1:71 $x0 = COPY $xzr72 B %bb.373 74 bb.2:75 liveins: $x176 77 $x0 = LDRXui $x1, 078 79 bb.3:80 liveins: $x081 82 RET_ReallyLR implicit $x083 84...85# Similar to test2, but with a clobber that prevents removal of the XZR COPY.86# CHECK-LABEL: name: test487# CHECK: COPY $xzr88name: test489tracksRegLiveness: true90body: |91 bb.0:92 liveins: $x0, $x1, $x293 94 $x1 = COPY $x095 $x1 = LDRXui $x1, 096 CBNZX $x1, %bb.297 98 bb.1:99 $x0 = COPY $xzr100 B %bb.3101 102 bb.2:103 liveins: $x1104 105 $x0 = LDRXui $x1, 0106 107 bb.3:108 liveins: $x0109 110 RET_ReallyLR implicit $x0111 112...113# Similar to test2, but with a clobber that prevents removal of the XZR COPY.114# CHECK-LABEL: name: test5115# CHECK: COPY $xzr116name: test5117tracksRegLiveness: true118body: |119 bb.0:120 liveins: $x0, $x1, $x2121 122 $x1 = COPY $x0123 $x0 = LDRXui $x1, 0124 CBNZX $x1, %bb.2125 126 bb.1:127 $x0 = COPY $xzr128 B %bb.3129 130 bb.2:131 liveins: $x1132 133 $x0 = LDRXui $x1, 0134 135 bb.3:136 liveins: $x0137 138 RET_ReallyLR implicit $x0139 140...141# Similar to test1, but with two levels of COPYs.142# CHECK-LABEL: name: test6143# CHECK-NOT: COPY $xzr144name: test6145tracksRegLiveness: true146body: |147 bb.0:148 liveins: $x0, $x1, $x2149 150 $x2 = COPY $x0151 $x1 = COPY $x2152 CBNZX $x1, %bb.2153 154 bb.1:155 $x0 = COPY $xzr156 B %bb.3157 158 bb.2:159 liveins: $x1160 161 $x0 = LDRXui $x1, 0162 163 bb.3:164 liveins: $x0165 166 RET_ReallyLR implicit $x0167 168...169# Similar to test1, but with two levels of COPYs and a clobber preventing COPY of XZR removal.170# CHECK-LABEL: name: test7171# CHECK: COPY $xzr172name: test7173tracksRegLiveness: true174body: |175 bb.0:176 liveins: $x0, $x1, $x2177 178 $x2 = COPY $x0179 $x0 = LDRXui $x1, 0180 $x1 = COPY $x2181 CBNZX $x1, %bb.2182 183 bb.1:184 $x0 = COPY $xzr185 B %bb.3186 187 bb.2:188 liveins: $x1189 190 $x0 = LDRXui $x1, 0191 192 bb.3:193 liveins: $x0194 195 RET_ReallyLR implicit $x0196 197...198# Check that the TargetRegs vector clobber update loop in199# AArch64RedundantCopyElimination::optimizeCopy works correctly.200# CHECK-LABEL: name: test8201# CHECK: x0 = COPY $xzr202# CHECK: x1 = COPY $xzr203name: test8204tracksRegLiveness: true205body: |206 bb.0:207 liveins: $x0, $x1, $x2208 209 $x1 = COPY $x0210 CBNZX $x1, %bb.2211 212 bb.1:213 liveins: $x0, $x2214 215 $x0, $x1 = LDPXi $x2, 0216 $x0 = COPY $xzr217 $x1 = COPY $xzr218 B %bb.3219 220 bb.2:221 liveins: $x1222 223 $x0 = LDRXui $x1, 0224 225 bb.3:226 liveins: $x0227 228 RET_ReallyLR implicit $x0229 230...231# Check that copy isn't removed from a block with multiple predecessors.232# CHECK-LABEL: name: test9233# CHECK: x0 = COPY $xzr234# CHECK-NEXT: B %bb.3235name: test9236tracksRegLiveness: true237body: |238 bb.0:239 liveins: $x0, $x1240 241 CBNZX $x0, %bb.2242 243 bb.1:244 liveins: $x0245 246 $x0 = COPY $xzr247 B %bb.3248 249 bb.2:250 liveins: $x1251 252 $x0 = LDRXui $x1, 0253 254 CBNZX $x1, %bb.1255 256 bb.3:257 liveins: $x0258 259 RET_ReallyLR implicit $x0260 261...262# Eliminate redundant MOVi32imm 7 in bb.1263# Note: 32-bit compare/32-bit move imm264# Kill marker should be removed from compare.265# CHECK-LABEL: name: test10266# CHECK: SUBSWri $w0, 7, 0, implicit-def $nzcv267# CHECK: bb.1:268# CHECK-NOT: MOVi32imm269name: test10270tracksRegLiveness: true271body: |272 bb.0.entry:273 liveins: $w0, $x1274 275 dead $wzr = SUBSWri killed $w0, 7, 0, implicit-def $nzcv276 Bcc 1, %bb.2, implicit killed $nzcv277 B %bb.1278 279 bb.1:280 liveins: $x1281 282 $w0 = MOVi32imm 7283 STRWui killed $w0, killed $x1, 0284 285 bb.2:286 RET_ReallyLR287...288# Eliminate redundant MOVi32imm 7 in bb.1289# Note: 64-bit compare/32-bit move imm w/implicit def290# Kill marker should be removed from compare.291# CHECK-LABEL: name: test11292# CHECK: SUBSXri $x0, 7, 0, implicit-def $nzcv293# CHECK: bb.1:294# CHECK-NOT: MOVi32imm295name: test11296tracksRegLiveness: true297body: |298 bb.0.entry:299 liveins: $x0, $x1300 301 dead $xzr = SUBSXri killed $x0, 7, 0, implicit-def $nzcv302 Bcc 1, %bb.2, implicit killed $nzcv303 B %bb.1304 305 bb.1:306 liveins: $x1307 308 $w0 = MOVi32imm 7, implicit-def $x0309 STRXui killed $x0, killed $x1, 0310 311 bb.2:312 RET_ReallyLR313...314# Eliminate redundant MOVi32imm 7 in bb.1315# Note: 64-bit compare/32-bit move imm316# Kill marker should be removed from compare.317# CHECK-LABEL: name: test12318# CHECK: SUBSXri $x0, 7, 0, implicit-def $nzcv319# CHECK: bb.1:320# CHECK-NOT: MOVi32imm321name: test12322tracksRegLiveness: true323body: |324 bb.0.entry:325 liveins: $x0, $x1326 327 dead $xzr = SUBSXri killed $x0, 7, 0, implicit-def $nzcv328 Bcc 1, %bb.2, implicit killed $nzcv329 B %bb.1330 331 bb.1:332 liveins: $x1333 334 $w0 = MOVi32imm 7335 STRWui killed $w0, killed $x1, 0336 337 bb.2:338 RET_ReallyLR339...340# Don't eliminate MOVi32imm 7 in bb.1 as we don't necessarily know the upper 32-bits.341# Note: 32-bit compare/32-bit move imm w/implicit def342# Kill marker should remain on compare.343# CHECK-LABEL: name: test13344# CHECK: SUBSWri killed $w0, 7, 0, implicit-def $nzcv345# CHECK: bb.1:346# CHECK: MOVi32imm347name: test13348tracksRegLiveness: true349body: |350 bb.0.entry:351 liveins: $w0, $x1352 353 dead $wzr = SUBSWri killed $w0, 7, 0, implicit-def $nzcv354 Bcc 1, %bb.2, implicit killed $nzcv355 B %bb.1356 357 bb.1:358 liveins: $x1359 360 $w0 = MOVi32imm 7, implicit-def $x0361 STRXui killed $x0, killed $x1, 0362 363 bb.2:364 RET_ReallyLR365...366# We can't eliminate the MOVi32imm because of the clobbering LDRWui.367# CHECK-LABEL: name: test14368# CHECK: bb.1:369# CHECK: MOVi32imm370name: test14371tracksRegLiveness: true372body: |373 bb.0.entry:374 liveins: $w0, $x1, $x2375 376 dead $wzr = SUBSWri killed $w0, 7, 0, implicit-def $nzcv377 $w0 = LDRWui $x1, 0378 STRWui killed $w0, killed $x2, 0379 Bcc 1, %bb.2, implicit killed $nzcv380 B %bb.1381 382 bb.1:383 liveins: $x1384 385 $w0 = MOVi32imm 7386 STRWui killed $w0, killed $x1, 0387 388 bb.2:389 RET_ReallyLR390...391# We can't eliminate the MOVi32imm because of the clobbering LDRWui.392# CHECK-LABEL: name: test15393# CHECK: bb.1:394# CHECK: MOVi32imm395name: test15396tracksRegLiveness: true397body: |398 bb.0.entry:399 liveins: $w0, $x1, $x2400 401 dead $wzr = SUBSWri killed $w0, 7, 0, implicit-def $nzcv402 Bcc 1, %bb.2, implicit killed $nzcv403 B %bb.1404 405 bb.1:406 liveins: $x1, $x2407 408 $w0 = LDRWui $x1, 0409 STRWui killed $w0, killed $x2, 0410 $w0 = MOVi32imm 7411 STRWui killed $w0, killed $x1, 0412 413 bb.2:414 RET_ReallyLR415...416# Check that bb.0 COPY is seen through to allow the bb.1 MOVi32imm to be removed.417# CHECK-LABEL: name: test16418# CHECK: bb.1:419# CHECK-NOT: MOVi32imm420name: test16421tracksRegLiveness: true422body: |423 bb.0.entry:424 liveins: $w0, $x1425 426 dead $wzr = SUBSWri $w0, 7, 0, implicit-def $nzcv427 $w2 = COPY $w0428 Bcc 1, %bb.2, implicit killed $nzcv429 B %bb.1430 431 bb.1:432 liveins: $x1433 434 $w2 = MOVi32imm 7435 STRWui killed $w2, killed $x1, 0436 437 bb.2:438 RET_ReallyLR439...440# Check that bb.1 MOVi32imm is not removed due to self clobbering compare.441# CHECK-LABEL: name: test17442# CHECK: bb.1:443# CHECK: MOVi32imm444name: test17445tracksRegLiveness: true446body: |447 bb.0.entry:448 liveins: $w0, $x1449 450 dead $w0 = SUBSWri killed $w0, 7, 0, implicit-def $nzcv451 Bcc 1, %bb.2, implicit killed $nzcv452 B %bb.1453 454 bb.1:455 liveins: $x1456 457 $w0 = MOVi32imm 7458 STRWui killed $w0, killed $x1, 0459 460 bb.2:461 RET_ReallyLR462...463# Make sure the MOVi64imm is not removed. In one version of this patch the464# MOVi64imm immediate was truncated to 32 bits and incorrectly matched because465# the low 32 bits of 4252017623040 are all zero.466# CHECK-LABEL: name: test18467# CHECK: bb.1:468# CHECK: MOVi64imm469name: test18470tracksRegLiveness: true471body: |472 bb.0.entry:473 liveins: $x0, $x1474 475 CBNZX killed $x0, %bb.2476 B %bb.1477 478 bb.1:479 liveins: $x1480 481 $x0 = MOVi64imm 4252017623040482 STRXui killed $x0, killed $x1, 0483 484 bb.2:485 RET_ReallyLR486...487# Eliminate redundant MOVi32imm -1 in bb.1488# Note: 32-bit compare/32-bit move imm489# Kill marker should be removed from compare.490# CHECK-LABEL: name: test19491# CHECK: ADDSWri $w0, 1, 0, implicit-def $nzcv492# CHECK: bb.1:493# CHECK-NOT: MOVi32imm494name: test19495tracksRegLiveness: true496body: |497 bb.0.entry:498 liveins: $w0, $x1499 500 dead $wzr = ADDSWri killed $w0, 1, 0, implicit-def $nzcv501 Bcc 1, %bb.2, implicit killed $nzcv502 B %bb.1503 504 bb.1:505 liveins: $x1506 507 $w0 = MOVi32imm -1508 STRWui killed $w0, killed $x1, 0509 510 bb.2:511 RET_ReallyLR512...513# Eliminate redundant MOVi64imm -1 in bb.1514# Note: 64-bit compare/64-bit move imm515# Kill marker should be removed from compare.516# CHECK-LABEL: name: test20517# CHECK: ADDSXri $x0, 1, 0, implicit-def $nzcv518# CHECK: bb.1:519# CHECK-NOT: MOVi64imm520name: test20521tracksRegLiveness: true522body: |523 bb.0:524 liveins: $x0, $x1525 526 dead $xzr = ADDSXri killed $x0, 1, 0, implicit-def $nzcv527 Bcc 1, %bb.2, implicit killed $nzcv528 B %bb.1529 530 bb.1:531 liveins: $x1532 533 $x0 = MOVi64imm -1534 STRXui killed $x0, killed $x1, 0535 536 bb.2:537 RET_ReallyLR538...539# Don't eliminate redundant MOVi32imm -1 in bb.1: the upper bits are nonzero.540# Note: 64-bit compare/32-bit move imm541# Kill marker should be removed from compare.542# CHECK-LABEL: name: test21543# CHECK: ADDSXri killed $x0, 1, 0, implicit-def $nzcv544# CHECK: bb.1:545# CHECK: MOVi32imm546name: test21547tracksRegLiveness: true548body: |549 bb.0.entry:550 liveins: $x0, $x1551 552 dead $xzr = ADDSXri killed $x0, 1, 0, implicit-def $nzcv553 Bcc 1, %bb.2, implicit killed $nzcv554 B %bb.1555 556 bb.1:557 liveins: $x1558 559 $w0 = MOVi32imm -1560 STRWui killed $w0, killed $x1, 0561 562 bb.2:563 RET_ReallyLR564...565# Don't eliminate MOVi64imm -1 in bb.1 as we don't necessarily know the upper 32-bits.566# Note: 32-bit compare/64-bit move imm567# CHECK-LABEL: name: test22568# CHECK: bb.1:569# CHECK: MOVi64imm570name: test22571tracksRegLiveness: true572body: |573 bb.0.entry:574 liveins: $w0, $x1575 576 dead $wzr = ADDSWri killed $w0, 1, 0, implicit-def $nzcv577 Bcc 1, %bb.2, implicit killed $nzcv578 B %bb.1579 580 bb.1:581 liveins: $x1582 583 $x0 = MOVi64imm -1584 STRXui killed $x0, killed $x1, 0585 586 bb.2:587 RET_ReallyLR588...589# Eliminate redundant MOVi32imm 4096 in bb.1 when the compare has a shifted immediate.590# CHECK-LABEL: name: test23591# CHECK: bb.1:592# CHECK-NOT: MOVi32imm593name: test23594tracksRegLiveness: true595body: |596 bb.0.entry:597 liveins: $w0, $x1598 599 dead $wzr = SUBSWri killed $w0, 1, 12, implicit-def $nzcv600 Bcc 1, %bb.2, implicit killed $nzcv601 B %bb.1602 603 bb.1:604 liveins: $x1605 606 $w0 = MOVi32imm 4096607 STRWui killed $w0, killed $x1, 0608 609 bb.2:610 RET_ReallyLR611