Skip to content

Commit 176ae32

Browse files
authored
AMDGPU: Fix introducing use of killed vgpr in gfx908 agpr copy (#149291)
When searching for an existing VGPR source for an AGPR to AGPR copy on gfx908, this wasn't verifying the vgpr wasn't killed by other prior uses.
1 parent c435cd1 commit 176ae32

File tree

2 files changed

+85
-1
lines changed

2 files changed

+85
-1
lines changed

llvm/lib/Target/AMDGPU/SIInstrInfo.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -687,7 +687,8 @@ static void indirectCopyToAGPR(const SIInstrInfo &TII,
687687
if (!SafeToPropagate)
688688
break;
689689

690-
DefOp.setIsKill(false);
690+
for (auto I = Def; I != MI; ++I)
691+
I->clearRegisterKills(DefOp.getReg(), &RI);
691692
}
692693

693694
MachineInstrBuilder Builder =

llvm/test/CodeGen/AMDGPU/accvgpr-copy.mir

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@
4545
define amdgpu_kernel void @copy_agpr_to_agpr_tuple() #0 { ret void }
4646
define amdgpu_kernel void @copy_agpr_to_agpr_tuple_kill() #0 { ret void }
4747

48+
define amdgpu_kernel void @look_for_vgpr_killed() #0 { ret void }
49+
define amdgpu_kernel void @look_for_vgpr_killed_tuple() #0 { ret void }
50+
4851
attributes #0 = { "amdgpu-flat-work-group-size"="1,256" }
4952
...
5053

@@ -1517,3 +1520,83 @@ body: |
15171520
renamable $agpr4_agpr5_agpr6_agpr7 = COPY renamable killed $agpr0_agpr1_agpr2_agpr3, implicit $exec
15181521
S_ENDPGM 0, implicit $agpr4_agpr5_agpr6_agpr7
15191522
...
1523+
1524+
# Make sure the expansion of the a-to-a copy doesn't introduce a use
1525+
# after kill of the source vgpr
1526+
---
1527+
name: look_for_vgpr_killed
1528+
tracksRegLiveness: true
1529+
body: |
1530+
bb.0:
1531+
liveins: $agpr0
1532+
1533+
; GFX908-LABEL: name: look_for_vgpr_killed
1534+
; GFX908: liveins: $agpr0
1535+
; GFX908-NEXT: {{ $}}
1536+
; GFX908-NEXT: $vgpr0 = V_MOV_B32_e32 0, implicit $exec
1537+
; GFX908-NEXT: $agpr0 = V_ACCVGPR_WRITE_B32_e64 $vgpr0, implicit $exec
1538+
; GFX908-NEXT: S_NOP 0, implicit $vgpr0
1539+
; GFX908-NEXT: $agpr1 = V_ACCVGPR_WRITE_B32_e64 $vgpr0, implicit $exec
1540+
;
1541+
; GFX90A-LABEL: name: look_for_vgpr_killed
1542+
; GFX90A: liveins: $agpr0
1543+
; GFX90A-NEXT: {{ $}}
1544+
; GFX90A-NEXT: $vgpr0 = V_MOV_B32_e32 0, implicit $exec
1545+
; GFX90A-NEXT: $agpr0 = V_ACCVGPR_WRITE_B32_e64 $vgpr0, implicit $exec
1546+
; GFX90A-NEXT: S_NOP 0, implicit killed $vgpr0
1547+
; GFX90A-NEXT: $agpr1 = V_ACCVGPR_MOV_B32 $agpr0, implicit $exec
1548+
;
1549+
; GFX942-LABEL: name: look_for_vgpr_killed
1550+
; GFX942: liveins: $agpr0
1551+
; GFX942-NEXT: {{ $}}
1552+
; GFX942-NEXT: $vgpr0 = V_MOV_B32_e32 0, implicit $exec
1553+
; GFX942-NEXT: $agpr0 = V_ACCVGPR_WRITE_B32_e64 $vgpr0, implicit $exec
1554+
; GFX942-NEXT: S_NOP 0, implicit killed $vgpr0
1555+
; GFX942-NEXT: $agpr1 = V_ACCVGPR_MOV_B32 $agpr0, implicit $exec
1556+
$vgpr0 = V_MOV_B32_e32 0, implicit $exec
1557+
$agpr0 = COPY $vgpr0
1558+
S_NOP 0, implicit killed $vgpr0
1559+
$agpr1 = COPY $agpr0
1560+
1561+
...
1562+
1563+
---
1564+
name: look_for_vgpr_killed_tuple
1565+
tracksRegLiveness: true
1566+
body: |
1567+
bb.0:
1568+
liveins: $agpr0
1569+
1570+
; GFX908-LABEL: name: look_for_vgpr_killed_tuple
1571+
; GFX908: liveins: $agpr0
1572+
; GFX908-NEXT: {{ $}}
1573+
; GFX908-NEXT: $vgpr0 = V_MOV_B32_e32 0, implicit $exec, implicit-def $vgpr0_vgpr1
1574+
; GFX908-NEXT: $vgpr1 = V_MOV_B32_e32 1, implicit $exec
1575+
; GFX908-NEXT: $agpr0 = V_ACCVGPR_WRITE_B32_e64 $vgpr0, implicit $exec
1576+
; GFX908-NEXT: S_NOP 0, implicit $vgpr0_vgpr1
1577+
; GFX908-NEXT: $agpr1 = V_ACCVGPR_WRITE_B32_e64 $vgpr0, implicit $exec
1578+
;
1579+
; GFX90A-LABEL: name: look_for_vgpr_killed_tuple
1580+
; GFX90A: liveins: $agpr0
1581+
; GFX90A-NEXT: {{ $}}
1582+
; GFX90A-NEXT: $vgpr0 = V_MOV_B32_e32 0, implicit $exec, implicit-def $vgpr0_vgpr1
1583+
; GFX90A-NEXT: $vgpr1 = V_MOV_B32_e32 1, implicit $exec
1584+
; GFX90A-NEXT: $agpr0 = V_ACCVGPR_WRITE_B32_e64 $vgpr0, implicit $exec
1585+
; GFX90A-NEXT: S_NOP 0, implicit killed $vgpr0_vgpr1
1586+
; GFX90A-NEXT: $agpr1 = V_ACCVGPR_MOV_B32 $agpr0, implicit $exec
1587+
;
1588+
; GFX942-LABEL: name: look_for_vgpr_killed_tuple
1589+
; GFX942: liveins: $agpr0
1590+
; GFX942-NEXT: {{ $}}
1591+
; GFX942-NEXT: $vgpr0 = V_MOV_B32_e32 0, implicit $exec, implicit-def $vgpr0_vgpr1
1592+
; GFX942-NEXT: $vgpr1 = V_MOV_B32_e32 1, implicit $exec
1593+
; GFX942-NEXT: $agpr0 = V_ACCVGPR_WRITE_B32_e64 $vgpr0, implicit $exec
1594+
; GFX942-NEXT: S_NOP 0, implicit killed $vgpr0_vgpr1
1595+
; GFX942-NEXT: $agpr1 = V_ACCVGPR_MOV_B32 $agpr0, implicit $exec
1596+
$vgpr0 = V_MOV_B32_e32 0, implicit $exec, implicit-def $vgpr0_vgpr1
1597+
$vgpr1 = V_MOV_B32_e32 1, implicit $exec
1598+
$agpr0 = COPY $vgpr0
1599+
S_NOP 0, implicit killed $vgpr0_vgpr1
1600+
$agpr1 = COPY $agpr0
1601+
1602+
...

0 commit comments

Comments
 (0)