mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
When RemoveCopyByCommutingDef is creating additional identity copies, just use
LiveInterval::MergeValueNumberInto instead of trying to extend LiveRanges and getting it wrong. This fixed PR8249 where a valno with a multi-segment live range was defined by an identity copy created by RemoveCopyByCommutingDef. Some of the live segments disappeared. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115385 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a9b85c1074
commit
e0a73ec0a9
@ -81,6 +81,11 @@ namespace llvm {
|
||||
unsigned getFlags() const { return flags; }
|
||||
void setFlags(unsigned flags) { this->flags = flags; }
|
||||
|
||||
/// Merge flags from another VNInfo
|
||||
void mergeFlags(const VNInfo *VNI) {
|
||||
flags = (flags | VNI->flags) & ~IS_UNUSED;
|
||||
}
|
||||
|
||||
/// For a register interval, if this VN was definied by a copy instr
|
||||
/// getCopy() returns a pointer to it, otherwise returns 0.
|
||||
/// For a stack interval the behaviour of this method is undefined.
|
||||
|
@ -582,6 +582,9 @@ VNInfo* LiveInterval::MergeValueNumberInto(VNInfo *V1, VNInfo *V2) {
|
||||
}
|
||||
}
|
||||
|
||||
// Merge the relevant flags.
|
||||
V2->mergeFlags(V1);
|
||||
|
||||
// Now that V1 is dead, remove it.
|
||||
markValNoForDeletion(V1);
|
||||
|
||||
|
@ -423,10 +423,6 @@ bool SimpleRegisterCoalescing::RemoveCopyByCommutingDef(const CoalescerPair &CP,
|
||||
unsigned OpIdx = NewMI->findRegisterUseOperandIdx(IntA.reg, false);
|
||||
NewMI->getOperand(OpIdx).setIsKill();
|
||||
|
||||
bool BHasPHIKill = BValNo->hasPHIKill();
|
||||
SmallVector<VNInfo*, 4> BDeadValNos;
|
||||
std::map<SlotIndex, SlotIndex> BExtend;
|
||||
|
||||
// If ALR and BLR overlaps and end of BLR extends beyond end of ALR, e.g.
|
||||
// A = or A, B
|
||||
// ...
|
||||
@ -435,9 +431,6 @@ bool SimpleRegisterCoalescing::RemoveCopyByCommutingDef(const CoalescerPair &CP,
|
||||
// C = A<kill>
|
||||
// ...
|
||||
// = B
|
||||
bool Extended = BLR->end > ALR->end && ALR->end != ALR->start;
|
||||
if (Extended)
|
||||
BExtend[ALR->end] = BLR->end;
|
||||
|
||||
// Update uses of IntA of the specific Val# with IntB.
|
||||
for (MachineRegisterInfo::use_iterator UI = mri_->use_begin(IntA.reg),
|
||||
@ -463,51 +456,24 @@ bool SimpleRegisterCoalescing::RemoveCopyByCommutingDef(const CoalescerPair &CP,
|
||||
UseMO.setReg(NewReg);
|
||||
if (UseMI == CopyMI)
|
||||
continue;
|
||||
if (UseMO.isKill()) {
|
||||
if (Extended)
|
||||
UseMO.setIsKill(false);
|
||||
}
|
||||
if (!UseMI->isCopy())
|
||||
continue;
|
||||
if (UseMI->getOperand(0).getReg() != IntB.reg ||
|
||||
UseMI->getOperand(0).getSubReg())
|
||||
continue;
|
||||
|
||||
// This copy will become a noop. If it's defining a new val#,
|
||||
// remove that val# as well. However this live range is being
|
||||
// extended to the end of the existing live range defined by the copy.
|
||||
// This copy will become a noop. If it's defining a new val#, merge it into
|
||||
// BValNo.
|
||||
SlotIndex DefIdx = UseIdx.getDefIndex();
|
||||
const LiveRange *DLR = IntB.getLiveRangeContaining(DefIdx);
|
||||
if (!DLR)
|
||||
VNInfo *DVNI = IntB.getVNInfoAt(DefIdx);
|
||||
if (!DVNI)
|
||||
continue;
|
||||
DEBUG(dbgs() << "\t\tnoop: " << DefIdx << '\t' << *UseMI);
|
||||
BHasPHIKill |= DLR->valno->hasPHIKill();
|
||||
assert(DLR->valno->def == DefIdx);
|
||||
BDeadValNos.push_back(DLR->valno);
|
||||
BExtend[DLR->start] = DLR->end;
|
||||
assert(DVNI->def == DefIdx);
|
||||
BValNo = IntB.MergeValueNumberInto(BValNo, DVNI);
|
||||
JoinedCopies.insert(UseMI);
|
||||
}
|
||||
|
||||
// We need to insert a new liverange: [ALR.start, LastUse). It may be we can
|
||||
// simply extend BLR if CopyMI doesn't end the range.
|
||||
|
||||
// Remove val#'s defined by copies that will be coalesced away.
|
||||
for (unsigned i = 0, e = BDeadValNos.size(); i != e; ++i) {
|
||||
VNInfo *DeadVNI = BDeadValNos[i];
|
||||
if (TargetRegisterInfo::isPhysicalRegister(IntB.reg)) {
|
||||
for (const unsigned *AS = tri_->getAliasSet(IntB.reg); *AS; ++AS) {
|
||||
if (!li_->hasInterval(*AS))
|
||||
continue;
|
||||
LiveInterval &ASLI = li_->getInterval(*AS);
|
||||
if (const LiveRange *ASLR = ASLI.getLiveRangeContaining(DeadVNI->def))
|
||||
ASLI.removeValNo(ASLR->valno);
|
||||
}
|
||||
}
|
||||
IntB.removeValNo(BDeadValNos[i]);
|
||||
}
|
||||
DEBUG(dbgs() << "\t\ttrimmed: " << IntB << '\n');
|
||||
|
||||
|
||||
// Extend BValNo by merging in IntA live ranges of AValNo. Val# definition
|
||||
// is updated.
|
||||
VNInfo *ValNo = BValNo;
|
||||
@ -516,14 +482,8 @@ bool SimpleRegisterCoalescing::RemoveCopyByCommutingDef(const CoalescerPair &CP,
|
||||
for (LiveInterval::iterator AI = IntA.begin(), AE = IntA.end();
|
||||
AI != AE; ++AI) {
|
||||
if (AI->valno != AValNo) continue;
|
||||
SlotIndex End = AI->end;
|
||||
std::map<SlotIndex, SlotIndex>::iterator
|
||||
EI = BExtend.find(End);
|
||||
if (EI != BExtend.end())
|
||||
End = EI->second;
|
||||
IntB.addRange(LiveRange(AI->start, End, ValNo));
|
||||
IntB.addRange(LiveRange(AI->start, AI->end, ValNo));
|
||||
}
|
||||
ValNo->setHasPHIKill(BHasPHIKill);
|
||||
DEBUG(dbgs() << "\t\textended: " << IntB << '\n');
|
||||
|
||||
IntA.removeValNo(AValNo);
|
||||
|
Loading…
Reference in New Issue
Block a user