blob: 001258bf6e62ce2e0ae2b3883b9741d016699726 [file] [edit]
# 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
...