diff --git a/llvm/lib/CodeGen/MachineCopyPropagation.cpp b/llvm/lib/CodeGen/MachineCopyPropagation.cpp --- a/llvm/lib/CodeGen/MachineCopyPropagation.cpp +++ b/llvm/lib/CodeGen/MachineCopyPropagation.cpp @@ -870,12 +870,32 @@ if (MO.isDef()) Tracker.invalidateRegister(MO.getReg().asMCReg(), *TRI); - if (MO.readsReg()) - Tracker.invalidateRegister(MO.getReg().asMCReg(), *TRI); + if (MO.readsReg()) { + if (MO.isDebug()) { + // Check if the register in the debug instruction is utilized + // in a copy instruction, so we can update the debug info if the + // register is changed. + for (MCRegUnitIterator RUI(MO.getReg().asMCReg(), TRI); RUI.isValid(); + ++RUI) { + if (auto *Copy = Tracker.findCopyDefViaUnit(*RUI, *TRI)) { + CopyDbgUsers[Copy].insert(MI); + } + } + } else { + Tracker.invalidateRegister(MO.getReg().asMCReg(), *TRI); + } + } } } for (auto *Copy : MaybeDeadCopies) { + + Register Src = Copy->getOperand(1).getReg(); + Register Def = Copy->getOperand(0).getReg(); + SmallVector MaybeDeadDbgUsers(CopyDbgUsers[Copy].begin(), + CopyDbgUsers[Copy].end()); + + MRI->updateDbgUsersToReg(Src.asMCReg(), Def.asMCReg(), MaybeDeadDbgUsers); Copy->eraseFromParent(); ++NumDeletes; } diff --git a/llvm/test/CodeGen/X86/machine-copy-dbgvalue.mir b/llvm/test/CodeGen/X86/machine-copy-dbgvalue.mir new file mode 100644 --- /dev/null +++ b/llvm/test/CodeGen/X86/machine-copy-dbgvalue.mir @@ -0,0 +1,20 @@ +# RUN: llc -mtriple=i686-- -run-pass machine-cp -verify-machineinstrs -o - %s | FileCheck %s + + +--- +# Test that machine copy propagation ignores DBG_VALUE and DBL_VALUE_LIST and updates it. +# CHECK-LABEL: name: foo +# CHECK: bb.0: +# CHECK-NEXT: $rax = MOV64ri 31 +# CHECK-NEXT: DBG_VALUE $rax +# CHECK-NEXT: DBG_VALUE_LIST 0, !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1, DW_OP_constu, 4, DW_OP_mul, DW_OP_plus, DW_OP_stack_value), $rax, 0, 0 +# CHECK-NEXT: RETQ implicit killed $rax +name: foo +body: | + bb.0: + renamable $rcx = MOV64ri 31 + DBG_VALUE $rcx, 0, 0, 0, 0 + DBG_VALUE_LIST 0, !DIExpression(DW_OP_LLVM_arg, 0, DW_OP_LLVM_arg, 1, DW_OP_constu, 4, DW_OP_mul, DW_OP_plus, DW_OP_stack_value), $rcx, 0, 0 + $rax = COPY killed renamable $rcx + RETQ implicit killed $rax +...