mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 04:30:12 +00:00
Use readsWritesVirtualRegister instead of counting uses and defs when inserting
spills and reloads. This means that a partial define of a register causes a reload so the other parts of the register are preserved. The reload can be prevented by adding an <imp-def> operand for the full register. This is already done by the coalescer and live interval analysis where relevant. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@105369 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
02571a3a1f
commit
ead06be02f
@ -1098,7 +1098,6 @@ rewriteInstructionForSpills(const LiveInterval &li, const VNInfo *VNI,
|
||||
if (!mop.isReg())
|
||||
continue;
|
||||
unsigned Reg = mop.getReg();
|
||||
unsigned RegI = Reg;
|
||||
if (Reg == 0 || TargetRegisterInfo::isPhysicalRegister(Reg))
|
||||
continue;
|
||||
if (Reg != li.reg)
|
||||
@ -1140,26 +1139,8 @@ rewriteInstructionForSpills(const LiveInterval &li, const VNInfo *VNI,
|
||||
//
|
||||
// Keep track of whether we replace a use and/or def so that we can
|
||||
// create the spill interval with the appropriate range.
|
||||
|
||||
HasUse = mop.isUse();
|
||||
HasDef = mop.isDef();
|
||||
SmallVector<unsigned, 2> Ops;
|
||||
Ops.push_back(i);
|
||||
for (unsigned j = i+1, e = MI->getNumOperands(); j != e; ++j) {
|
||||
const MachineOperand &MOj = MI->getOperand(j);
|
||||
if (!MOj.isReg())
|
||||
continue;
|
||||
unsigned RegJ = MOj.getReg();
|
||||
if (RegJ == 0 || TargetRegisterInfo::isPhysicalRegister(RegJ))
|
||||
continue;
|
||||
if (RegJ == RegI) {
|
||||
Ops.push_back(j);
|
||||
if (!MOj.isUndef()) {
|
||||
HasUse |= MOj.isUse();
|
||||
HasDef |= MOj.isDef();
|
||||
}
|
||||
}
|
||||
}
|
||||
tie(HasUse, HasDef) = MI->readsWritesVirtualRegister(Reg, &Ops);
|
||||
|
||||
// Create a new virtual register for the spill interval.
|
||||
// Create the new register now so we can map the fold instruction
|
||||
@ -1312,10 +1293,7 @@ namespace {
|
||||
struct RewriteInfo {
|
||||
SlotIndex Index;
|
||||
MachineInstr *MI;
|
||||
bool HasUse;
|
||||
bool HasDef;
|
||||
RewriteInfo(SlotIndex i, MachineInstr *mi, bool u, bool d)
|
||||
: Index(i), MI(mi), HasUse(u), HasDef(d) {}
|
||||
RewriteInfo(SlotIndex i, MachineInstr *mi) : Index(i), MI(mi) {}
|
||||
};
|
||||
|
||||
struct RewriteInfoCompare {
|
||||
@ -1394,7 +1372,7 @@ rewriteInstructionsForSpills(const LiveInterval &li, bool TrySplit,
|
||||
// easily see a situation where both registers are reloaded before
|
||||
// the INSERT_SUBREG and both target registers that would overlap.
|
||||
continue;
|
||||
RewriteMIs.push_back(RewriteInfo(index, MI, O.isUse(), O.isDef()));
|
||||
RewriteMIs.push_back(RewriteInfo(index, MI));
|
||||
}
|
||||
std::sort(RewriteMIs.begin(), RewriteMIs.end(), RewriteInfoCompare());
|
||||
|
||||
@ -1404,18 +1382,11 @@ rewriteInstructionsForSpills(const LiveInterval &li, bool TrySplit,
|
||||
RewriteInfo &rwi = RewriteMIs[i];
|
||||
++i;
|
||||
SlotIndex index = rwi.Index;
|
||||
bool MIHasUse = rwi.HasUse;
|
||||
bool MIHasDef = rwi.HasDef;
|
||||
MachineInstr *MI = rwi.MI;
|
||||
// If MI def and/or use the same register multiple times, then there
|
||||
// are multiple entries.
|
||||
unsigned NumUses = MIHasUse;
|
||||
while (i != e && RewriteMIs[i].MI == MI) {
|
||||
assert(RewriteMIs[i].Index == index);
|
||||
bool isUse = RewriteMIs[i].HasUse;
|
||||
if (isUse) ++NumUses;
|
||||
MIHasUse |= isUse;
|
||||
MIHasDef |= RewriteMIs[i].HasDef;
|
||||
++i;
|
||||
}
|
||||
MachineBasicBlock *MBB = MI->getParent();
|
||||
@ -1440,7 +1411,8 @@ rewriteInstructionsForSpills(const LiveInterval &li, bool TrySplit,
|
||||
// = use
|
||||
// It's better to start a new interval to avoid artifically
|
||||
// extend the new interval.
|
||||
if (MIHasDef && !MIHasUse) {
|
||||
if (MI->readsWritesVirtualRegister(li.reg) ==
|
||||
std::make_pair(false,true)) {
|
||||
MBBVRegsMap.erase(MBB->getNumber());
|
||||
ThisVReg = 0;
|
||||
}
|
||||
@ -1674,19 +1646,9 @@ addIntervalsForSpillsFast(const LiveInterval &li,
|
||||
MachineInstr* MI = &*RI;
|
||||
|
||||
SmallVector<unsigned, 2> Indices;
|
||||
bool HasUse = false;
|
||||
bool HasDef = false;
|
||||
|
||||
for (unsigned i = 0; i != MI->getNumOperands(); ++i) {
|
||||
MachineOperand& mop = MI->getOperand(i);
|
||||
if (!mop.isReg() || mop.getReg() != li.reg) continue;
|
||||
|
||||
HasUse |= MI->getOperand(i).isUse();
|
||||
HasDef |= MI->getOperand(i).isDef();
|
||||
|
||||
Indices.push_back(i);
|
||||
}
|
||||
|
||||
bool HasUse, HasDef;
|
||||
tie(HasUse, HasDef) = MI->readsWritesVirtualRegister(li.reg, &Indices);
|
||||
|
||||
if (!tryFoldMemoryOperand(MI, vrm, NULL, getInstructionIndex(MI),
|
||||
Indices, true, slot, li.reg)) {
|
||||
unsigned NewVReg = mri_->createVirtualRegister(rc);
|
||||
|
Loading…
Reference in New Issue
Block a user