| # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6 |
| # RUN: llc -mtriple=s390x-linux-gnu -mcpu=z196 -run-pass=liveintervals,two-address-instruction -o - %s | FileCheck -check-prefix=Z196 %s |
| # RUN: llc -mtriple=s390x-linux-gnu -mcpu=zEC12 -run-pass=liveintervals,two-address-instruction -o - %s | FileCheck -check-prefix=ZEC12 %s |
| |
| # Converting an AND to RISBMux or RISBGN drops the dead CC def, so the CC |
| # live range must be updated. |
| |
| --- |
| name: and_32 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $r2d, $r3l |
| |
| ; Z196-LABEL: name: and_32 |
| ; Z196: liveins: $r2d, $r3l |
| ; Z196-NEXT: {{ $}} |
| ; Z196-NEXT: [[COPY:%[0-9]+]]:gr64bit = COPY $r2d |
| ; Z196-NEXT: [[COPY1:%[0-9]+]]:grx32bit = COPY $r3l |
| ; Z196-NEXT: dead [[LOCGR:%[0-9]+]]:gr64bit = LOCGR undef [[LOCGR]], [[COPY]], 15, 8, implicit undef $cc |
| ; Z196-NEXT: [[COPY2:%[0-9]+]]:gr64bit = COPY [[COPY]] |
| ; Z196-NEXT: dead [[COPY2:%[0-9]+]]:gr64bit = LOCGR [[COPY2]], undef %3:gr64bit, 15, 8, implicit undef $cc |
| ; Z196-NEXT: [[RISBMux:%[0-9]+]]:grx32bit = RISBMux $noreg, [[COPY1]], 31, 159, 0 |
| ; Z196-NEXT: $r2l = COPY [[RISBMux]] |
| ; Z196-NEXT: $r3l = COPY [[COPY1]] |
| ; Z196-NEXT: Return implicit $r2l, implicit $r3l |
| ; |
| ; ZEC12-LABEL: name: and_32 |
| ; ZEC12: liveins: $r2d, $r3l |
| ; ZEC12-NEXT: {{ $}} |
| ; ZEC12-NEXT: [[COPY:%[0-9]+]]:gr64bit = COPY $r2d |
| ; ZEC12-NEXT: [[COPY1:%[0-9]+]]:grx32bit = COPY $r3l |
| ; ZEC12-NEXT: dead [[LOCGR:%[0-9]+]]:gr64bit = LOCGR undef [[LOCGR]], [[COPY]], 15, 8, implicit undef $cc |
| ; ZEC12-NEXT: [[COPY2:%[0-9]+]]:gr64bit = COPY [[COPY]] |
| ; ZEC12-NEXT: dead [[COPY2:%[0-9]+]]:gr64bit = LOCGR [[COPY2]], undef %3:gr64bit, 15, 8, implicit undef $cc |
| ; ZEC12-NEXT: [[RISBMux:%[0-9]+]]:grx32bit = RISBMux $noreg, [[COPY1]], 31, 159, 0 |
| ; ZEC12-NEXT: $r2l = COPY [[RISBMux]] |
| ; ZEC12-NEXT: $r3l = COPY [[COPY1]] |
| ; ZEC12-NEXT: Return implicit $r2l, implicit $r3l |
| %0:gr64bit = COPY $r2d |
| %1:grx32bit = COPY $r3l |
| %2:gr64bit = LOCGR %0, undef %3:gr64bit, 15, 8, implicit undef $cc |
| %4:gr64bit = LOCGR undef %3, %0, 15, 8, implicit undef $cc |
| %5:grx32bit = NIFMux %1, 1, implicit-def dead $cc |
| $r2l = COPY %5 |
| $r3l = COPY %1 |
| Return implicit $r2l, implicit $r3l |
| ... |
| |
| --- |
| name: and_64 |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $r2d, $r3d |
| |
| ; Z196-LABEL: name: and_64 |
| ; Z196: liveins: $r2d, $r3d |
| ; Z196-NEXT: {{ $}} |
| ; Z196-NEXT: [[COPY:%[0-9]+]]:gr64bit = COPY $r2d |
| ; Z196-NEXT: [[COPY1:%[0-9]+]]:gr64bit = COPY $r3d |
| ; Z196-NEXT: dead [[LOCGR:%[0-9]+]]:gr64bit = LOCGR undef [[LOCGR]], [[COPY]], 15, 8, implicit undef $cc |
| ; Z196-NEXT: [[COPY2:%[0-9]+]]:gr64bit = COPY [[COPY]] |
| ; Z196-NEXT: dead [[COPY2:%[0-9]+]]:gr64bit = LOCGR [[COPY2]], undef %3:gr64bit, 15, 8, implicit undef $cc |
| ; Z196-NEXT: [[RISBG:%[0-9]+]]:gr64bit = RISBG $noreg, [[COPY1]], 63, 175, 0, implicit-def dead $cc |
| ; Z196-NEXT: $r2d = COPY [[RISBG]] |
| ; Z196-NEXT: $r3d = COPY [[COPY1]] |
| ; Z196-NEXT: Return implicit $r2d, implicit $r3d |
| ; |
| ; ZEC12-LABEL: name: and_64 |
| ; ZEC12: liveins: $r2d, $r3d |
| ; ZEC12-NEXT: {{ $}} |
| ; ZEC12-NEXT: [[COPY:%[0-9]+]]:gr64bit = COPY $r2d |
| ; ZEC12-NEXT: [[COPY1:%[0-9]+]]:gr64bit = COPY $r3d |
| ; ZEC12-NEXT: dead [[LOCGR:%[0-9]+]]:gr64bit = LOCGR undef [[LOCGR]], [[COPY]], 15, 8, implicit undef $cc |
| ; ZEC12-NEXT: [[COPY2:%[0-9]+]]:gr64bit = COPY [[COPY]] |
| ; ZEC12-NEXT: dead [[COPY2:%[0-9]+]]:gr64bit = LOCGR [[COPY2]], undef %3:gr64bit, 15, 8, implicit undef $cc |
| ; ZEC12-NEXT: [[RISBGN:%[0-9]+]]:gr64bit = RISBGN $noreg, [[COPY1]], 63, 175, 0 |
| ; ZEC12-NEXT: $r2d = COPY [[RISBGN]] |
| ; ZEC12-NEXT: $r3d = COPY [[COPY1]] |
| ; ZEC12-NEXT: Return implicit $r2d, implicit $r3d |
| %0:gr64bit = COPY $r2d |
| %1:gr64bit = COPY $r3d |
| %2:gr64bit = LOCGR %0, undef %3:gr64bit, 15, 8, implicit undef $cc |
| %4:gr64bit = LOCGR undef %3, %0, 15, 8, implicit undef $cc |
| %5:gr64bit = NILL64 %1, 1, implicit-def dead $cc |
| $r2d = COPY %5 |
| $r3d = COPY %1 |
| Return implicit $r2d, implicit $r3d |
| ... |
| |
| # Don't convert if CC is live out of the AND. |
| --- |
| name: and_32_live_cc |
| tracksRegLiveness: true |
| body: | |
| bb.0: |
| liveins: $r2d, $r3l, $r4l, $r5l |
| |
| ; Z196-LABEL: name: and_32_live_cc |
| ; Z196: liveins: $r2d, $r3l, $r4l, $r5l |
| ; Z196-NEXT: {{ $}} |
| ; Z196-NEXT: [[COPY:%[0-9]+]]:gr64bit = COPY $r2d |
| ; Z196-NEXT: [[COPY1:%[0-9]+]]:grx32bit = COPY $r3l |
| ; Z196-NEXT: [[COPY2:%[0-9]+]]:gr32bit = COPY $r4l |
| ; Z196-NEXT: [[COPY3:%[0-9]+]]:gr32bit = COPY $r5l |
| ; Z196-NEXT: dead [[LOCGR:%[0-9]+]]:gr64bit = LOCGR undef [[LOCGR]], [[COPY]], 15, 8, implicit undef $cc |
| ; Z196-NEXT: [[COPY4:%[0-9]+]]:gr64bit = COPY [[COPY]] |
| ; Z196-NEXT: dead [[COPY4:%[0-9]+]]:gr64bit = LOCGR [[COPY4]], undef %5:gr64bit, 15, 8, implicit undef $cc |
| ; Z196-NEXT: [[COPY5:%[0-9]+]]:grx32bit = COPY [[COPY1]] |
| ; Z196-NEXT: [[COPY5:%[0-9]+]]:grx32bit = NIFMux [[COPY5]], 1, implicit-def $cc |
| ; Z196-NEXT: [[COPY6:%[0-9]+]]:gr32bit = COPY [[COPY2]] |
| ; Z196-NEXT: [[COPY6:%[0-9]+]]:gr32bit = LOCR [[COPY6]], [[COPY3]], 15, 8, implicit $cc |
| ; Z196-NEXT: $r2l = COPY [[COPY5]] |
| ; Z196-NEXT: $r3l = COPY [[COPY1]] |
| ; Z196-NEXT: $r4l = COPY [[COPY6]] |
| ; Z196-NEXT: Return implicit $r2l, implicit $r3l, implicit $r4l |
| ; |
| ; ZEC12-LABEL: name: and_32_live_cc |
| ; ZEC12: liveins: $r2d, $r3l, $r4l, $r5l |
| ; ZEC12-NEXT: {{ $}} |
| ; ZEC12-NEXT: [[COPY:%[0-9]+]]:gr64bit = COPY $r2d |
| ; ZEC12-NEXT: [[COPY1:%[0-9]+]]:grx32bit = COPY $r3l |
| ; ZEC12-NEXT: [[COPY2:%[0-9]+]]:gr32bit = COPY $r4l |
| ; ZEC12-NEXT: [[COPY3:%[0-9]+]]:gr32bit = COPY $r5l |
| ; ZEC12-NEXT: dead [[LOCGR:%[0-9]+]]:gr64bit = LOCGR undef [[LOCGR]], [[COPY]], 15, 8, implicit undef $cc |
| ; ZEC12-NEXT: [[COPY4:%[0-9]+]]:gr64bit = COPY [[COPY]] |
| ; ZEC12-NEXT: dead [[COPY4:%[0-9]+]]:gr64bit = LOCGR [[COPY4]], undef %5:gr64bit, 15, 8, implicit undef $cc |
| ; ZEC12-NEXT: [[COPY5:%[0-9]+]]:grx32bit = COPY [[COPY1]] |
| ; ZEC12-NEXT: [[COPY5:%[0-9]+]]:grx32bit = NIFMux [[COPY5]], 1, implicit-def $cc |
| ; ZEC12-NEXT: [[COPY6:%[0-9]+]]:gr32bit = COPY [[COPY2]] |
| ; ZEC12-NEXT: [[COPY6:%[0-9]+]]:gr32bit = LOCR [[COPY6]], [[COPY3]], 15, 8, implicit $cc |
| ; ZEC12-NEXT: $r2l = COPY [[COPY5]] |
| ; ZEC12-NEXT: $r3l = COPY [[COPY1]] |
| ; ZEC12-NEXT: $r4l = COPY [[COPY6]] |
| ; ZEC12-NEXT: Return implicit $r2l, implicit $r3l, implicit $r4l |
| %0:gr64bit = COPY $r2d |
| %1:grx32bit = COPY $r3l |
| %2:gr32bit = COPY $r4l |
| %3:gr32bit = COPY $r5l |
| %4:gr64bit = LOCGR %0, undef %5:gr64bit, 15, 8, implicit undef $cc |
| %6:gr64bit = LOCGR undef %5, %0, 15, 8, implicit undef $cc |
| %7:grx32bit = NIFMux %1, 1, implicit-def $cc |
| %8:gr32bit = LOCR %2, %3, 15, 8, implicit killed $cc |
| $r2l = COPY %7 |
| $r3l = COPY %1 |
| $r4l = COPY %8 |
| Return implicit $r2l, implicit $r3l, implicit $r4l |
| ... |