[PATCH] D105279: [RemoveRedundantDebugValues] Introduce a MIR pass that removes redundant DBG_VALUEs

Djordje Todorovic via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 1 06:46:26 PDT 2021


djtodoro created this revision.
djtodoro added reviewers: jmorse, Orlando, aprantl.
djtodoro added a project: debug-info.
Herald added subscribers: nikic, kerbowa, pengfei, ormris, hiraditya, mgorny, nhaehnle, jvesely, nemanjai, jholewinski.
djtodoro requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

This new MIR pass removes redundant `DBG_VALUEs`.

After the register allocator is done, more precisely, after the Virtual Register Rewriter, we end up having duplicated `DBG_VALUEs`, since some virtual registers are being rewritten into the same physical register as some of existing `DBG_VALUEs`. Each `DBG_VALUE` should indicate (at least before the LiveDebugValues) variables assignment, but it is being clobbered for function parameters during the `SelectionDAG` since it generates new `DBG_VALUEs` after `COPY` instructions, even though the parameter has no assignment. For example, if we had a DBG_VALUE $regX as an entry debug value representing the parameter, and a `COPY` and after the `COPY`, `DBG_VALUE $virt_reg`, and after the //virtregrewrite// the `$virt_reg gets` rewritten into `$regX`, we'd end up having redundant `DBG_VALUE`.

This breaks the definition of the `DBG_VALUE` since some analysis passes might be built on top of that premise..., and this patch tries to fix the MIR with the respect to that.

This first patch performs bacward scan, by trying to detect a sequence of consecutive DBG_VALUEs, and to remove all DBG_VALUEs describing one variable but the last one:

For example:

  (1) DBG_VALUE $edi, !"var1", ...
  (2) DBG_VALUE $esi, !"var2", ...
  (3) DBG_VALUE $edi, !"var1", ...
   ...

in this case, we can remove (1).

By combining the forward scan that will be introduced in the next patch (from this stack), by inspecting the statistics, the `RemoveRedundantDebugValues` removes **15032** instructions by using gdb-7.11 as a testbed.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D105279

Files:
  llvm/docs/SourceLevelDebugging.rst
  llvm/include/llvm/CodeGen/CodeGenPassBuilder.h
  llvm/include/llvm/CodeGen/MachinePassRegistry.def
  llvm/include/llvm/CodeGen/Passes.h
  llvm/include/llvm/InitializePasses.h
  llvm/lib/CodeGen/CMakeLists.txt
  llvm/lib/CodeGen/CodeGen.cpp
  llvm/lib/CodeGen/LiveDebugVariables.cpp
  llvm/lib/CodeGen/RemoveRedundantDebugValues.cpp
  llvm/lib/CodeGen/TargetPassConfig.cpp
  llvm/test/CodeGen/AArch64/O0-pipeline.ll
  llvm/test/CodeGen/AArch64/O3-pipeline.ll
  llvm/test/CodeGen/AMDGPU/llc-pipeline.ll
  llvm/test/CodeGen/AMDGPU/ptr-arg-dbg-value.ll
  llvm/test/CodeGen/ARM/O3-pipeline.ll
  llvm/test/CodeGen/PowerPC/O3-pipeline.ll
  llvm/test/CodeGen/PowerPC/non-debug-mi-search-frspxsrsp.ll
  llvm/test/CodeGen/X86/O0-pipeline.ll
  llvm/test/CodeGen/X86/opt-pipeline.ll
  llvm/test/DebugInfo/MIR/Hexagon/live-debug-values-bundled-entry-values.mir
  llvm/test/DebugInfo/MIR/X86/multiple-param-dbg-value-entry.mir
  llvm/test/DebugInfo/MIR/X86/remove-redundant-dbg-vals.mir
  llvm/test/DebugInfo/NVPTX/debug-loc-offset.ll
  llvm/test/DebugInfo/X86/livedebugvars-avoid-duplicates.ll
  llvm/utils/gn/secondary/llvm/lib/CodeGen/BUILD.gn

-------------- next part --------------
A non-text attachment was scrubbed...
Name: D105279.355858.patch
Type: text/x-patch
Size: 31171 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210701/b517cf4e/attachment.bin>


More information about the llvm-commits mailing list