| # NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6 | |
| # RUN: llc -mtriple=amdgpu12.50 -run-pass=gcn-create-vopd -verify-machineinstrs %s -o - | FileCheck %s | |
| # A VOPD3 component cannot encode a literal, so the pass moves the value into a | |
| # free scalar register. The move goes next to the pair it serves. These tests | |
| # cover where it lands and when the pair has to be given up instead. | |
| # The pair is in a loop. The move goes with it, inside the loop body, so it | |
| # needs no register live across the back edge. | |
| --- | |
| name: move_stays_in_loop_body | |
| tracksRegLiveness: true | |
| body: | | |
| ; CHECK-LABEL: name: move_stays_in_loop_body | |
| ; CHECK: bb.0: | |
| ; CHECK-NEXT: successors: %bb.1(0x80000000) | |
| ; CHECK-NEXT: liveins: $vgpr0, $vgpr1 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: S_BRANCH %bb.1 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: bb.1: | |
| ; CHECK-NEXT: successors: %bb.1(0x40000000), %bb.2(0x40000000) | |
| ; CHECK-NEXT: liveins: $vgpr0, $vgpr1 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: $sgpr0 = S_MOV_B32 300 | |
| ; CHECK-NEXT: $vgpr4, $vgpr5 = V_DUAL_SUB_U32_e32_X_SUB_U32_e32_e96_gfx1250 $vgpr0, $vgpr1, $sgpr0, $vgpr1, implicit $exec, implicit $exec, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: S_CBRANCH_SCC1 %bb.1, implicit undef $scc | |
| ; CHECK-NEXT: S_BRANCH %bb.2 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: bb.2: | |
| ; CHECK-NEXT: S_ENDPGM 0 | |
| bb.0: | |
| successors: %bb.1 | |
| liveins: $vgpr0, $vgpr1 | |
| S_BRANCH %bb.1 | |
| bb.1: | |
| successors: %bb.1, %bb.2 | |
| liveins: $vgpr0, $vgpr1 | |
| $vgpr4 = V_SUB_U32_e32 $vgpr0, $vgpr1, implicit $exec | |
| $vgpr5 = V_SUB_U32_e32 300, $vgpr1, implicit $mode, implicit $exec | |
| S_CBRANCH_SCC1 %bb.1, implicit undef $scc | |
| S_BRANCH %bb.2 | |
| bb.2: | |
| S_ENDPGM 0 | |
| ... | |
| # An unreachable block needs no special treatment: the move goes next to its | |
| # pair, in that same block. | |
| --- | |
| name: unreachable_use | |
| tracksRegLiveness: true | |
| body: | | |
| ; CHECK-LABEL: name: unreachable_use | |
| ; CHECK: bb.0: | |
| ; CHECK-NEXT: liveins: $vgpr0, $vgpr1 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: S_ENDPGM 0 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: bb.1: | |
| ; CHECK-NEXT: liveins: $vgpr0, $vgpr1 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: $sgpr0 = S_MOV_B32 300 | |
| ; CHECK-NEXT: $vgpr4, $vgpr5 = V_DUAL_SUB_U32_e32_X_SUB_U32_e32_e96_gfx1250 $vgpr0, $vgpr1, $sgpr0, $vgpr1, implicit $exec, implicit $exec, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: S_ENDPGM 0 | |
| bb.0: | |
| liveins: $vgpr0, $vgpr1 | |
| S_ENDPGM 0 | |
| bb.1: | |
| liveins: $vgpr0, $vgpr1 | |
| $vgpr4 = V_SUB_U32_e32 $vgpr0, $vgpr1, implicit $exec | |
| $vgpr5 = V_SUB_U32_e32 300, $vgpr1, implicit $mode, implicit $exec | |
| S_ENDPGM 0 | |
| ... | |
| # The first two instructions match, but the pair would need a move for each of | |
| # its two literals, which is more than it saves. Giving it up has to release the | |
| # second instruction, which pairs with the third one for a single move. | |
| --- | |
| name: rejected_pair_releases_second_instruction | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $vgpr0, $vgpr1 | |
| ; CHECK-LABEL: name: rejected_pair_releases_second_instruction | |
| ; CHECK: liveins: $vgpr0, $vgpr1 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: $vgpr4 = V_SUB_U32_e32 300, $vgpr1, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: $sgpr0 = S_MOV_B32 400 | |
| ; CHECK-NEXT: $vgpr5, $vgpr6 = V_DUAL_SUB_U32_e32_X_SUB_U32_e32_e96_gfx1250 $sgpr0, $vgpr1, $vgpr0, $vgpr1, implicit $exec, implicit $mode, implicit $exec, implicit $exec | |
| ; CHECK-NEXT: S_ENDPGM 0 | |
| $vgpr4 = V_SUB_U32_e32 300, $vgpr1, implicit $mode, implicit $exec | |
| $vgpr5 = V_SUB_U32_e32 400, $vgpr1, implicit $mode, implicit $exec | |
| $vgpr6 = V_SUB_U32_e32 $vgpr0, $vgpr1, implicit $exec | |
| S_ENDPGM 0 | |
| ... | |
| # Both overlapping edges form one pair, so prefer the edge which needs no | |
| # scalar move. | |
| --- | |
| name: prefer_pair_without_materialization | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $vgpr0, $vgpr1 | |
| ; CHECK-LABEL: name: prefer_pair_without_materialization | |
| ; CHECK: liveins: $vgpr0, $vgpr1 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: $vgpr4 = V_SUB_U32_e32 300, $vgpr1, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: $vgpr5, $vgpr6 = V_DUAL_SUB_U32_e32_X_SUB_U32_e32_e96_gfx1250 $vgpr0, $vgpr1, $vgpr0, $vgpr1, implicit $exec, implicit $exec, implicit $exec | |
| ; CHECK-NEXT: S_ENDPGM 0 | |
| $vgpr4 = V_SUB_U32_e32 300, $vgpr1, implicit $mode, implicit $exec | |
| $vgpr5 = V_SUB_U32_e32 $vgpr0, $vgpr1, implicit $exec | |
| $vgpr6 = V_SUB_U32_e32 $vgpr0, $vgpr1, implicit $exec | |
| S_ENDPGM 0 | |
| ... | |
| # Maximizing the number of pairs takes priority over minimizing moves. Pair | |
| # the first and second instructions and the third and fourth instructions. | |
| --- | |
| name: maximize_pairs_before_minimizing_moves | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $vgpr0, $vgpr1 | |
| ; CHECK-LABEL: name: maximize_pairs_before_minimizing_moves | |
| ; CHECK: liveins: $vgpr0, $vgpr1 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: $sgpr0 = S_MOV_B32 300 | |
| ; CHECK-NEXT: $vgpr4, $vgpr5 = V_DUAL_SUB_U32_e32_X_SUB_U32_e32_e96_gfx1250 $sgpr0, $vgpr1, $vgpr0, $vgpr1, implicit $exec, implicit $mode, implicit $exec, implicit $exec | |
| ; CHECK-NEXT: $sgpr0 = S_MOV_B32 400 | |
| ; CHECK-NEXT: $vgpr6, $vgpr7 = V_DUAL_SUB_U32_e32_X_SUB_U32_e32_e96_gfx1250 $vgpr0, $vgpr1, $sgpr0, $vgpr1, implicit $exec, implicit $exec, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: S_ENDPGM 0 | |
| $vgpr4 = V_SUB_U32_e32 300, $vgpr1, implicit $mode, implicit $exec | |
| $vgpr5 = V_SUB_U32_e32 $vgpr0, $vgpr1, implicit $exec | |
| $vgpr6 = V_SUB_U32_e32 $vgpr0, $vgpr1, implicit $exec | |
| $vgpr7 = V_SUB_U32_e32 400, $vgpr1, implicit $mode, implicit $exec | |
| S_ENDPGM 0 | |
| ... | |
| # The first edge cannot use $sgpr0 because that edge reads it, and every other | |
| # scalar register is live. The overlapping second edge can use $sgpr0. | |
| --- | |
| name: no_free_register_edge_does_not_hide_next | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $sgpr0, $sgpr1, $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7, $sgpr8_sgpr9_sgpr10_sgpr11, $sgpr12_sgpr13_sgpr14_sgpr15, $sgpr16_sgpr17_sgpr18_sgpr19, $sgpr20_sgpr21_sgpr22_sgpr23, $sgpr24_sgpr25_sgpr26_sgpr27, $sgpr28_sgpr29_sgpr30_sgpr31, $sgpr32_sgpr33_sgpr34_sgpr35, $sgpr36_sgpr37_sgpr38_sgpr39, $sgpr40_sgpr41_sgpr42_sgpr43, $sgpr44_sgpr45_sgpr46_sgpr47, $sgpr48_sgpr49_sgpr50_sgpr51, $sgpr52_sgpr53_sgpr54_sgpr55, $sgpr56_sgpr57_sgpr58_sgpr59, $sgpr60_sgpr61_sgpr62_sgpr63, $sgpr64_sgpr65_sgpr66_sgpr67, $sgpr68_sgpr69_sgpr70_sgpr71, $sgpr72_sgpr73_sgpr74_sgpr75, $sgpr76_sgpr77_sgpr78_sgpr79, $sgpr80_sgpr81_sgpr82_sgpr83, $sgpr84_sgpr85_sgpr86_sgpr87, $sgpr88_sgpr89_sgpr90_sgpr91, $sgpr92_sgpr93_sgpr94_sgpr95, $sgpr96_sgpr97_sgpr98_sgpr99, $sgpr100_sgpr101_sgpr102_sgpr103, $sgpr104, $sgpr105, $vgpr0, $vgpr1 | |
| ; CHECK-LABEL: name: no_free_register_edge_does_not_hide_next | |
| ; CHECK: liveins: $sgpr0, $sgpr1, $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7, $sgpr8_sgpr9_sgpr10_sgpr11, $sgpr12_sgpr13_sgpr14_sgpr15, $sgpr16_sgpr17_sgpr18_sgpr19, $sgpr20_sgpr21_sgpr22_sgpr23, $sgpr24_sgpr25_sgpr26_sgpr27, $sgpr28_sgpr29_sgpr30_sgpr31, $sgpr32_sgpr33_sgpr34_sgpr35, $sgpr36_sgpr37_sgpr38_sgpr39, $sgpr40_sgpr41_sgpr42_sgpr43, $sgpr44_sgpr45_sgpr46_sgpr47, $sgpr48_sgpr49_sgpr50_sgpr51, $sgpr52_sgpr53_sgpr54_sgpr55, $sgpr56_sgpr57_sgpr58_sgpr59, $sgpr60_sgpr61_sgpr62_sgpr63, $sgpr64_sgpr65_sgpr66_sgpr67, $sgpr68_sgpr69_sgpr70_sgpr71, $sgpr72_sgpr73_sgpr74_sgpr75, $sgpr76_sgpr77_sgpr78_sgpr79, $sgpr80_sgpr81_sgpr82_sgpr83, $sgpr84_sgpr85_sgpr86_sgpr87, $sgpr88_sgpr89_sgpr90_sgpr91, $sgpr92_sgpr93_sgpr94_sgpr95, $sgpr96_sgpr97_sgpr98_sgpr99, $sgpr100_sgpr101_sgpr102_sgpr103, $sgpr104, $sgpr105, $vgpr0, $vgpr1 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: $vgpr4 = V_SUB_U32_e32 $sgpr0, $vgpr1, implicit $exec | |
| ; CHECK-NEXT: $sgpr0 = S_MOV_B32 300 | |
| ; CHECK-NEXT: $vgpr5, $vgpr6 = V_DUAL_SUB_U32_e32_X_SUB_U32_e32_e96_gfx1250 $sgpr0, $vgpr1, $vgpr0, $vgpr1, implicit $exec, implicit $mode, implicit $exec, implicit $exec | |
| ; CHECK-NEXT: S_NOP 0, implicit $sgpr1, implicit $sgpr2_sgpr3, implicit $sgpr4_sgpr5_sgpr6_sgpr7, implicit $sgpr8_sgpr9_sgpr10_sgpr11, implicit $sgpr12_sgpr13_sgpr14_sgpr15, implicit $sgpr16_sgpr17_sgpr18_sgpr19, implicit $sgpr20_sgpr21_sgpr22_sgpr23, implicit $sgpr24_sgpr25_sgpr26_sgpr27, implicit $sgpr28_sgpr29_sgpr30_sgpr31, implicit $sgpr32_sgpr33_sgpr34_sgpr35, implicit $sgpr36_sgpr37_sgpr38_sgpr39, implicit $sgpr40_sgpr41_sgpr42_sgpr43, implicit $sgpr44_sgpr45_sgpr46_sgpr47, implicit $sgpr48_sgpr49_sgpr50_sgpr51, implicit $sgpr52_sgpr53_sgpr54_sgpr55, implicit $sgpr56_sgpr57_sgpr58_sgpr59, implicit $sgpr60_sgpr61_sgpr62_sgpr63, implicit $sgpr64_sgpr65_sgpr66_sgpr67, implicit $sgpr68_sgpr69_sgpr70_sgpr71, implicit $sgpr72_sgpr73_sgpr74_sgpr75, implicit $sgpr76_sgpr77_sgpr78_sgpr79, implicit $sgpr80_sgpr81_sgpr82_sgpr83, implicit $sgpr84_sgpr85_sgpr86_sgpr87, implicit $sgpr88_sgpr89_sgpr90_sgpr91, implicit $sgpr92_sgpr93_sgpr94_sgpr95, implicit $sgpr96_sgpr97_sgpr98_sgpr99, implicit $sgpr100_sgpr101_sgpr102_sgpr103, implicit $sgpr104_sgpr105 | |
| ; CHECK-NEXT: S_ENDPGM 0 | |
| $vgpr4 = V_SUB_U32_e32 $sgpr0, $vgpr1, implicit $exec | |
| $vgpr5 = V_SUB_U32_e32 300, $vgpr1, implicit $mode, implicit $exec | |
| $vgpr6 = V_SUB_U32_e32 $vgpr0, $vgpr1, implicit $exec | |
| S_NOP 0, implicit $sgpr1, implicit $sgpr2_sgpr3, implicit $sgpr4_sgpr5_sgpr6_sgpr7, implicit $sgpr8_sgpr9_sgpr10_sgpr11, implicit $sgpr12_sgpr13_sgpr14_sgpr15, implicit $sgpr16_sgpr17_sgpr18_sgpr19, implicit $sgpr20_sgpr21_sgpr22_sgpr23, implicit $sgpr24_sgpr25_sgpr26_sgpr27, implicit $sgpr28_sgpr29_sgpr30_sgpr31, implicit $sgpr32_sgpr33_sgpr34_sgpr35, implicit $sgpr36_sgpr37_sgpr38_sgpr39, implicit $sgpr40_sgpr41_sgpr42_sgpr43, implicit $sgpr44_sgpr45_sgpr46_sgpr47, implicit $sgpr48_sgpr49_sgpr50_sgpr51, implicit $sgpr52_sgpr53_sgpr54_sgpr55, implicit $sgpr56_sgpr57_sgpr58_sgpr59, implicit $sgpr60_sgpr61_sgpr62_sgpr63, implicit $sgpr64_sgpr65_sgpr66_sgpr67, implicit $sgpr68_sgpr69_sgpr70_sgpr71, implicit $sgpr72_sgpr73_sgpr74_sgpr75, implicit $sgpr76_sgpr77_sgpr78_sgpr79, implicit $sgpr80_sgpr81_sgpr82_sgpr83, implicit $sgpr84_sgpr85_sgpr86_sgpr87, implicit $sgpr88_sgpr89_sgpr90_sgpr91, implicit $sgpr92_sgpr93_sgpr94_sgpr95, implicit $sgpr96_sgpr97_sgpr98_sgpr99, implicit $sgpr100_sgpr101_sgpr102_sgpr103, implicit $sgpr104_sgpr105 | |
| S_ENDPGM 0 | |
| ... | |
| # Every adjacent edge needs two distinct immediate values, so none is eligible. | |
| --- | |
| name: every_edge_needs_two_values | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7, $sgpr8_sgpr9_sgpr10_sgpr11, $sgpr12_sgpr13_sgpr14_sgpr15, $sgpr16_sgpr17_sgpr18_sgpr19, $sgpr20_sgpr21_sgpr22_sgpr23, $sgpr24_sgpr25_sgpr26_sgpr27, $sgpr28_sgpr29_sgpr30_sgpr31, $sgpr32_sgpr33_sgpr34_sgpr35, $sgpr36_sgpr37_sgpr38_sgpr39, $sgpr40_sgpr41_sgpr42_sgpr43, $sgpr44_sgpr45_sgpr46_sgpr47, $sgpr48_sgpr49_sgpr50_sgpr51, $sgpr52_sgpr53_sgpr54_sgpr55, $sgpr56_sgpr57_sgpr58_sgpr59, $sgpr60_sgpr61_sgpr62_sgpr63, $sgpr64_sgpr65_sgpr66_sgpr67, $sgpr68_sgpr69_sgpr70_sgpr71, $sgpr72_sgpr73_sgpr74_sgpr75, $sgpr76_sgpr77_sgpr78_sgpr79, $sgpr80_sgpr81_sgpr82_sgpr83, $sgpr84_sgpr85_sgpr86_sgpr87, $sgpr88_sgpr89_sgpr90_sgpr91, $sgpr92_sgpr93_sgpr94_sgpr95, $sgpr96_sgpr97_sgpr98_sgpr99, $sgpr100_sgpr101_sgpr102_sgpr103, $sgpr104, $sgpr105, $vgpr1 | |
| ; CHECK-LABEL: name: every_edge_needs_two_values | |
| ; CHECK: liveins: $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7, $sgpr8_sgpr9_sgpr10_sgpr11, $sgpr12_sgpr13_sgpr14_sgpr15, $sgpr16_sgpr17_sgpr18_sgpr19, $sgpr20_sgpr21_sgpr22_sgpr23, $sgpr24_sgpr25_sgpr26_sgpr27, $sgpr28_sgpr29_sgpr30_sgpr31, $sgpr32_sgpr33_sgpr34_sgpr35, $sgpr36_sgpr37_sgpr38_sgpr39, $sgpr40_sgpr41_sgpr42_sgpr43, $sgpr44_sgpr45_sgpr46_sgpr47, $sgpr48_sgpr49_sgpr50_sgpr51, $sgpr52_sgpr53_sgpr54_sgpr55, $sgpr56_sgpr57_sgpr58_sgpr59, $sgpr60_sgpr61_sgpr62_sgpr63, $sgpr64_sgpr65_sgpr66_sgpr67, $sgpr68_sgpr69_sgpr70_sgpr71, $sgpr72_sgpr73_sgpr74_sgpr75, $sgpr76_sgpr77_sgpr78_sgpr79, $sgpr80_sgpr81_sgpr82_sgpr83, $sgpr84_sgpr85_sgpr86_sgpr87, $sgpr88_sgpr89_sgpr90_sgpr91, $sgpr92_sgpr93_sgpr94_sgpr95, $sgpr96_sgpr97_sgpr98_sgpr99, $sgpr100_sgpr101_sgpr102_sgpr103, $sgpr104, $sgpr105, $vgpr1 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: $vgpr4 = V_SUB_U32_e32 300, $vgpr1, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: $vgpr5 = V_SUB_U32_e32 400, $vgpr1, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: $vgpr6 = V_SUB_U32_e32 300, $vgpr1, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: $vgpr7 = V_SUB_U32_e32 500, $vgpr1, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: S_NOP 0, implicit $sgpr2_sgpr3, implicit $sgpr4_sgpr5_sgpr6_sgpr7, implicit $sgpr8_sgpr9_sgpr10_sgpr11, implicit $sgpr12_sgpr13_sgpr14_sgpr15, implicit $sgpr16_sgpr17_sgpr18_sgpr19, implicit $sgpr20_sgpr21_sgpr22_sgpr23, implicit $sgpr24_sgpr25_sgpr26_sgpr27, implicit $sgpr28_sgpr29_sgpr30_sgpr31, implicit $sgpr32_sgpr33_sgpr34_sgpr35, implicit $sgpr36_sgpr37_sgpr38_sgpr39, implicit $sgpr40_sgpr41_sgpr42_sgpr43, implicit $sgpr44_sgpr45_sgpr46_sgpr47, implicit $sgpr48_sgpr49_sgpr50_sgpr51, implicit $sgpr52_sgpr53_sgpr54_sgpr55, implicit $sgpr56_sgpr57_sgpr58_sgpr59, implicit $sgpr60_sgpr61_sgpr62_sgpr63, implicit $sgpr64_sgpr65_sgpr66_sgpr67, implicit $sgpr68_sgpr69_sgpr70_sgpr71, implicit $sgpr72_sgpr73_sgpr74_sgpr75, implicit $sgpr76_sgpr77_sgpr78_sgpr79, implicit $sgpr80_sgpr81_sgpr82_sgpr83, implicit $sgpr84_sgpr85_sgpr86_sgpr87, implicit $sgpr88_sgpr89_sgpr90_sgpr91, implicit $sgpr92_sgpr93_sgpr94_sgpr95, implicit $sgpr96_sgpr97_sgpr98_sgpr99, implicit $sgpr100_sgpr101_sgpr102_sgpr103, implicit $sgpr104_sgpr105 | |
| ; CHECK-NEXT: S_ENDPGM 0 | |
| $vgpr4 = V_SUB_U32_e32 300, $vgpr1, implicit $mode, implicit $exec | |
| $vgpr5 = V_SUB_U32_e32 400, $vgpr1, implicit $mode, implicit $exec | |
| $vgpr6 = V_SUB_U32_e32 300, $vgpr1, implicit $mode, implicit $exec | |
| $vgpr7 = V_SUB_U32_e32 500, $vgpr1, implicit $mode, implicit $exec | |
| S_NOP 0, implicit $sgpr2_sgpr3, implicit $sgpr4_sgpr5_sgpr6_sgpr7, implicit $sgpr8_sgpr9_sgpr10_sgpr11, implicit $sgpr12_sgpr13_sgpr14_sgpr15, implicit $sgpr16_sgpr17_sgpr18_sgpr19, implicit $sgpr20_sgpr21_sgpr22_sgpr23, implicit $sgpr24_sgpr25_sgpr26_sgpr27, implicit $sgpr28_sgpr29_sgpr30_sgpr31, implicit $sgpr32_sgpr33_sgpr34_sgpr35, implicit $sgpr36_sgpr37_sgpr38_sgpr39, implicit $sgpr40_sgpr41_sgpr42_sgpr43, implicit $sgpr44_sgpr45_sgpr46_sgpr47, implicit $sgpr48_sgpr49_sgpr50_sgpr51, implicit $sgpr52_sgpr53_sgpr54_sgpr55, implicit $sgpr56_sgpr57_sgpr58_sgpr59, implicit $sgpr60_sgpr61_sgpr62_sgpr63, implicit $sgpr64_sgpr65_sgpr66_sgpr67, implicit $sgpr68_sgpr69_sgpr70_sgpr71, implicit $sgpr72_sgpr73_sgpr74_sgpr75, implicit $sgpr76_sgpr77_sgpr78_sgpr79, implicit $sgpr80_sgpr81_sgpr82_sgpr83, implicit $sgpr84_sgpr85_sgpr86_sgpr87, implicit $sgpr88_sgpr89_sgpr90_sgpr91, implicit $sgpr92_sgpr93_sgpr94_sgpr95, implicit $sgpr96_sgpr97_sgpr98_sgpr99, implicit $sgpr100_sgpr101_sgpr102_sgpr103, implicit $sgpr104_sgpr105 | |
| S_ENDPGM 0 | |
| ... | |
| # The first two edges need two values and are rejected. The last edge needs one | |
| # value and gets a register. | |
| --- | |
| name: two_value_edges_do_not_block_one_value_edge | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7, $sgpr8_sgpr9_sgpr10_sgpr11, $sgpr12_sgpr13_sgpr14_sgpr15, $sgpr16_sgpr17_sgpr18_sgpr19, $sgpr20_sgpr21_sgpr22_sgpr23, $sgpr24_sgpr25_sgpr26_sgpr27, $sgpr28_sgpr29_sgpr30_sgpr31, $sgpr32_sgpr33_sgpr34_sgpr35, $sgpr36_sgpr37_sgpr38_sgpr39, $sgpr40_sgpr41_sgpr42_sgpr43, $sgpr44_sgpr45_sgpr46_sgpr47, $sgpr48_sgpr49_sgpr50_sgpr51, $sgpr52_sgpr53_sgpr54_sgpr55, $sgpr56_sgpr57_sgpr58_sgpr59, $sgpr60_sgpr61_sgpr62_sgpr63, $sgpr64_sgpr65_sgpr66_sgpr67, $sgpr68_sgpr69_sgpr70_sgpr71, $sgpr72_sgpr73_sgpr74_sgpr75, $sgpr76_sgpr77_sgpr78_sgpr79, $sgpr80_sgpr81_sgpr82_sgpr83, $sgpr84_sgpr85_sgpr86_sgpr87, $sgpr88_sgpr89_sgpr90_sgpr91, $sgpr92_sgpr93_sgpr94_sgpr95, $sgpr96_sgpr97_sgpr98_sgpr99, $sgpr100_sgpr101_sgpr102_sgpr103, $sgpr104, $sgpr105, $vgpr0, $vgpr1 | |
| ; CHECK-LABEL: name: two_value_edges_do_not_block_one_value_edge | |
| ; CHECK: liveins: $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7, $sgpr8_sgpr9_sgpr10_sgpr11, $sgpr12_sgpr13_sgpr14_sgpr15, $sgpr16_sgpr17_sgpr18_sgpr19, $sgpr20_sgpr21_sgpr22_sgpr23, $sgpr24_sgpr25_sgpr26_sgpr27, $sgpr28_sgpr29_sgpr30_sgpr31, $sgpr32_sgpr33_sgpr34_sgpr35, $sgpr36_sgpr37_sgpr38_sgpr39, $sgpr40_sgpr41_sgpr42_sgpr43, $sgpr44_sgpr45_sgpr46_sgpr47, $sgpr48_sgpr49_sgpr50_sgpr51, $sgpr52_sgpr53_sgpr54_sgpr55, $sgpr56_sgpr57_sgpr58_sgpr59, $sgpr60_sgpr61_sgpr62_sgpr63, $sgpr64_sgpr65_sgpr66_sgpr67, $sgpr68_sgpr69_sgpr70_sgpr71, $sgpr72_sgpr73_sgpr74_sgpr75, $sgpr76_sgpr77_sgpr78_sgpr79, $sgpr80_sgpr81_sgpr82_sgpr83, $sgpr84_sgpr85_sgpr86_sgpr87, $sgpr88_sgpr89_sgpr90_sgpr91, $sgpr92_sgpr93_sgpr94_sgpr95, $sgpr96_sgpr97_sgpr98_sgpr99, $sgpr100_sgpr101_sgpr102_sgpr103, $sgpr104, $sgpr105, $vgpr0, $vgpr1 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: $vgpr4 = V_SUB_U32_e32 300, $vgpr1, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: $vgpr5 = V_SUB_U32_e32 400, $vgpr1, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: $sgpr0 = S_MOV_B32 500 | |
| ; CHECK-NEXT: $vgpr6, $vgpr7 = V_DUAL_SUB_U32_e32_X_SUB_U32_e32_e96_gfx1250 $sgpr0, $vgpr1, $vgpr0, $vgpr1, implicit $exec, implicit $mode, implicit $exec, implicit $exec | |
| ; CHECK-NEXT: S_NOP 0, implicit $sgpr2_sgpr3, implicit $sgpr4_sgpr5_sgpr6_sgpr7, implicit $sgpr8_sgpr9_sgpr10_sgpr11, implicit $sgpr12_sgpr13_sgpr14_sgpr15, implicit $sgpr16_sgpr17_sgpr18_sgpr19, implicit $sgpr20_sgpr21_sgpr22_sgpr23, implicit $sgpr24_sgpr25_sgpr26_sgpr27, implicit $sgpr28_sgpr29_sgpr30_sgpr31, implicit $sgpr32_sgpr33_sgpr34_sgpr35, implicit $sgpr36_sgpr37_sgpr38_sgpr39, implicit $sgpr40_sgpr41_sgpr42_sgpr43, implicit $sgpr44_sgpr45_sgpr46_sgpr47, implicit $sgpr48_sgpr49_sgpr50_sgpr51, implicit $sgpr52_sgpr53_sgpr54_sgpr55, implicit $sgpr56_sgpr57_sgpr58_sgpr59, implicit $sgpr60_sgpr61_sgpr62_sgpr63, implicit $sgpr64_sgpr65_sgpr66_sgpr67, implicit $sgpr68_sgpr69_sgpr70_sgpr71, implicit $sgpr72_sgpr73_sgpr74_sgpr75, implicit $sgpr76_sgpr77_sgpr78_sgpr79, implicit $sgpr80_sgpr81_sgpr82_sgpr83, implicit $sgpr84_sgpr85_sgpr86_sgpr87, implicit $sgpr88_sgpr89_sgpr90_sgpr91, implicit $sgpr92_sgpr93_sgpr94_sgpr95, implicit $sgpr96_sgpr97_sgpr98_sgpr99, implicit $sgpr100_sgpr101_sgpr102_sgpr103, implicit $sgpr104_sgpr105 | |
| ; CHECK-NEXT: S_ENDPGM 0 | |
| $vgpr4 = V_SUB_U32_e32 300, $vgpr1, implicit $mode, implicit $exec | |
| $vgpr5 = V_SUB_U32_e32 400, $vgpr1, implicit $mode, implicit $exec | |
| $vgpr6 = V_SUB_U32_e32 500, $vgpr1, implicit $mode, implicit $exec | |
| $vgpr7 = V_SUB_U32_e32 $vgpr0, $vgpr1, implicit $exec | |
| S_NOP 0, implicit $sgpr2_sgpr3, implicit $sgpr4_sgpr5_sgpr6_sgpr7, implicit $sgpr8_sgpr9_sgpr10_sgpr11, implicit $sgpr12_sgpr13_sgpr14_sgpr15, implicit $sgpr16_sgpr17_sgpr18_sgpr19, implicit $sgpr20_sgpr21_sgpr22_sgpr23, implicit $sgpr24_sgpr25_sgpr26_sgpr27, implicit $sgpr28_sgpr29_sgpr30_sgpr31, implicit $sgpr32_sgpr33_sgpr34_sgpr35, implicit $sgpr36_sgpr37_sgpr38_sgpr39, implicit $sgpr40_sgpr41_sgpr42_sgpr43, implicit $sgpr44_sgpr45_sgpr46_sgpr47, implicit $sgpr48_sgpr49_sgpr50_sgpr51, implicit $sgpr52_sgpr53_sgpr54_sgpr55, implicit $sgpr56_sgpr57_sgpr58_sgpr59, implicit $sgpr60_sgpr61_sgpr62_sgpr63, implicit $sgpr64_sgpr65_sgpr66_sgpr67, implicit $sgpr68_sgpr69_sgpr70_sgpr71, implicit $sgpr72_sgpr73_sgpr74_sgpr75, implicit $sgpr76_sgpr77_sgpr78_sgpr79, implicit $sgpr80_sgpr81_sgpr82_sgpr83, implicit $sgpr84_sgpr85_sgpr86_sgpr87, implicit $sgpr88_sgpr89_sgpr90_sgpr91, implicit $sgpr92_sgpr93_sgpr94_sgpr95, implicit $sgpr96_sgpr97_sgpr98_sgpr99, implicit $sgpr100_sgpr101_sgpr102_sgpr103, implicit $sgpr104_sgpr105 | |
| S_ENDPGM 0 | |
| ... | |
| # Every edge before the last needs two distinct values and is rejected. The | |
| # final edge needs one value and forms. | |
| --- | |
| name: only_one_value_edge_is_eligible | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7, $sgpr8_sgpr9_sgpr10_sgpr11, $sgpr12_sgpr13_sgpr14_sgpr15, $sgpr16_sgpr17_sgpr18_sgpr19, $sgpr20_sgpr21_sgpr22_sgpr23, $sgpr24_sgpr25_sgpr26_sgpr27, $sgpr28_sgpr29_sgpr30_sgpr31, $sgpr32_sgpr33_sgpr34_sgpr35, $sgpr36_sgpr37_sgpr38_sgpr39, $sgpr40_sgpr41_sgpr42_sgpr43, $sgpr44_sgpr45_sgpr46_sgpr47, $sgpr48_sgpr49_sgpr50_sgpr51, $sgpr52_sgpr53_sgpr54_sgpr55, $sgpr56_sgpr57_sgpr58_sgpr59, $sgpr60_sgpr61_sgpr62_sgpr63, $sgpr64_sgpr65_sgpr66_sgpr67, $sgpr68_sgpr69_sgpr70_sgpr71, $sgpr72_sgpr73_sgpr74_sgpr75, $sgpr76_sgpr77_sgpr78_sgpr79, $sgpr80_sgpr81_sgpr82_sgpr83, $sgpr84_sgpr85_sgpr86_sgpr87, $sgpr88_sgpr89_sgpr90_sgpr91, $sgpr92_sgpr93_sgpr94_sgpr95, $sgpr96_sgpr97_sgpr98_sgpr99, $sgpr100_sgpr101_sgpr102_sgpr103, $sgpr104_sgpr105, $vgpr0, $vgpr1 | |
| ; CHECK-LABEL: name: only_one_value_edge_is_eligible | |
| ; CHECK: liveins: $sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7, $sgpr8_sgpr9_sgpr10_sgpr11, $sgpr12_sgpr13_sgpr14_sgpr15, $sgpr16_sgpr17_sgpr18_sgpr19, $sgpr20_sgpr21_sgpr22_sgpr23, $sgpr24_sgpr25_sgpr26_sgpr27, $sgpr28_sgpr29_sgpr30_sgpr31, $sgpr32_sgpr33_sgpr34_sgpr35, $sgpr36_sgpr37_sgpr38_sgpr39, $sgpr40_sgpr41_sgpr42_sgpr43, $sgpr44_sgpr45_sgpr46_sgpr47, $sgpr48_sgpr49_sgpr50_sgpr51, $sgpr52_sgpr53_sgpr54_sgpr55, $sgpr56_sgpr57_sgpr58_sgpr59, $sgpr60_sgpr61_sgpr62_sgpr63, $sgpr64_sgpr65_sgpr66_sgpr67, $sgpr68_sgpr69_sgpr70_sgpr71, $sgpr72_sgpr73_sgpr74_sgpr75, $sgpr76_sgpr77_sgpr78_sgpr79, $sgpr80_sgpr81_sgpr82_sgpr83, $sgpr84_sgpr85_sgpr86_sgpr87, $sgpr88_sgpr89_sgpr90_sgpr91, $sgpr92_sgpr93_sgpr94_sgpr95, $sgpr96_sgpr97_sgpr98_sgpr99, $sgpr100_sgpr101_sgpr102_sgpr103, $sgpr104_sgpr105, $vgpr0, $vgpr1 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: $vgpr4 = V_SUB_U32_e32 300, $vgpr1, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: $vgpr5 = V_SUB_U32_e32 500, $vgpr1, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: $vgpr6 = V_SUB_U32_e32 400, $vgpr1, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: $vgpr7 = V_SUB_U32_e32 500, $vgpr1, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: $sgpr0 = S_MOV_B32 600 | |
| ; CHECK-NEXT: $vgpr8, $vgpr9 = V_DUAL_SUB_U32_e32_X_SUB_U32_e32_e96_gfx1250 $sgpr0, $vgpr1, $vgpr0, $vgpr1, implicit $exec, implicit $mode, implicit $exec, implicit $exec | |
| ; CHECK-NEXT: S_NOP 0, implicit $sgpr2_sgpr3, implicit $sgpr4_sgpr5_sgpr6_sgpr7, implicit $sgpr8_sgpr9_sgpr10_sgpr11, implicit $sgpr12_sgpr13_sgpr14_sgpr15, implicit $sgpr16_sgpr17_sgpr18_sgpr19, implicit $sgpr20_sgpr21_sgpr22_sgpr23, implicit $sgpr24_sgpr25_sgpr26_sgpr27, implicit $sgpr28_sgpr29_sgpr30_sgpr31, implicit $sgpr32_sgpr33_sgpr34_sgpr35, implicit $sgpr36_sgpr37_sgpr38_sgpr39, implicit $sgpr40_sgpr41_sgpr42_sgpr43, implicit $sgpr44_sgpr45_sgpr46_sgpr47, implicit $sgpr48_sgpr49_sgpr50_sgpr51, implicit $sgpr52_sgpr53_sgpr54_sgpr55, implicit $sgpr56_sgpr57_sgpr58_sgpr59, implicit $sgpr60_sgpr61_sgpr62_sgpr63, implicit $sgpr64_sgpr65_sgpr66_sgpr67, implicit $sgpr68_sgpr69_sgpr70_sgpr71, implicit $sgpr72_sgpr73_sgpr74_sgpr75, implicit $sgpr76_sgpr77_sgpr78_sgpr79, implicit $sgpr80_sgpr81_sgpr82_sgpr83, implicit $sgpr84_sgpr85_sgpr86_sgpr87, implicit $sgpr88_sgpr89_sgpr90_sgpr91, implicit $sgpr92_sgpr93_sgpr94_sgpr95, implicit $sgpr96_sgpr97_sgpr98_sgpr99, implicit $sgpr100_sgpr101_sgpr102_sgpr103, implicit $sgpr104_sgpr105 | |
| ; CHECK-NEXT: S_ENDPGM 0 | |
| $vgpr4 = V_SUB_U32_e32 300, $vgpr1, implicit $mode, implicit $exec | |
| $vgpr5 = V_SUB_U32_e32 500, $vgpr1, implicit $mode, implicit $exec | |
| $vgpr6 = V_SUB_U32_e32 400, $vgpr1, implicit $mode, implicit $exec | |
| $vgpr7 = V_SUB_U32_e32 500, $vgpr1, implicit $mode, implicit $exec | |
| $vgpr8 = V_SUB_U32_e32 600, $vgpr1, implicit $mode, implicit $exec | |
| $vgpr9 = V_SUB_U32_e32 $vgpr0, $vgpr1, implicit $exec | |
| S_NOP 0, implicit $sgpr2_sgpr3, implicit $sgpr4_sgpr5_sgpr6_sgpr7, implicit $sgpr8_sgpr9_sgpr10_sgpr11, implicit $sgpr12_sgpr13_sgpr14_sgpr15, implicit $sgpr16_sgpr17_sgpr18_sgpr19, implicit $sgpr20_sgpr21_sgpr22_sgpr23, implicit $sgpr24_sgpr25_sgpr26_sgpr27, implicit $sgpr28_sgpr29_sgpr30_sgpr31, implicit $sgpr32_sgpr33_sgpr34_sgpr35, implicit $sgpr36_sgpr37_sgpr38_sgpr39, implicit $sgpr40_sgpr41_sgpr42_sgpr43, implicit $sgpr44_sgpr45_sgpr46_sgpr47, implicit $sgpr48_sgpr49_sgpr50_sgpr51, implicit $sgpr52_sgpr53_sgpr54_sgpr55, implicit $sgpr56_sgpr57_sgpr58_sgpr59, implicit $sgpr60_sgpr61_sgpr62_sgpr63, implicit $sgpr64_sgpr65_sgpr66_sgpr67, implicit $sgpr68_sgpr69_sgpr70_sgpr71, implicit $sgpr72_sgpr73_sgpr74_sgpr75, implicit $sgpr76_sgpr77_sgpr78_sgpr79, implicit $sgpr80_sgpr81_sgpr82_sgpr83, implicit $sgpr84_sgpr85_sgpr86_sgpr87, implicit $sgpr88_sgpr89_sgpr90_sgpr91, implicit $sgpr92_sgpr93_sgpr94_sgpr95, implicit $sgpr96_sgpr97_sgpr98_sgpr99, implicit $sgpr100_sgpr101_sgpr102_sgpr103, implicit $sgpr104_sgpr105 | |
| S_ENDPGM 0 | |
| ... | |
| # The two components name the same 32 bits, written as a negative and as an | |
| # unsigned value. They share one move. | |
| --- | |
| name: same_value_written_two_ways | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $vgpr0, $vgpr1 | |
| ; CHECK-LABEL: name: same_value_written_two_ways | |
| ; CHECK: liveins: $vgpr0, $vgpr1 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: $sgpr0 = S_MOV_B32 -2048 | |
| ; CHECK-NEXT: $vgpr4, $vgpr5 = V_DUAL_SUB_U32_e32_X_SUB_U32_e32_e96_gfx1250 $sgpr0, $vgpr1, $sgpr0, $vgpr1, implicit $exec, implicit $mode, implicit $exec, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: S_ENDPGM 0 | |
| $vgpr4 = V_SUB_U32_e32 -2048, $vgpr1, implicit $mode, implicit $exec | |
| $vgpr5 = V_SUB_U32_e32 4294965248, $vgpr1, implicit $mode, implicit $exec | |
| S_ENDPGM 0 | |
| ... | |
| # A pair which needs two different scalar moves is rejected. | |
| --- | |
| name: two_distinct_values_are_not_materialized | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $vgpr1 | |
| ; CHECK-LABEL: name: two_distinct_values_are_not_materialized | |
| ; CHECK: liveins: $vgpr1 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: $vgpr4 = V_SUB_U32_e32 300, $vgpr1, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: $vgpr5 = V_SUB_U32_e32 500, $vgpr1, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: S_ENDPGM 0 | |
| $vgpr4 = V_SUB_U32_e32 300, $vgpr1, implicit $mode, implicit $exec | |
| $vgpr5 = V_SUB_U32_e32 500, $vgpr1, implicit $mode, implicit $exec | |
| S_ENDPGM 0 | |
| ... | |
| # Disjoint pair-local ranges can reuse the same scalar register. | |
| --- | |
| name: disjoint_pairs_reuse_register | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $vgpr0, $vgpr1 | |
| ; CHECK-LABEL: name: disjoint_pairs_reuse_register | |
| ; CHECK: liveins: $vgpr0, $vgpr1 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: $sgpr0 = S_MOV_B32 100 | |
| ; CHECK-NEXT: $vgpr4, $vgpr5 = V_DUAL_SUB_U32_e32_X_SUB_U32_e32_e96_gfx1250 $sgpr0, $vgpr1, $vgpr0, $vgpr1, implicit $exec, implicit $mode, implicit $exec, implicit $exec | |
| ; CHECK-NEXT: $sgpr0 = S_MOV_B32 200 | |
| ; CHECK-NEXT: $vgpr6, $vgpr7 = V_DUAL_SUB_U32_e32_X_SUB_U32_e32_e96_gfx1250 $sgpr0, $vgpr1, $vgpr0, $vgpr1, implicit $exec, implicit $mode, implicit $exec, implicit $exec | |
| ; CHECK-NEXT: S_ENDPGM 0 | |
| $vgpr4 = V_SUB_U32_e32 100, $vgpr1, implicit $mode, implicit $exec | |
| $vgpr5 = V_SUB_U32_e32 $vgpr0, $vgpr1, implicit $exec | |
| $vgpr6 = V_SUB_U32_e32 200, $vgpr1, implicit $mode, implicit $exec | |
| $vgpr7 = V_SUB_U32_e32 $vgpr0, $vgpr1, implicit $exec | |
| S_ENDPGM 0 | |
| ... | |
| # Program order is Y then X. The move still goes before the Y instruction, | |
| # while the VOPD operands and destinations use encoding order. | |
| --- | |
| name: literal_with_swapped_xy_order | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $vgpr0, $vgpr1 | |
| ; CHECK-LABEL: name: literal_with_swapped_xy_order | |
| ; CHECK: liveins: $vgpr0, $vgpr1 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: $sgpr0 = S_MOV_B32 300 | |
| ; CHECK-NEXT: $vgpr5, $vgpr4 = V_DUAL_SUB_U32_e32_X_MAX_I32_e32_e96_gfx1250 $vgpr0, $vgpr1, $sgpr0, $vgpr1, implicit $exec, implicit $exec, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: S_ENDPGM 0 | |
| $vgpr4 = V_MAX_I32_e32 300, $vgpr1, implicit $mode, implicit $exec | |
| $vgpr5 = V_SUB_U32_e32 $vgpr0, $vgpr1, implicit $exec | |
| S_ENDPGM 0 | |
| ... | |
| # Only 32-bit values are moved, because one S_MOV_B32 has to produce them. A | |
| # 64-bit literal is left alone, so the pair stays split. | |
| --- | |
| name: literal64_is_not_moved | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $vgpr2, $vgpr3, $vgpr8_vgpr9 | |
| ; CHECK-LABEL: name: literal64_is_not_moved | |
| ; CHECK: liveins: $vgpr2, $vgpr3, $vgpr8_vgpr9 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: $vgpr4_vgpr5 = V_ADD_F64_pseudo_e32 1311768465173141112, $vgpr8_vgpr9, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: $vgpr6 = V_ADD_F32_e32 $vgpr2, $vgpr3, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: S_ENDPGM 0 | |
| $vgpr4_vgpr5 = V_ADD_F64_pseudo_e32 1311768465173141112, $vgpr8_vgpr9, implicit $mode, implicit $exec | |
| $vgpr6 = V_ADD_F32_e32 $vgpr2, $vgpr3, implicit $mode, implicit $exec | |
| S_ENDPGM 0 | |
| ... | |
| # The same pair reading a scalar register pairs, so only the width of the | |
| # value stops the case above. | |
| --- | |
| name: scalar64_pairs | |
| tracksRegLiveness: true | |
| body: | | |
| bb.0: | |
| liveins: $sgpr0_sgpr1, $vgpr2, $vgpr3, $vgpr8_vgpr9 | |
| ; CHECK-LABEL: name: scalar64_pairs | |
| ; CHECK: liveins: $sgpr0_sgpr1, $vgpr2, $vgpr3, $vgpr8_vgpr9 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: $vgpr4_vgpr5, $vgpr6 = V_DUAL_ADD_F64_pseudo_e32_X_ADD_F32_e32_e96_gfx1250 0, $sgpr0_sgpr1, 0, $vgpr8_vgpr9, 0, $vgpr2, 0, $vgpr3, implicit $mode, implicit $exec, implicit $mode, implicit $exec, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: S_ENDPGM 0 | |
| $vgpr4_vgpr5 = V_ADD_F64_pseudo_e32 $sgpr0_sgpr1, $vgpr8_vgpr9, implicit $mode, implicit $exec | |
| $vgpr6 = V_ADD_F32_e32 $vgpr2, $vgpr3, implicit $mode, implicit $exec | |
| S_ENDPGM 0 | |
| ... | |
| # $sgpr35 is saved and restored, so at a return it holds the caller's value | |
| # again. That value is not in the live-in list, and the register is not | |
| # pristine either, so only the live-outs of the return block report it. Every | |
| # other scalar register is live, so the pair has to be given up. | |
| --- | |
| name: restored_callee_saved_reg_is_live | |
| tracksRegLiveness: true | |
| frameInfo: | |
| isCalleeSavedInfoValid: true | |
| stack: | |
| - { id: 0, type: spill-slot, offset: 0, size: 4, alignment: 4, | |
| callee-saved-register: '$sgpr35', callee-saved-restored: true } | |
| body: | | |
| bb.0: | |
| liveins: $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7, $sgpr8_sgpr9_sgpr10_sgpr11, $sgpr12_sgpr13_sgpr14_sgpr15, $sgpr16_sgpr17_sgpr18_sgpr19, $sgpr20_sgpr21_sgpr22_sgpr23, $sgpr24_sgpr25_sgpr26_sgpr27, $sgpr28_sgpr29_sgpr30_sgpr31, $sgpr32_sgpr33_sgpr34, $sgpr36_sgpr37_sgpr38_sgpr39, $sgpr40_sgpr41_sgpr42_sgpr43, $sgpr44_sgpr45_sgpr46_sgpr47, $sgpr48_sgpr49_sgpr50_sgpr51, $sgpr52_sgpr53_sgpr54_sgpr55, $sgpr56_sgpr57_sgpr58_sgpr59, $sgpr60_sgpr61_sgpr62_sgpr63, $sgpr64_sgpr65_sgpr66_sgpr67, $sgpr68_sgpr69_sgpr70_sgpr71, $sgpr72_sgpr73_sgpr74_sgpr75, $sgpr76_sgpr77_sgpr78_sgpr79, $sgpr80_sgpr81_sgpr82_sgpr83, $sgpr84_sgpr85_sgpr86_sgpr87, $sgpr88_sgpr89_sgpr90_sgpr91, $sgpr92_sgpr93_sgpr94_sgpr95, $sgpr96_sgpr97_sgpr98_sgpr99, $sgpr100_sgpr101_sgpr102_sgpr103, $sgpr104, $sgpr105, $vgpr0, $vgpr1 | |
| ; CHECK-LABEL: name: restored_callee_saved_reg_is_live | |
| ; CHECK: liveins: $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7, $sgpr8_sgpr9_sgpr10_sgpr11, $sgpr12_sgpr13_sgpr14_sgpr15, $sgpr16_sgpr17_sgpr18_sgpr19, $sgpr20_sgpr21_sgpr22_sgpr23, $sgpr24_sgpr25_sgpr26_sgpr27, $sgpr28_sgpr29_sgpr30_sgpr31, $sgpr32_sgpr33_sgpr34, $sgpr36_sgpr37_sgpr38_sgpr39, $sgpr40_sgpr41_sgpr42_sgpr43, $sgpr44_sgpr45_sgpr46_sgpr47, $sgpr48_sgpr49_sgpr50_sgpr51, $sgpr52_sgpr53_sgpr54_sgpr55, $sgpr56_sgpr57_sgpr58_sgpr59, $sgpr60_sgpr61_sgpr62_sgpr63, $sgpr64_sgpr65_sgpr66_sgpr67, $sgpr68_sgpr69_sgpr70_sgpr71, $sgpr72_sgpr73_sgpr74_sgpr75, $sgpr76_sgpr77_sgpr78_sgpr79, $sgpr80_sgpr81_sgpr82_sgpr83, $sgpr84_sgpr85_sgpr86_sgpr87, $sgpr88_sgpr89_sgpr90_sgpr91, $sgpr92_sgpr93_sgpr94_sgpr95, $sgpr96_sgpr97_sgpr98_sgpr99, $sgpr100_sgpr101_sgpr102_sgpr103, $sgpr104, $sgpr105, $vgpr0, $vgpr1 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: $vgpr4 = V_SUB_U32_e32 $vgpr0, $vgpr1, implicit $exec | |
| ; CHECK-NEXT: $vgpr5 = V_SUB_U32_e32 300, $vgpr1, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: S_NOP 0, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr4_sgpr5_sgpr6_sgpr7, implicit $sgpr8_sgpr9_sgpr10_sgpr11, implicit $sgpr12_sgpr13_sgpr14_sgpr15, implicit $sgpr16_sgpr17_sgpr18_sgpr19, implicit $sgpr20_sgpr21_sgpr22_sgpr23, implicit $sgpr24_sgpr25_sgpr26_sgpr27, implicit $sgpr28_sgpr29_sgpr30_sgpr31, implicit $sgpr32_sgpr33, implicit $sgpr34, implicit $sgpr36_sgpr37_sgpr38_sgpr39, implicit $sgpr40_sgpr41_sgpr42_sgpr43, implicit $sgpr44_sgpr45_sgpr46_sgpr47, implicit $sgpr48_sgpr49_sgpr50_sgpr51, implicit $sgpr52_sgpr53_sgpr54_sgpr55, implicit $sgpr56_sgpr57_sgpr58_sgpr59, implicit $sgpr60_sgpr61_sgpr62_sgpr63, implicit $sgpr64_sgpr65_sgpr66_sgpr67, implicit $sgpr68_sgpr69_sgpr70_sgpr71, implicit $sgpr72_sgpr73_sgpr74_sgpr75, implicit $sgpr76_sgpr77_sgpr78_sgpr79, implicit $sgpr80_sgpr81_sgpr82_sgpr83, implicit $sgpr84_sgpr85_sgpr86_sgpr87, implicit $sgpr88_sgpr89_sgpr90_sgpr91, implicit $sgpr92_sgpr93_sgpr94_sgpr95, implicit $sgpr96_sgpr97_sgpr98_sgpr99, implicit $sgpr100_sgpr101_sgpr102_sgpr103, implicit $sgpr104_sgpr105 | |
| ; CHECK-NEXT: SI_RETURN | |
| $vgpr4 = V_SUB_U32_e32 $vgpr0, $vgpr1, implicit $exec | |
| $vgpr5 = V_SUB_U32_e32 300, $vgpr1, implicit $mode, implicit $exec | |
| S_NOP 0, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr4_sgpr5_sgpr6_sgpr7, implicit $sgpr8_sgpr9_sgpr10_sgpr11, implicit $sgpr12_sgpr13_sgpr14_sgpr15, implicit $sgpr16_sgpr17_sgpr18_sgpr19, implicit $sgpr20_sgpr21_sgpr22_sgpr23, implicit $sgpr24_sgpr25_sgpr26_sgpr27, implicit $sgpr28_sgpr29_sgpr30_sgpr31, implicit $sgpr32_sgpr33, implicit $sgpr34, implicit $sgpr36_sgpr37_sgpr38_sgpr39, implicit $sgpr40_sgpr41_sgpr42_sgpr43, implicit $sgpr44_sgpr45_sgpr46_sgpr47, implicit $sgpr48_sgpr49_sgpr50_sgpr51, implicit $sgpr52_sgpr53_sgpr54_sgpr55, implicit $sgpr56_sgpr57_sgpr58_sgpr59, implicit $sgpr60_sgpr61_sgpr62_sgpr63, implicit $sgpr64_sgpr65_sgpr66_sgpr67, implicit $sgpr68_sgpr69_sgpr70_sgpr71, implicit $sgpr72_sgpr73_sgpr74_sgpr75, implicit $sgpr76_sgpr77_sgpr78_sgpr79, implicit $sgpr80_sgpr81_sgpr82_sgpr83, implicit $sgpr84_sgpr85_sgpr86_sgpr87, implicit $sgpr88_sgpr89_sgpr90_sgpr91, implicit $sgpr92_sgpr93_sgpr94_sgpr95, implicit $sgpr96_sgpr97_sgpr98_sgpr99, implicit $sgpr100_sgpr101_sgpr102_sgpr103, implicit $sgpr104_sgpr105 | |
| SI_RETURN | |
| ... | |
| # The same shape, but the restore of $sgpr35 comes after the pair. The register | |
| # is dead over the range the move needs, so it is still used. | |
| --- | |
| name: callee_saved_reg_dead_over_range | |
| tracksRegLiveness: true | |
| frameInfo: | |
| isCalleeSavedInfoValid: true | |
| stack: | |
| - { id: 0, type: spill-slot, offset: 0, size: 4, alignment: 4, | |
| callee-saved-register: '$sgpr35', callee-saved-restored: true } | |
| body: | | |
| bb.0: | |
| liveins: $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7, $sgpr8_sgpr9_sgpr10_sgpr11, $sgpr12_sgpr13_sgpr14_sgpr15, $sgpr16_sgpr17_sgpr18_sgpr19, $sgpr20_sgpr21_sgpr22_sgpr23, $sgpr24_sgpr25_sgpr26_sgpr27, $sgpr28_sgpr29_sgpr30_sgpr31, $sgpr32_sgpr33_sgpr34, $sgpr36_sgpr37_sgpr38_sgpr39, $sgpr40_sgpr41_sgpr42_sgpr43, $sgpr44_sgpr45_sgpr46_sgpr47, $sgpr48_sgpr49_sgpr50_sgpr51, $sgpr52_sgpr53_sgpr54_sgpr55, $sgpr56_sgpr57_sgpr58_sgpr59, $sgpr60_sgpr61_sgpr62_sgpr63, $sgpr64_sgpr65_sgpr66_sgpr67, $sgpr68_sgpr69_sgpr70_sgpr71, $sgpr72_sgpr73_sgpr74_sgpr75, $sgpr76_sgpr77_sgpr78_sgpr79, $sgpr80_sgpr81_sgpr82_sgpr83, $sgpr84_sgpr85_sgpr86_sgpr87, $sgpr88_sgpr89_sgpr90_sgpr91, $sgpr92_sgpr93_sgpr94_sgpr95, $sgpr96_sgpr97_sgpr98_sgpr99, $sgpr100_sgpr101_sgpr102_sgpr103, $sgpr104, $sgpr105, $vgpr0, $vgpr1 | |
| ; CHECK-LABEL: name: callee_saved_reg_dead_over_range | |
| ; CHECK: liveins: $sgpr0_sgpr1_sgpr2_sgpr3, $sgpr4_sgpr5_sgpr6_sgpr7, $sgpr8_sgpr9_sgpr10_sgpr11, $sgpr12_sgpr13_sgpr14_sgpr15, $sgpr16_sgpr17_sgpr18_sgpr19, $sgpr20_sgpr21_sgpr22_sgpr23, $sgpr24_sgpr25_sgpr26_sgpr27, $sgpr28_sgpr29_sgpr30_sgpr31, $sgpr32_sgpr33_sgpr34, $sgpr36_sgpr37_sgpr38_sgpr39, $sgpr40_sgpr41_sgpr42_sgpr43, $sgpr44_sgpr45_sgpr46_sgpr47, $sgpr48_sgpr49_sgpr50_sgpr51, $sgpr52_sgpr53_sgpr54_sgpr55, $sgpr56_sgpr57_sgpr58_sgpr59, $sgpr60_sgpr61_sgpr62_sgpr63, $sgpr64_sgpr65_sgpr66_sgpr67, $sgpr68_sgpr69_sgpr70_sgpr71, $sgpr72_sgpr73_sgpr74_sgpr75, $sgpr76_sgpr77_sgpr78_sgpr79, $sgpr80_sgpr81_sgpr82_sgpr83, $sgpr84_sgpr85_sgpr86_sgpr87, $sgpr88_sgpr89_sgpr90_sgpr91, $sgpr92_sgpr93_sgpr94_sgpr95, $sgpr96_sgpr97_sgpr98_sgpr99, $sgpr100_sgpr101_sgpr102_sgpr103, $sgpr104, $sgpr105, $vgpr0, $vgpr1 | |
| ; CHECK-NEXT: {{ $}} | |
| ; CHECK-NEXT: $sgpr35 = S_MOV_B32 300 | |
| ; CHECK-NEXT: $vgpr4, $vgpr5 = V_DUAL_SUB_U32_e32_X_SUB_U32_e32_e96_gfx1250 $vgpr0, $vgpr1, $sgpr35, $vgpr1, implicit $exec, implicit $exec, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: $sgpr35 = S_MOV_B32 7 | |
| ; CHECK-NEXT: S_NOP 0, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr4_sgpr5_sgpr6_sgpr7, implicit $sgpr8_sgpr9_sgpr10_sgpr11, implicit $sgpr12_sgpr13_sgpr14_sgpr15, implicit $sgpr16_sgpr17_sgpr18_sgpr19, implicit $sgpr20_sgpr21_sgpr22_sgpr23, implicit $sgpr24_sgpr25_sgpr26_sgpr27, implicit $sgpr28_sgpr29_sgpr30_sgpr31, implicit $sgpr32_sgpr33, implicit $sgpr34, implicit $sgpr36_sgpr37_sgpr38_sgpr39, implicit $sgpr40_sgpr41_sgpr42_sgpr43, implicit $sgpr44_sgpr45_sgpr46_sgpr47, implicit $sgpr48_sgpr49_sgpr50_sgpr51, implicit $sgpr52_sgpr53_sgpr54_sgpr55, implicit $sgpr56_sgpr57_sgpr58_sgpr59, implicit $sgpr60_sgpr61_sgpr62_sgpr63, implicit $sgpr64_sgpr65_sgpr66_sgpr67, implicit $sgpr68_sgpr69_sgpr70_sgpr71, implicit $sgpr72_sgpr73_sgpr74_sgpr75, implicit $sgpr76_sgpr77_sgpr78_sgpr79, implicit $sgpr80_sgpr81_sgpr82_sgpr83, implicit $sgpr84_sgpr85_sgpr86_sgpr87, implicit $sgpr88_sgpr89_sgpr90_sgpr91, implicit $sgpr92_sgpr93_sgpr94_sgpr95, implicit $sgpr96_sgpr97_sgpr98_sgpr99, implicit $sgpr100_sgpr101_sgpr102_sgpr103, implicit $sgpr104_sgpr105 | |
| ; CHECK-NEXT: SI_RETURN | |
| $vgpr4 = V_SUB_U32_e32 $vgpr0, $vgpr1, implicit $exec | |
| $vgpr5 = V_SUB_U32_e32 300, $vgpr1, implicit $mode, implicit $exec | |
| $sgpr35 = S_MOV_B32 7 | |
| S_NOP 0, implicit $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr4_sgpr5_sgpr6_sgpr7, implicit $sgpr8_sgpr9_sgpr10_sgpr11, implicit $sgpr12_sgpr13_sgpr14_sgpr15, implicit $sgpr16_sgpr17_sgpr18_sgpr19, implicit $sgpr20_sgpr21_sgpr22_sgpr23, implicit $sgpr24_sgpr25_sgpr26_sgpr27, implicit $sgpr28_sgpr29_sgpr30_sgpr31, implicit $sgpr32_sgpr33, implicit $sgpr34, implicit $sgpr36_sgpr37_sgpr38_sgpr39, implicit $sgpr40_sgpr41_sgpr42_sgpr43, implicit $sgpr44_sgpr45_sgpr46_sgpr47, implicit $sgpr48_sgpr49_sgpr50_sgpr51, implicit $sgpr52_sgpr53_sgpr54_sgpr55, implicit $sgpr56_sgpr57_sgpr58_sgpr59, implicit $sgpr60_sgpr61_sgpr62_sgpr63, implicit $sgpr64_sgpr65_sgpr66_sgpr67, implicit $sgpr68_sgpr69_sgpr70_sgpr71, implicit $sgpr72_sgpr73_sgpr74_sgpr75, implicit $sgpr76_sgpr77_sgpr78_sgpr79, implicit $sgpr80_sgpr81_sgpr82_sgpr83, implicit $sgpr84_sgpr85_sgpr86_sgpr87, implicit $sgpr88_sgpr89_sgpr90_sgpr91, implicit $sgpr92_sgpr93_sgpr94_sgpr95, implicit $sgpr96_sgpr97_sgpr98_sgpr99, implicit $sgpr100_sgpr101_sgpr102_sgpr103, implicit $sgpr104_sgpr105 | |
| SI_RETURN | |
| ... | |
| # Without liveness no free register can be found, so the pair stays as two | |
| # instructions. | |
| --- | |
| name: no_tracked_liveness | |
| tracksRegLiveness: false | |
| body: | | |
| bb.0: | |
| ; CHECK-LABEL: name: no_tracked_liveness | |
| ; CHECK: $vgpr0 = IMPLICIT_DEF | |
| ; CHECK-NEXT: $vgpr1 = IMPLICIT_DEF | |
| ; CHECK-NEXT: $vgpr4 = V_SUB_U32_e32 $vgpr0, $vgpr1, implicit $exec | |
| ; CHECK-NEXT: $vgpr5 = V_SUB_U32_e32 300, $vgpr1, implicit $mode, implicit $exec | |
| ; CHECK-NEXT: S_ENDPGM 0 | |
| $vgpr0 = IMPLICIT_DEF | |
| $vgpr1 = IMPLICIT_DEF | |
| $vgpr4 = V_SUB_U32_e32 $vgpr0, $vgpr1, implicit $exec | |
| $vgpr5 = V_SUB_U32_e32 300, $vgpr1, implicit $mode, implicit $exec | |
| S_ENDPGM 0 | |
| ... |