
LiveVariables will mark instructions with their implicit subregister uses. However, it will also mark the subregister as an implicit if its own definition is a subregister of it, i.e. `$r3 = OP val, implicit-def $r0_r1_r2_r3, ..., implicit $r2_r3`, even if it is otherwise unused, which defines $r3 on the same line it is used. This change ensures such uses are marked without implicit, i.e. `$r3 = OP val, implicit-def $r0_r1_r2_r3, ..., $r2_r3`. --------- Co-authored-by: Matt Arsenault <arsenm2@gmail.com>
92 lines
2.8 KiB
YAML
92 lines
2.8 KiB
YAML
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
|
|
# RUN: llc -mtriple=amdgcn --run-pass=livevars -o - %s | FileCheck %s
|
|
---
|
|
# Check that super register is defined for an sgpr copy.
|
|
name: sgpr_copy
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
|
|
; CHECK-LABEL: name: sgpr_copy
|
|
; CHECK: %sval:sreg_32 = S_MOV_B32 0
|
|
; CHECK-NEXT: $sgpr0 = COPY %sval
|
|
; CHECK-NEXT: $sgpr1 = COPY %sval
|
|
; CHECK-NEXT: $sgpr2 = COPY %sval
|
|
; CHECK-NEXT: $sgpr3 = COPY killed %sval
|
|
; CHECK-NEXT: SI_RETURN implicit killed $sgpr0_sgpr1_sgpr2_sgpr3
|
|
%sval:sreg_32 = S_MOV_B32 0
|
|
|
|
$sgpr0 = COPY %sval
|
|
$sgpr1 = COPY %sval
|
|
$sgpr2 = COPY %sval
|
|
$sgpr3 = COPY %sval
|
|
SI_RETURN implicit $sgpr0_sgpr1_sgpr2_sgpr3
|
|
|
|
...
|
|
---
|
|
# Check that super register is defined for a vgpr vector copy.
|
|
name: vgpr_copy
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
|
|
; CHECK-LABEL: name: vgpr_copy
|
|
; CHECK: %vval:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
|
|
; CHECK-NEXT: $vgpr0 = COPY %vval
|
|
; CHECK-NEXT: $vgpr1 = COPY %vval
|
|
; CHECK-NEXT: $vgpr2 = COPY %vval
|
|
; CHECK-NEXT: $vgpr3 = COPY killed %vval
|
|
; CHECK-NEXT: dead [[COPY:%[0-9]+]]:vgpr_32 = COPY killed $vgpr0_vgpr1_vgpr2_vgpr3
|
|
%vval:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
|
|
|
|
$vgpr0 = COPY %vval
|
|
$vgpr1 = COPY %vval
|
|
$vgpr2 = COPY %vval
|
|
$vgpr3 = COPY %vval
|
|
%0:vgpr_32 = COPY $vgpr0_vgpr1_vgpr2_vgpr3
|
|
|
|
...
|
|
---
|
|
# Check that super register is defined when there is a hole.
|
|
name: sgpr_copy_hole
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
; CHECK-LABEL: name: sgpr_copy_hole
|
|
; CHECK: %sval:sreg_32 = S_MOV_B32 0
|
|
; CHECK-NEXT: $sgpr0 = COPY %sval
|
|
; CHECK-NEXT: $sgpr2 = COPY %sval
|
|
; CHECK-NEXT: $sgpr3 = COPY killed %sval
|
|
; CHECK-NEXT: SI_RETURN implicit killed $sgpr0_sgpr1_sgpr2_sgpr3
|
|
%sval:sreg_32 = S_MOV_B32 0
|
|
|
|
$sgpr0 = COPY %sval
|
|
$sgpr2 = COPY %sval
|
|
$sgpr3 = COPY %sval
|
|
SI_RETURN implicit $sgpr0_sgpr1_sgpr2_sgpr3
|
|
|
|
...
|
|
---
|
|
# Check that super register is defined when a pair interrupts the sequence.
|
|
name: vgpr_copy_pair
|
|
tracksRegLiveness: true
|
|
body: |
|
|
bb.0:
|
|
; CHECK-LABEL: name: vgpr_copy_pair
|
|
; CHECK: %vval:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
|
|
; CHECK-NEXT: $vgpr0 = COPY %vval
|
|
; CHECK-NEXT: $vgpr1 = COPY %vval
|
|
; CHECK-NEXT: $vgpr2 = COPY %vval
|
|
; CHECK-NEXT: $vgpr3 = COPY killed %vval
|
|
; CHECK-NEXT: dead [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr1_vgpr2
|
|
; CHECK-NEXT: dead [[COPY1:%[0-9]+]]:vgpr_32 = COPY killed $vgpr0_vgpr1_vgpr2_vgpr3
|
|
%vval:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
|
|
|
|
$vgpr0 = COPY %vval
|
|
$vgpr1 = COPY %vval
|
|
$vgpr2 = COPY %vval
|
|
$vgpr3 = COPY %vval
|
|
%0:vgpr_32 = COPY $vgpr1_vgpr2
|
|
%1:vgpr_32 = COPY $vgpr0_vgpr1_vgpr2_vgpr3
|
|
...
|