Re-apply "[DebugInfo] Check size of variable in ConvertDebugDeclareToDebugValue"
authorBjorn Pettersson <bjorn.a.pettersson@ericsson.com>
Fri, 15 Jun 2018 13:48:55 +0000 (13:48 +0000)
committerBjorn Pettersson <bjorn.a.pettersson@ericsson.com>
Fri, 15 Jun 2018 13:48:55 +0000 (13:48 +0000)
commit428caf988be17a1d3d420318f9018a8f4b11a436
tree32397bf954b4f9f5f619510e550b9c9fd2a1c9ac
parent65d1cf8b165b739fb54326c40ec292cd9338a11c
Re-apply "[DebugInfo] Check size of variable in ConvertDebugDeclareToDebugValue"

This is r334704 (which was reverted in r334732) with a fix for
types like x86_fp80. We need to use getTypeAllocSizeInBits and
not getTypeStoreSizeInBits to avoid dropping debug info for
such types.

Original commit msg:
> Summary:
> Do not convert a DbgDeclare to DbgValue if the store
> instruction only refer to a fragment of the variable
> described by the DbgDeclare.
>
> Problem was seen when for example having an alloca for an
> array or struct, and there were stores to individual elements.
> In the past we inserted a DbgValue intrinsics for each store,
> just as if the store wrote the whole variable.
>
> When handling store instructions we insert a DbgValue that
> indicates that the variable is "undefined", as we do not know
> which part of the variable that is updated by the store.
>
> When ConvertDebugDeclareToDebugValue is used with a load/phi
> instruction we assert that the referenced value is large enough
> to cover the whole variable. Afaict this should be true for all
> scenarios where those methods are used on trunk. If the assert
> blows in the future I guess we could simply skip to insert a
> dbg.value instruction.
>
> In the future I think we should examine which part of the variable
> that is accessed, and add a DbgValue instrinsic with an appropriate
> DW_OP_LLVM_fragment expression.
>
> Reviewers: dblaikie, aprantl, rnk
>
> Reviewed By: aprantl
>
> Subscribers: JDevlieghere, llvm-commits
>
> Tags: #debug-info
>
> Differential Revision: https://reviews.llvm.org/D48024

llvm-svn: 334830
llvm/include/llvm/IR/IntrinsicInst.h
llvm/lib/IR/IntrinsicInst.cpp
llvm/lib/Transforms/Utils/Local.cpp
llvm/test/DebugInfo/X86/mem2reg_fp80.ll [new file with mode: 0644]
llvm/test/Transforms/InstCombine/debuginfo.ll
llvm/test/Transforms/Mem2Reg/debug-alloca-phi-2.ll [new file with mode: 0644]