mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 04:30:12 +00:00
Preserve 2-addr constraints in ConnectedVNInfoEqClasses.
When a live range splits into multiple connected components, we would arbitrarily assign <undef> uses to component 0. This is wrong when the use is tied to a def that gets assigned to a different component: %vreg69<def> = ADD8ri %vreg68<undef>, 1 The use and def must get the same virtual register. Fix this by assigning <undef> uses to the same component as the value defined by the instruction, if any: %vreg69<def> = ADD8ri %vreg69<undef>, 1 This fixes PR13402. The PR has a test case which I am not including because it is unlikely to keep exposing this behavior in the future. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160739 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
242204784b
commit
84315f03cb
@ -827,14 +827,11 @@ void ConnectedVNInfoEqClasses::Distribute(LiveInterval *LIV[],
|
||||
MachineOperand &MO = RI.getOperand();
|
||||
MachineInstr *MI = MO.getParent();
|
||||
++RI;
|
||||
if (MO.isUse() && MO.isUndef())
|
||||
continue;
|
||||
// DBG_VALUE instructions should have been eliminated earlier.
|
||||
SlotIndex Idx = LIS.getInstructionIndex(MI);
|
||||
Idx = Idx.getRegSlot(MO.isUse());
|
||||
const VNInfo *VNI = LI.getVNInfoAt(Idx);
|
||||
// FIXME: We should be able to assert(VNI) here, but the coalescer leaves
|
||||
// dangling defs around.
|
||||
LiveRangeQuery LRQ(LI, LIS.getInstructionIndex(MI));
|
||||
const VNInfo *VNI = MO.readsReg() ? LRQ.valueIn() : LRQ.valueDefined();
|
||||
// In the case of an <undef> use that isn't tied to any def, VNI will be
|
||||
// NULL. If the use is tied to a def, VNI will be the defined value.
|
||||
if (!VNI)
|
||||
continue;
|
||||
MO.setReg(LIV[getEqClass(VNI)]->reg);
|
||||
|
Loading…
Reference in New Issue
Block a user