diff options
Diffstat (limited to 'llvm/lib/CodeGen/MachineCopyPropagation.cpp')
-rw-r--r-- | llvm/lib/CodeGen/MachineCopyPropagation.cpp | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/MachineCopyPropagation.cpp b/llvm/lib/CodeGen/MachineCopyPropagation.cpp index 1105b8c..5102639 100644 --- a/llvm/lib/CodeGen/MachineCopyPropagation.cpp +++ b/llvm/lib/CodeGen/MachineCopyPropagation.cpp @@ -971,6 +971,19 @@ void MachineCopyPropagation::ForwardCopyPropagateBlock(MachineBasicBlock &MBB) { forwardUses(MI); + // It's possible that the previous transformation has resulted in a no-op + // register move (i.e. one where source and destination registers are the + // same and are not referring to a reserved register). If so, delete it. + CopyOperands = isCopyInstr(MI, *TII, UseCopyInstr); + if (CopyOperands && + CopyOperands->Source->getReg() == CopyOperands->Destination->getReg() && + !MRI->isReserved(CopyOperands->Source->getReg())) { + MI.eraseFromParent(); + NumDeletes++; + Changed = true; + continue; + } + // Not a copy. SmallVector<Register, 4> Defs; const MachineOperand *RegMask = nullptr; |