From d19a42eba98fe853dd52f7dc89d8cd2727c7fc1c Mon Sep 17 00:00:00 2001 From: Jay Foad Date: Fri, 9 Apr 2021 13:52:35 +0100 Subject: [PATCH] [AMDGPU] SIFoldOperands: eagerly erase dead REG_SEQUENCEs This is fairly cheap to implement and means less work for future passes like MachineDCE. Differential Revision: https://reviews.llvm.org/D100188 --- llvm/lib/Target/AMDGPU/SIFoldOperands.cpp | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp b/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp index 35594ecbde16..138666182613 100644 --- a/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp +++ b/llvm/lib/Target/AMDGPU/SIFoldOperands.cpp @@ -1596,6 +1596,10 @@ bool SIFoldOperands::tryFoldRegSequence(MachineInstr &MI) { LLVM_DEBUG(dbgs() << "Folded " << *RS << " into " << *UseMI); + // Erase the REG_SEQUENCE eagerly, unless we followed a chain of COPY users, + // in which case we can erase them all later in runOnMachineFunction. + if (MRI->use_nodbg_empty(MI.getOperand(0).getReg())) + MI.eraseFromParentAndMarkDBGValuesForRemoval(); return true; } @@ -1786,8 +1790,23 @@ bool SIFoldOperands::runOnMachineFunction(MachineFunction &MF) { // If we managed to fold all uses of this copy then we might as well // delete it now. - if (MRI->use_nodbg_empty(MI.getOperand(0).getReg())) - MI.eraseFromParentAndMarkDBGValuesForRemoval(); + // The only reason we need to follow chains of copies here is that + // tryFoldRegSequence looks forward through copies before folding a + // REG_SEQUENCE into its eventual users. + auto *InstToErase = &MI; + while (MRI->use_nodbg_empty(InstToErase->getOperand(0).getReg())) { + auto &SrcOp = InstToErase->getOperand(1); + auto SrcReg = SrcOp.isReg() ? SrcOp.getReg() : Register(); + InstToErase->eraseFromParentAndMarkDBGValuesForRemoval(); + if (!SrcReg || SrcReg.isPhysical()) + break; + InstToErase = MRI->getVRegDef(SrcReg); + if (!InstToErase || !TII->isFoldableCopy(*InstToErase)) + break; + } + if (InstToErase && InstToErase->isRegSequence() && + MRI->use_nodbg_empty(InstToErase->getOperand(0).getReg())) + InstToErase->eraseFromParentAndMarkDBGValuesForRemoval(); } } return true;