diff options
author | Jeffrey Byrnes <jeffrey.byrnes@amd.com> | 2025-01-23 12:54:29 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-01-23 12:54:29 -0800 |
commit | f2942b90778670d9ad974d025c779fc96afa737c (patch) | |
tree | 85e7f1d05852f4c6ac9b7dca3362d1b2b5f030e6 /llvm/lib/CodeGen/MachineInstr.cpp | |
parent | 76ed4b1cec57ad26433e4808697d6c4d042d4b22 (diff) | |
download | llvm-f2942b90778670d9ad974d025c779fc96afa737c.zip llvm-f2942b90778670d9ad974d025c779fc96afa737c.tar.gz llvm-f2942b90778670d9ad974d025c779fc96afa737c.tar.bz2 |
[CodeGen] NFC: Move isDead to MachineInstr (#123531)
Provide isDead interface for access to ad-hoc isDead queries.
LivePhysRegs is optional: if not provided, pessimistically check
deadness of a single MI without doing the LivePhysReg walk; if provided
it is assumed to be at the position of MI.
Diffstat (limited to 'llvm/lib/CodeGen/MachineInstr.cpp')
-rw-r--r-- | llvm/lib/CodeGen/MachineInstr.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/MachineInstr.cpp b/llvm/lib/CodeGen/MachineInstr.cpp index 8c2fab1..0f7f525 100644 --- a/llvm/lib/CodeGen/MachineInstr.cpp +++ b/llvm/lib/CodeGen/MachineInstr.cpp @@ -18,6 +18,7 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Analysis/MemoryLocation.h" +#include "llvm/CodeGen/LiveRegUnits.h" #include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/CodeGen/MachineFrameInfo.h" #include "llvm/CodeGen/MachineFunction.h" @@ -1350,6 +1351,43 @@ bool MachineInstr::wouldBeTriviallyDead() const { return isPHI() || isSafeToMove(SawStore); } +bool MachineInstr::isDead(const MachineRegisterInfo &MRI, + LiveRegUnits *LivePhysRegs) const { + // Technically speaking inline asm without side effects and no defs can still + // be deleted. But there is so much bad inline asm code out there, we should + // let them be. + if (isInlineAsm()) + return false; + + // If we suspect this instruction may have some side-effects, then we say + // this instruction cannot be dead. + // FIXME: See issue #105950 for why LIFETIME markers are considered dead here. + if (!isLifetimeMarker() && !wouldBeTriviallyDead()) + return false; + + // Instructions without side-effects are dead iff they only define dead regs. + // This function is hot and this loop returns early in the common case, + // so only perform additional checks before this if absolutely necessary. + for (const MachineOperand &MO : all_defs()) { + Register Reg = MO.getReg(); + if (Reg.isPhysical()) { + // Don't delete live physreg defs, or any reserved register defs. + if (!LivePhysRegs || !LivePhysRegs->available(Reg) || MRI.isReserved(Reg)) + return false; + } else { + if (MO.isDead()) + continue; + for (const MachineInstr &Use : MRI.use_nodbg_instructions(Reg)) { + if (&Use != this) + // This def has a non-debug use. Don't delete the instruction! + return false; + } + } + } + + return true; +} + static bool MemOperandsHaveAlias(const MachineFrameInfo &MFI, BatchAAResults *AA, bool UseTBAA, const MachineMemOperand *MMOa, |