[IR] Add llvm.dbg.addr, a control-dependent version of llvm.dbg.declare
authorReid Kleckner <rnk@google.com>
Wed, 20 Sep 2017 21:52:33 +0000 (21:52 +0000)
committerReid Kleckner <rnk@google.com>
Wed, 20 Sep 2017 21:52:33 +0000 (21:52 +0000)
commit3f547e87b2cdd148c0429ddda48fdeeb111b527d
tree8eec0bb5535f40c9328bb90dc12844e56c31e8c2
parent047cbee1e77e545c0f1a32b7a1eae113f87deb71
[IR] Add llvm.dbg.addr, a control-dependent version of llvm.dbg.declare

Summary:
This implements the design discussed on llvm-dev for better tracking of
variables that live in memory through optimizations:
  http://lists.llvm.org/pipermail/llvm-dev/2017-September/117222.html

This is tracked as PR34136

llvm.dbg.addr is intended to be produced and used in almost precisely
the same way as llvm.dbg.declare is today, with the exception that it is
control-dependent. That means that dbg.addr should always have a
position in the instruction stream, and it will allow passes that
optimize memory operations on local variables to insert llvm.dbg.value
calls to reflect deleted stores. See SourceLevelDebugging.rst for more
details.

The main drawback to generating DBG_VALUE machine instrs is that they
usually cause LLVM to emit a location list for DW_AT_location. The next
step will be to teach DwarfDebug.cpp how to recognize more DBG_VALUE
ranges as not needing a location list, and possibly start setting
DW_AT_start_offset for variables whose lifetimes begin mid-scope.

Reviewers: aprantl, dblaikie, probinson

Subscribers: eraman, hiraditya, llvm-commits

Differential Revision: https://reviews.llvm.org/D37768

llvm-svn: 313825
16 files changed:
llvm/docs/SourceLevelDebugging.rst
llvm/include/llvm/IR/IntrinsicInst.h
llvm/include/llvm/IR/Intrinsics.td
llvm/include/llvm/Transforms/Utils/Local.h
llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
llvm/lib/IR/DIBuilder.cpp
llvm/lib/IR/Verifier.cpp
llvm/lib/Transforms/InstCombine/InstructionCombining.cpp
llvm/lib/Transforms/Scalar/SROA.cpp
llvm/lib/Transforms/Utils/Local.cpp
llvm/lib/Transforms/Utils/PromoteMemoryToRegister.cpp
llvm/test/DebugInfo/X86/dbg-addr-dse.ll [new file with mode: 0644]
llvm/test/DebugInfo/X86/dbg-addr.ll [new file with mode: 0644]
llvm/test/Transforms/Mem2Reg/dbg-addr-inline-dse.ll [new file with mode: 0644]
llvm/test/Transforms/Mem2Reg/dbg-addr.ll [new file with mode: 0644]
llvm/test/Transforms/SROA/dbg-addr-diamond.ll [new file with mode: 0644]