mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2026-04-21 23:17:16 +00:00
Dead code elimination may separate the live interval into multiple connected components.
I have convinced myself that it can only happen when a phi value dies. When it happens, allocate new virtual registers for the components. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@127827 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -22,16 +22,16 @@
|
||||
|
||||
using namespace llvm;
|
||||
|
||||
LiveInterval &LiveRangeEdit::create(MachineRegisterInfo &mri,
|
||||
LiveIntervals &lis,
|
||||
VirtRegMap &vrm) {
|
||||
const TargetRegisterClass *RC = mri.getRegClass(getReg());
|
||||
unsigned VReg = mri.createVirtualRegister(RC);
|
||||
vrm.grow();
|
||||
vrm.setIsSplitFromReg(VReg, vrm.getOriginal(getReg()));
|
||||
LiveInterval &li = lis.getOrCreateInterval(VReg);
|
||||
newRegs_.push_back(&li);
|
||||
return li;
|
||||
LiveInterval &LiveRangeEdit::createFrom(unsigned OldReg,
|
||||
LiveIntervals &LIS,
|
||||
VirtRegMap &VRM) {
|
||||
MachineRegisterInfo &MRI = VRM.getRegInfo();
|
||||
unsigned VReg = MRI.createVirtualRegister(MRI.getRegClass(OldReg));
|
||||
VRM.grow();
|
||||
VRM.setIsSplitFromReg(VReg, VRM.getOriginal(OldReg));
|
||||
LiveInterval &LI = LIS.getOrCreateInterval(VReg);
|
||||
newRegs_.push_back(&LI);
|
||||
return LI;
|
||||
}
|
||||
|
||||
void LiveRangeEdit::scanRemattable(LiveIntervals &lis,
|
||||
@@ -137,7 +137,7 @@ void LiveRangeEdit::eraseVirtReg(unsigned Reg, LiveIntervals &LIS) {
|
||||
}
|
||||
|
||||
void LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr*> &Dead,
|
||||
LiveIntervals &LIS,
|
||||
LiveIntervals &LIS, VirtRegMap &VRM,
|
||||
const TargetInstrInfo &TII) {
|
||||
SetVector<LiveInterval*,
|
||||
SmallVector<LiveInterval*, 8>,
|
||||
@@ -205,7 +205,20 @@ void LiveRangeEdit::eliminateDeadDefs(SmallVectorImpl<MachineInstr*> &Dead,
|
||||
ToShrink.pop_back();
|
||||
if (delegate_)
|
||||
delegate_->LRE_WillShrinkVirtReg(LI->reg);
|
||||
LIS.shrinkToUses(LI, &Dead);
|
||||
if (!LIS.shrinkToUses(LI, &Dead))
|
||||
continue;
|
||||
|
||||
// LI may have been separated, create new intervals.
|
||||
LI->RenumberValues(LIS);
|
||||
ConnectedVNInfoEqClasses ConEQ(LIS);
|
||||
unsigned NumComp = ConEQ.Classify(LI);
|
||||
if (NumComp <= 1)
|
||||
continue;
|
||||
DEBUG(dbgs() << NumComp << " components: " << *LI << '\n');
|
||||
SmallVector<LiveInterval*, 8> Dups(1, LI);
|
||||
for (unsigned i = 1; i != NumComp; ++i)
|
||||
Dups.push_back(&createFrom(LI->reg, LIS, VRM));
|
||||
ConEQ.Distribute(&Dups[0], VRM.getRegInfo());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user