mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-09-07 16:54:48 +00:00
Fix PR2634. Create new virtual registers from spills early so that we
can give it the same stack slot as the spilled interval if it is folded. This prevents the fold/unfold code from pointing to the wrong register. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58255 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
677fbfa450
commit
26b86a0b56
@ -1231,6 +1231,17 @@ rewriteInstructionForSpills(const LiveInterval &li, const VNInfo *VNI,
|
|||||||
if (!TrySplit)
|
if (!TrySplit)
|
||||||
SSWeight += Weight;
|
SSWeight += Weight;
|
||||||
|
|
||||||
|
// Create a new virtual register for the spill interval.
|
||||||
|
// Create the new register now so we can map the fold instruction
|
||||||
|
// to the new register so when it is unfolded we get the correct
|
||||||
|
// answer.
|
||||||
|
bool CreatedNewVReg = false;
|
||||||
|
if (NewVReg == 0) {
|
||||||
|
NewVReg = mri_->createVirtualRegister(rc);
|
||||||
|
vrm.grow();
|
||||||
|
CreatedNewVReg = true;
|
||||||
|
}
|
||||||
|
|
||||||
if (!TryFold)
|
if (!TryFold)
|
||||||
CanFold = false;
|
CanFold = false;
|
||||||
else {
|
else {
|
||||||
@ -1238,9 +1249,16 @@ rewriteInstructionForSpills(const LiveInterval &li, const VNInfo *VNI,
|
|||||||
// optimal point to insert a load / store later.
|
// optimal point to insert a load / store later.
|
||||||
if (!TrySplit) {
|
if (!TrySplit) {
|
||||||
if (tryFoldMemoryOperand(MI, vrm, ReMatDefMI, index,
|
if (tryFoldMemoryOperand(MI, vrm, ReMatDefMI, index,
|
||||||
Ops, FoldSS, FoldSlot, Reg)) {
|
Ops, FoldSS, FoldSlot, NewVReg)) {
|
||||||
// Folding the load/store can completely change the instruction in
|
// Folding the load/store can completely change the instruction in
|
||||||
// unpredictable ways, rescan it from the beginning.
|
// unpredictable ways, rescan it from the beginning.
|
||||||
|
|
||||||
|
if (FoldSS) {
|
||||||
|
// We need to give the new vreg the same stack slot as the
|
||||||
|
// spilled interval.
|
||||||
|
vrm.assignVirt2StackSlot(NewVReg, FoldSlot);
|
||||||
|
}
|
||||||
|
|
||||||
HasUse = false;
|
HasUse = false;
|
||||||
HasDef = false;
|
HasDef = false;
|
||||||
CanFold = false;
|
CanFold = false;
|
||||||
@ -1256,13 +1274,6 @@ rewriteInstructionForSpills(const LiveInterval &li, const VNInfo *VNI,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create a new virtual register for the spill interval.
|
|
||||||
bool CreatedNewVReg = false;
|
|
||||||
if (NewVReg == 0) {
|
|
||||||
NewVReg = mri_->createVirtualRegister(rc);
|
|
||||||
vrm.grow();
|
|
||||||
CreatedNewVReg = true;
|
|
||||||
}
|
|
||||||
mop.setReg(NewVReg);
|
mop.setReg(NewVReg);
|
||||||
if (mop.isImplicit())
|
if (mop.isImplicit())
|
||||||
rewriteImplicitOps(li, MI, NewVReg, vrm);
|
rewriteImplicitOps(li, MI, NewVReg, vrm);
|
||||||
|
Loading…
Reference in New Issue
Block a user