Skip to content

Commit bb287c4

Browse files
committed
[LiveVariables] Mark use as implicit-def if def is a subregister
LiveVariables will mark instructions with their implicit subregister uses. However, it will miss marking the subregister as an implicit-def if its own definition is a subregister of it, i.e. `$r3 = OP val, implicit-def $r0_r1_r2_r3, ..., implicit $r2_r3`, which defines $sr3 on the same line it is used. This change ensures such uses are marked as implicit-def, i.e. `$r3 = OP val, implicit-def $r0_r1_r2_r3, ..., implicit-def $r2_r3`.
1 parent 62a25a4 commit bb287c4

File tree

2 files changed

+58
-3
lines changed

2 files changed

+58
-3
lines changed

llvm/lib/CodeGen/LiveVariables.cpp

+14-3
Original file line numberDiff line numberDiff line change
@@ -277,11 +277,22 @@ void LiveVariables::HandlePhysRegUse(Register Reg, MachineInstr &MI) {
277277
continue;
278278
if (PartDefRegs.count(SubReg))
279279
continue;
280+
281+
// Check if SubReg is defined at LastPartialDef.
282+
bool IsDefinedHere = false;
283+
for (int I = 0; I < LastPartialDef->getNumOperands(); ++I) {
284+
const auto MO = LastPartialDef->getOperand(I);
285+
if (!MO.isReg() || !MO.isDef())
286+
continue;
287+
if (TRI->isSubRegister(SubReg, MO.getReg())) {
288+
IsDefinedHere = true;
289+
break;
290+
}
291+
}
280292
// This part of Reg was defined before the last partial def. It's killed
281293
// here.
282-
LastPartialDef->addOperand(MachineOperand::CreateReg(SubReg,
283-
false/*IsDef*/,
284-
true/*IsImp*/));
294+
LastPartialDef->addOperand(
295+
MachineOperand::CreateReg(SubReg, IsDefinedHere, true /*IsImp*/));
285296
PhysRegDef[SubReg] = LastPartialDef;
286297
for (MCPhysReg SS : TRI->subregs(SubReg))
287298
Processed.insert(SS);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 5
2+
# RUN: llc -mtriple=amdgcn --run-pass=livevars -o - %s | FileCheck %s
3+
---
4+
name: sgpr_copy
5+
tracksRegLiveness: true
6+
body: |
7+
bb.0:
8+
; CHECK-LABEL: name: sgpr_copy
9+
; CHECK: %sval:sreg_32 = S_MOV_B32 0
10+
; CHECK-NEXT: $sgpr0 = COPY %sval
11+
; CHECK-NEXT: $sgpr1 = COPY %sval
12+
; CHECK-NEXT: $sgpr2 = COPY %sval
13+
; CHECK-NEXT: $sgpr3 = COPY killed %sval, implicit-def $sgpr0_sgpr1_sgpr2_sgpr3, implicit $sgpr0, implicit $sgpr1, implicit $sgpr2, implicit $sgpr0_sgpr1, implicit $sgpr0_sgpr1_sgpr2, implicit-def $sgpr2_sgpr3
14+
; CHECK-NEXT: dead $sgpr30_sgpr31 = COPY killed $sgpr0_sgpr1_sgpr2_sgpr3
15+
%sval:sreg_32 = S_MOV_B32 0
16+
17+
$sgpr0 = COPY %sval
18+
$sgpr1 = COPY %sval
19+
$sgpr2 = COPY %sval
20+
$sgpr3 = COPY %sval
21+
$sgpr30_sgpr31 = COPY $sgpr0_sgpr1_sgpr2_sgpr3
22+
23+
...
24+
---
25+
name: vgpr_copy
26+
tracksRegLiveness: true
27+
body: |
28+
bb.0:
29+
; CHECK-LABEL: name: vgpr_copy
30+
; CHECK: %sval:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
31+
; CHECK-NEXT: $vgpr0 = COPY %sval
32+
; CHECK-NEXT: $vgpr1 = COPY %sval
33+
; CHECK-NEXT: $vgpr2 = COPY %sval
34+
; CHECK-NEXT: $vgpr3 = COPY killed %sval, implicit-def $vgpr0_vgpr1_vgpr2_vgpr3, implicit $vgpr0, implicit $vgpr1, implicit $vgpr2, implicit $vgpr0_vgpr1, implicit $vgpr0_vgpr1_vgpr2, implicit-def $vgpr1_vgpr2_vgpr3
35+
; CHECK-NEXT: dead [[COPY:%[0-9]+]]:vgpr_32 = COPY killed $vgpr0_vgpr1_vgpr2_vgpr3
36+
%sval:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
37+
38+
$vgpr0 = COPY %sval
39+
$vgpr1 = COPY %sval
40+
$vgpr2 = COPY %sval
41+
$vgpr3 = COPY %sval
42+
%0:vgpr_32 = COPY $vgpr0_vgpr1_vgpr2_vgpr3
43+
44+
...

0 commit comments

Comments
 (0)