mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-01 05:01:59 +01:00
[Cleanup] Utility function to erase instruction and mark DBG_Values
New function to erase a machine instruction and mark DBG_VALUE for removal. A DBG_VALUE is marked for removal when it references an operand defined in the instruction. Use the new function to cleanup code in dead machine instruction removal pass. llvm-svn: 215580
This commit is contained in:
parent
2563daec04
commit
97f5907d85
@ -685,6 +685,12 @@ public:
|
||||
/// eraseFromBundle() to erase individual bundled instructions.
|
||||
void eraseFromParent();
|
||||
|
||||
/// Unlink 'this' from the containing basic block and delete it.
|
||||
///
|
||||
/// For all definitions mark their uses in DBG_VALUE nodes
|
||||
/// as undefined. Otherwise like eraseFromParent().
|
||||
void eraseFromParentAndMarkDBGValuesForRemoval();
|
||||
|
||||
/// Unlink 'this' form its basic block and delete it.
|
||||
///
|
||||
/// If the instruction is part of a bundle, the other instructions in the
|
||||
|
@ -124,19 +124,10 @@ bool DeadMachineInstructionElim::runOnMachineFunction(MachineFunction &MF) {
|
||||
if (isDead(MI)) {
|
||||
DEBUG(dbgs() << "DeadMachineInstructionElim: DELETING: " << *MI);
|
||||
// It is possible that some DBG_VALUE instructions refer to this
|
||||
// instruction. Examine each def operand for such references;
|
||||
// if found, mark the DBG_VALUE as undef (but don't delete it).
|
||||
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
|
||||
const MachineOperand &MO = MI->getOperand(i);
|
||||
if (!MO.isReg() || !MO.isDef())
|
||||
continue;
|
||||
unsigned Reg = MO.getReg();
|
||||
if (!TargetRegisterInfo::isVirtualRegister(Reg))
|
||||
continue;
|
||||
MRI->markUsesInDebugValueAsUndef(Reg);
|
||||
}
|
||||
// instruction. They get marked as undef and will be deleted
|
||||
// in the live debug variable analysis.
|
||||
MI->eraseFromParentAndMarkDBGValuesForRemoval();
|
||||
AnyChanges = true;
|
||||
MI->eraseFromParent();
|
||||
++NumDeletes;
|
||||
MIE = MBB->rend();
|
||||
// MII is now pointing to the next instruction to process,
|
||||
|
@ -895,6 +895,27 @@ void MachineInstr::eraseFromParent() {
|
||||
getParent()->erase(this);
|
||||
}
|
||||
|
||||
void MachineInstr::eraseFromParentAndMarkDBGValuesForRemoval() {
|
||||
assert(getParent() && "Not embedded in a basic block!");
|
||||
MachineBasicBlock *MBB = getParent();
|
||||
MachineFunction *MF = MBB->getParent();
|
||||
assert(MF && "Not embedded in a function!");
|
||||
|
||||
MachineInstr *MI = (MachineInstr *)this;
|
||||
MachineRegisterInfo &MRI = MF->getRegInfo();
|
||||
|
||||
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
|
||||
const MachineOperand &MO = MI->getOperand(i);
|
||||
if (!MO.isReg() || !MO.isDef())
|
||||
continue;
|
||||
unsigned Reg = MO.getReg();
|
||||
if (!TargetRegisterInfo::isVirtualRegister(Reg))
|
||||
continue;
|
||||
MRI.markUsesInDebugValueAsUndef(Reg);
|
||||
}
|
||||
MI->eraseFromParent();
|
||||
}
|
||||
|
||||
void MachineInstr::eraseFromBundle() {
|
||||
assert(getParent() && "Not embedded in a basic block!");
|
||||
getParent()->erase_instr(this);
|
||||
|
Loading…
x
Reference in New Issue
Block a user