Skip to content

Commit 807378a

Browse files
committed
AMDGPU: Update live intervals in convertToThreeAddress
Fixes #98741
1 parent a434cac commit 807378a

File tree

2 files changed

+132
-18
lines changed

2 files changed

+132
-18
lines changed

llvm/lib/Target/AMDGPU/SIInstrInfo.cpp

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3947,14 +3947,32 @@ MachineInstr *SIInstrInfo::convertToThreeAddress(MachineInstr &MI,
39473947
(ST.getConstantBusLimit(Opc) > 1 || !Src0->isReg() ||
39483948
!RI.isSGPRReg(MBB.getParent()->getRegInfo(), Src0->getReg()))) {
39493949
MachineInstr *DefMI;
3950-
const auto killDef = [&]() -> void {
3950+
const auto killDef = [&](SlotIndex NewIdx) -> void {
39513951
const MachineRegisterInfo &MRI = MBB.getParent()->getRegInfo();
39523952
// The only user is the instruction which will be killed.
39533953
Register DefReg = DefMI->getOperand(0).getReg();
3954+
3955+
if (LIS) {
3956+
LiveInterval &DefLI = LIS->getInterval(DefReg);
3957+
LiveRange::Segment *OldSeg = DefLI.getSegmentContaining(NewIdx);
3958+
3959+
if (OldSeg->end == NewIdx.getRegSlot()) {
3960+
DefLI.removeSegment(OldSeg->start, NewIdx.getRegSlot(), true);
3961+
3962+
for (auto &SR : DefLI.subranges()) {
3963+
LiveRange::Segment *OldSegSR = SR.getSegmentContaining(NewIdx);
3964+
SR.removeSegment(OldSegSR->start, NewIdx.getRegSlot(), true);
3965+
}
3966+
3967+
DefLI.removeEmptySubRanges();
3968+
}
3969+
}
3970+
39543971
if (!MRI.hasOneNonDBGUse(DefReg))
39553972
return;
39563973
// We cannot just remove the DefMI here, calling pass will crash.
39573974
DefMI->setDesc(get(AMDGPU::IMPLICIT_DEF));
3975+
DefMI->getOperand(0).setIsDead(true);
39583976
for (unsigned I = DefMI->getNumOperands() - 1; I != 0; --I)
39593977
DefMI->removeOperand(I);
39603978
if (LV)
@@ -3976,9 +3994,10 @@ MachineInstr *SIInstrInfo::convertToThreeAddress(MachineInstr &MI,
39763994
.addImm(Imm)
39773995
.setMIFlags(MI.getFlags());
39783996
updateLiveVariables(LV, MI, *MIB);
3997+
SlotIndex NewIdx;
39793998
if (LIS)
3980-
LIS->ReplaceMachineInstrInMaps(MI, *MIB);
3981-
killDef();
3999+
NewIdx = LIS->ReplaceMachineInstrInMaps(MI, *MIB);
4000+
killDef(NewIdx);
39824001
return MIB;
39834002
}
39844003
}
@@ -3996,9 +4015,11 @@ MachineInstr *SIInstrInfo::convertToThreeAddress(MachineInstr &MI,
39964015
.add(*Src2)
39974016
.setMIFlags(MI.getFlags());
39984017
updateLiveVariables(LV, MI, *MIB);
4018+
4019+
SlotIndex NewIdx;
39994020
if (LIS)
4000-
LIS->ReplaceMachineInstrInMaps(MI, *MIB);
4001-
killDef();
4021+
NewIdx = LIS->ReplaceMachineInstrInMaps(MI, *MIB);
4022+
killDef(NewIdx);
40024023
return MIB;
40034024
}
40044025
}
@@ -4018,10 +4039,12 @@ MachineInstr *SIInstrInfo::convertToThreeAddress(MachineInstr &MI,
40184039
.add(*Src2)
40194040
.setMIFlags(MI.getFlags());
40204041
updateLiveVariables(LV, MI, *MIB);
4042+
4043+
SlotIndex NewIdx;
40214044
if (LIS)
4022-
LIS->ReplaceMachineInstrInMaps(MI, *MIB);
4045+
NewIdx = LIS->ReplaceMachineInstrInMaps(MI, *MIB);
40234046
if (DefMI)
4024-
killDef();
4047+
killDef(NewIdx);
40254048
return MIB;
40264049
}
40274050
}

llvm/test/CodeGen/AMDGPU/gfx10-twoaddr-fma.mir

Lines changed: 102 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,120 @@
11
# RUN: llc -mtriple=amdgcn -mcpu=gfx1010 %s -run-pass twoaddressinstruction -verify-machineinstrs -o - | FileCheck --check-prefixes=GFX10 %s
22
# RUN: llc -mtriple=amdgcn -mcpu=gfx1010 %s --passes=two-address-instruction -o - | FileCheck --check-prefixes=GFX10 %s
3+
# RUN: llc -mtriple=amdgcn -mcpu=gfx1010 -run-pass liveintervals,twoaddressinstruction -verify-machineinstrs %s -o -
34

45
# GFX10-LABEL: name: test_fmamk_reg_imm_f16
5-
# GFX10: %2:vgpr_32 = IMPLICIT_DEF
6+
# GFX10: dead %2:vgpr_32 = IMPLICIT_DEF
67
# GFX10-NOT: V_MOV_B32
78
# GFX10: V_FMAMK_F16 killed %0.sub0, 1078523331, killed %1, implicit $mode, implicit $exec
89
---
910
name: test_fmamk_reg_imm_f16
10-
registers:
11-
- { id: 0, class: vreg_64 }
12-
- { id: 1, class: vgpr_32 }
13-
- { id: 2, class: vgpr_32 }
14-
- { id: 3, class: vgpr_32 }
1511
body: |
1612
bb.0:
1713
18-
%0 = IMPLICIT_DEF
19-
%1 = COPY %0.sub1
20-
%2 = V_MOV_B32_e32 1078523331, implicit $exec
21-
%3 = V_FMAC_F16_e32 killed %0.sub0, %2, killed %1, implicit $mode, implicit $exec
14+
%0:vreg_64 = IMPLICIT_DEF
15+
%1:vgpr_32 = COPY %0.sub1
16+
%2:vgpr_32 = V_MOV_B32_e32 1078523331, implicit $exec
17+
%3:vgpr_32 = V_FMAC_F16_e32 killed %0.sub0, %2, killed %1, implicit $mode, implicit $exec
18+
19+
...
20+
21+
# GFX10-LABEL: name: test_fmamk_reg_imm_f16__imm_is_subreg
22+
# GFX10: %0:vreg_64 = IMPLICIT_DEF
23+
# GFX10: %1:vgpr_32 = COPY %0.sub1
24+
# GFX10: dead undef %2.sub0:vreg_64 = IMPLICIT_DEF
25+
# GFX10: %3:vgpr_32 = V_FMAMK_F16 killed %0.sub0, 1078523331, killed %1, implicit $mode, implicit $exec
26+
---
27+
name: test_fmamk_reg_imm_f16__imm_is_subreg
28+
body: |
29+
bb.0:
30+
31+
%0:vreg_64 = IMPLICIT_DEF
32+
%1:vgpr_32 = COPY %0.sub1
33+
undef %2.sub0:vreg_64 = V_MOV_B32_e32 1078523331, implicit $exec
34+
%3:vgpr_32 = V_FMAC_F16_e32 killed %0.sub0, %2.sub0, killed %1, implicit $mode, implicit $exec
35+
36+
...
37+
38+
# GFX10-LABEL: name: test_fmamk_reg_imm_f16__imm_is_subreg_fully_defined
39+
# GFX10: %0:vreg_64 = IMPLICIT_DEF
40+
# GFX10: %1:vgpr_32 = COPY %0.sub1
41+
# GFX10: undef %2.sub1:vreg_64 = V_MOV_B32_e32 9999, implicit $exec
42+
# GFX10: %2.sub0:vreg_64 = V_MOV_B32_e32 1078523331, implicit $exec
43+
# GFX10: %3:vgpr_32 = V_FMA_F16_gfx9_e64 0, killed %0.sub0, 0, %2.sub0, 0, killed %1, 0, 0, 0, implicit $mode, implicit $e
44+
---
45+
name: test_fmamk_reg_imm_f16__imm_is_subreg_fully_defined
46+
body: |
47+
bb.0:
48+
49+
%0:vreg_64 = IMPLICIT_DEF
50+
%1:vgpr_32 = COPY %0.sub1
51+
undef %2.sub1 = V_MOV_B32_e32 9999, implicit $exec
52+
%2.sub0:vreg_64 = V_MOV_B32_e32 1078523331, implicit $exec
53+
%3:vgpr_32 = V_FMAC_F16_e32 killed %0.sub0, %2.sub0, killed %1, implicit $mode, implicit $exec
54+
55+
...
56+
57+
# GFX10-LABEL: name: test_fmamk_reg_imm_f16__use_imm_before_mac
58+
# GFX10: %0:vreg_64 = IMPLICIT_DEF
59+
# GFX10: %1:vgpr_32 = COPY %0.sub1
60+
# GFX10: %2:vgpr_32 = V_MOV_B32_e32 1078523331, implicit $exec
61+
# GFX10: S_NOP 0, implicit %2
62+
# GFX10: %3:vgpr_32 = V_FMAMK_F16 killed %0.sub0, 1078523331, killed %1, implicit $mode, implicit $exec
63+
---
64+
name: test_fmamk_reg_imm_f16__use_imm_before_mac
65+
body: |
66+
bb.0:
67+
68+
%0:vreg_64 = IMPLICIT_DEF
69+
%1:vgpr_32 = COPY %0.sub1
70+
%2:vgpr_32 = V_MOV_B32_e32 1078523331, implicit $exec
71+
S_NOP 0, implicit %2
72+
%3:vgpr_32 = V_FMAC_F16_e32 killed %0.sub0, %2, killed %1, implicit $mode, implicit $exec
73+
74+
...
75+
76+
# GFX10-LABEL: name: test_fmamk_reg_imm_f16__use_imm_after_mac
77+
# GFX10: %0:vreg_64 = IMPLICIT_DEF
78+
# GFX10: %1:vgpr_32 = COPY %0.sub1
79+
# GFX10: %2:vgpr_32 = V_MOV_B32_e32 1078523331, implicit $exec
80+
# GFX10: %3:vgpr_32 = V_FMAMK_F16 killed %0.sub0, 1078523331, killed %1, implicit $mode, implicit $exec
81+
---
82+
name: test_fmamk_reg_imm_f16__use_imm_after_mac
83+
body: |
84+
bb.0:
85+
86+
%0:vreg_64 = IMPLICIT_DEF
87+
%1:vgpr_32 = COPY %0.sub1
88+
%2:vgpr_32 = V_MOV_B32_e32 1078523331, implicit $exec
89+
%3:vgpr_32 = V_FMAC_F16_e32 killed %0.sub0, %2, killed %1, implicit $mode, implicit $exec
90+
S_NOP 0, implicit %2
91+
92+
...
93+
94+
# GFX10-LABEL: name: test_fmamk_reg_imm_f16__use_imm_before_after_mac
95+
# GFX10: %0:vreg_64 = IMPLICIT_DEF
96+
# GFX10: %1:vgpr_32 = COPY %0.sub1
97+
# GFX10: %2:vgpr_32 = V_MOV_B32_e32 1078523331, implicit $exec
98+
# GFX10: S_NOP 0, implicit %2
99+
# GFX10: %3:vgpr_32 = V_FMAMK_F16 killed %0.sub0, 1078523331, killed %1, implicit $mode, implicit $exec
100+
# GFX10: S_NOP 0, implicit %2
101+
102+
---
103+
name: test_fmamk_reg_imm_f16__use_imm_before_after_mac
104+
body: |
105+
bb.0:
106+
107+
%0:vreg_64 = IMPLICIT_DEF
108+
%1:vgpr_32 = COPY %0.sub1
109+
%2:vgpr_32 = V_MOV_B32_e32 1078523331, implicit $exec
110+
S_NOP 0, implicit %2
111+
%3:vgpr_32 = V_FMAC_F16_e32 killed %0.sub0, %2, killed %1, implicit $mode, implicit $exec
112+
S_NOP 0, implicit %2
22113
23114
...
24115

25116
# GFX10-LABEL: name: test_fmamk_imm_reg_f16
26-
# GFX10: %2:vgpr_32 = IMPLICIT_DEF
117+
# GFX10: dead %2:vgpr_32 = IMPLICIT_DEF
27118
# GFX10-NOT: V_MOV_B32
28119
# GFX10: V_FMAMK_F16 killed %0.sub0, 1078523331, killed %1, implicit $mode, implicit $exec
29120
---

0 commit comments

Comments
 (0)