[llvm] AMDGPU: Update live intervals in convertToThreeAddress (PR #104610)
Carl Ritson via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 5 22:49:25 PDT 2024
================
@@ -3934,18 +3934,38 @@ MachineInstr *SIInstrInfo::convertToThreeAddress(MachineInstr &MI,
(ST.getConstantBusLimit(Opc) > 1 || !Src0->isReg() ||
!RI.isSGPRReg(MBB.getParent()->getRegInfo(), Src0->getReg()))) {
MachineInstr *DefMI;
- const auto killDef = [&]() -> void {
- const MachineRegisterInfo &MRI = MBB.getParent()->getRegInfo();
+ const auto killDef = [&](SlotIndex OldUseIdx) -> void {
+ MachineRegisterInfo &MRI = MBB.getParent()->getRegInfo();
// The only user is the instruction which will be killed.
Register DefReg = DefMI->getOperand(0).getReg();
- if (!MRI.hasOneNonDBGUse(DefReg))
- return;
- // We cannot just remove the DefMI here, calling pass will crash.
- DefMI->setDesc(get(AMDGPU::IMPLICIT_DEF));
- for (unsigned I = DefMI->getNumOperands() - 1; I != 0; --I)
- DefMI->removeOperand(I);
- if (LV)
- LV->getVarInfo(DefReg).AliveBlocks.clear();
+
+ if (MRI.hasOneNonDBGUse(DefReg)) {
+ // We cannot just remove the DefMI here, calling pass will crash.
+ DefMI->setDesc(get(AMDGPU::IMPLICIT_DEF));
+ DefMI->getOperand(0).setIsDead(true);
+ for (unsigned I = DefMI->getNumOperands() - 1; I != 0; --I)
+ DefMI->removeOperand(I);
+ if (LV)
+ LV->getVarInfo(DefReg).AliveBlocks.clear();
+ }
+
+ if (LIS) {
+ LiveInterval &DefLI = LIS->getInterval(DefReg);
+
+ // We cannot delete the original instruction here, so hack out the use
----------------
perlfu wrote:
Can you add a test that demonstrates this?
https://github.com/llvm/llvm-project/pull/104610
More information about the llvm-commits
mailing list