mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-25 17:20:48 +00:00
Delete dead code after rematerializing.
LiveRangeEdit::eliminateDeadDefs() will eventually be used by coalescing, splitting, and spilling for dead code elimination. It can delete chains of dead instructions as long as there are no dependency loops. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127287 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -13,9 +13,12 @@
|
||||
|
||||
#include "LiveRangeEdit.h"
|
||||
#include "VirtRegMap.h"
|
||||
#include "llvm/ADT/SetVector.h"
|
||||
#include "llvm/CodeGen/LiveIntervalAnalysis.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/Target/TargetInstrInfo.h"
|
||||
#include "llvm/Support/Debug.h"
|
||||
#include "llvm/Support/raw_ostream.h"
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
@@ -128,3 +131,59 @@ SlotIndex LiveRangeEdit::rematerializeAt(MachineBasicBlock &MBB,
|
||||
return lis.InsertMachineInstrInMaps(--MI).getDefIndex();
|
||||
}
|
||||
|
||||
void LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr*> &Dead,
|
||||
LiveIntervals &LIS,
|
||||
const TargetInstrInfo &TII) {
|
||||
SetVector<LiveInterval*,
|
||||
SmallVector<LiveInterval*, 8>,
|
||||
SmallPtrSet<LiveInterval*, 8> > ToShrink;
|
||||
|
||||
for (;;) {
|
||||
// Erase all dead defs.
|
||||
while (!Dead.empty()) {
|
||||
MachineInstr *MI = Dead.pop_back_val();
|
||||
assert(MI->allDefsAreDead() && "Def isn't really dead");
|
||||
|
||||
// Never delete inline asm.
|
||||
if (MI->isInlineAsm())
|
||||
continue;
|
||||
|
||||
// Use the same criteria as DeadMachineInstructionElim.
|
||||
bool SawStore = false;
|
||||
if (!MI->isSafeToMove(&TII, 0, SawStore))
|
||||
continue;
|
||||
|
||||
SlotIndex Idx = LIS.getInstructionIndex(MI).getDefIndex();
|
||||
DEBUG(dbgs() << "Deleting dead def " << Idx << '\t' << *MI);
|
||||
|
||||
// Check for live intervals that may shrink
|
||||
for (MachineInstr::mop_iterator MOI = MI->operands_begin(),
|
||||
MOE = MI->operands_end(); MOI != MOE; ++MOI) {
|
||||
if (!MOI->isReg())
|
||||
continue;
|
||||
unsigned Reg = MOI->getReg();
|
||||
if (!TargetRegisterInfo::isVirtualRegister(Reg))
|
||||
continue;
|
||||
LiveInterval &LI = LIS.getInterval(Reg);
|
||||
// Remove defined value.
|
||||
if (MOI->isDef())
|
||||
if (VNInfo *VNI = LI.getVNInfoAt(Idx))
|
||||
LI.removeValNo(VNI);
|
||||
// Shrink read registers.
|
||||
if (MI->readsVirtualRegister(Reg))
|
||||
ToShrink.insert(&LI);
|
||||
}
|
||||
|
||||
LIS.RemoveMachineInstrFromMaps(MI);
|
||||
MI->eraseFromParent();
|
||||
}
|
||||
|
||||
if (ToShrink.empty())
|
||||
break;
|
||||
|
||||
// Shrink just one live interval. Then delete new dead defs.
|
||||
LIS.shrinkToUses(ToShrink.back(), &Dead);
|
||||
ToShrink.pop_back();
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user