mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-09-24 23:28:41 +00:00
Replace copyRegToReg with COPY everywhere in lib/CodeGen except for FastISel.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@108062 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -1437,10 +1437,9 @@ bool TwoAddressInstructionPass::EliminateRegSequences() {
|
||||
if (DefMI->isCopy() && DefMI->getOperand(1).getSubReg())
|
||||
RealSrcs.push_back(DefMI->getOperand(1).getReg());
|
||||
|
||||
if (!Seen.insert(SrcReg) ||
|
||||
MI->getParent() != DefMI->getParent() ||
|
||||
!MI->getOperand(i).isKill() ||
|
||||
HasOtherRegSequenceUses(SrcReg, MI, MRI)) {
|
||||
bool isKill = MI->getOperand(i).isKill();
|
||||
if (!Seen.insert(SrcReg) || MI->getParent() != DefMI->getParent() ||
|
||||
!isKill || HasOtherRegSequenceUses(SrcReg, MI, MRI)) {
|
||||
// REG_SEQUENCE cannot have duplicated operands, add a copy.
|
||||
// Also add an copy if the source is live-in the block. We don't want
|
||||
// to end up with a partial-redef of a livein, e.g.
|
||||
@@ -1456,28 +1455,21 @@ bool TwoAddressInstructionPass::EliminateRegSequences() {
|
||||
// If the REG_SEQUENCE doesn't kill its source, keeping live variables
|
||||
// correctly up to date becomes very difficult. Insert a copy.
|
||||
//
|
||||
const TargetRegisterClass *RC = MRI->getRegClass(SrcReg);
|
||||
unsigned NewReg = MRI->createVirtualRegister(RC);
|
||||
MachineBasicBlock::iterator InsertLoc = MI;
|
||||
bool Emitted =
|
||||
TII->copyRegToReg(*MI->getParent(), InsertLoc, NewReg, SrcReg, RC, RC,
|
||||
MI->getDebugLoc());
|
||||
(void)Emitted;
|
||||
assert(Emitted && "Unable to issue a copy instruction!\n");
|
||||
MI->getOperand(i).setReg(NewReg);
|
||||
if (MI->getOperand(i).isKill()) {
|
||||
MachineBasicBlock::iterator CopyMI = prior(InsertLoc);
|
||||
MachineOperand *KillMO = CopyMI->findRegisterUseOperand(SrcReg);
|
||||
KillMO->setIsKill();
|
||||
if (LV)
|
||||
// Update live variables
|
||||
LV->replaceKillInstruction(SrcReg, MI, &*CopyMI);
|
||||
}
|
||||
MachineInstr *CopyMI = BuildMI(*MI->getParent(), InsertLoc,
|
||||
MI->getDebugLoc(), TII->get(TargetOpcode::COPY))
|
||||
.addReg(DstReg, RegState::Define, MI->getOperand(i+1).getImm())
|
||||
.addReg(SrcReg, getKillRegState(isKill));
|
||||
MI->getOperand(i).setReg(0);
|
||||
if (LV && isKill)
|
||||
LV->replaceKillInstruction(SrcReg, MI, CopyMI);
|
||||
DEBUG(dbgs() << "Inserted: " << *CopyMI);
|
||||
}
|
||||
}
|
||||
|
||||
for (unsigned i = 1, e = MI->getNumOperands(); i < e; i += 2) {
|
||||
unsigned SrcReg = MI->getOperand(i).getReg();
|
||||
if (!SrcReg) continue;
|
||||
unsigned SubIdx = MI->getOperand(i+1).getImm();
|
||||
UpdateRegSequenceSrcs(SrcReg, DstReg, SubIdx, MRI, *TRI);
|
||||
}
|
||||
|
Reference in New Issue
Block a user