[llvm-dev] Dangling debug value or bug in argument elimination pass?

David Blaikie via llvm-dev llvm-dev at lists.llvm.org
Fri Apr 15 12:38:23 PDT 2016


Unclear. It's going to be awkward for debug info regardless (describing the
variable is important to name lookup, describing the parameter's more
important just so the user can at least see it's optimized out - but could
break the ability to invoke the function (because the debugger may use all
the function parameters to figure out the ABI, even if the parameter
doesn't have a location description))

Certainly we shouldn't create stuff that the verifier thinks is bad (do you
have a specific example of where that comes up?) but I don't know whether
the fix is in the creation, the verifier, or both.

On Fri, Apr 15, 2016 at 11:56 AM, Sergei Larin via llvm-dev <
llvm-dev at lists.llvm.org> wrote:

>
>
> I will start from afar… When a dead function argument is removed, should
> we keep around the debug info for it?
>
>
>
> I have the following case:
>
>
>
> define internal fastcc void @foo(i8* %aa, i8* %reg, i8* %field, i32 %bb,
> ...) unnamed_addr #3 !dbg !28 {
>
> entry:
>
>   call void @llvm.dbg.value(metabb i8* %aa, i64 0, metabb !34, metabb
> !47), !dbg !57
>
>   call void @llvm.dbg.value(metabb i8* %reg, i64 0, metabb !35, metabb
> !47), !dbg !58
>
>   call void @llvm.dbg.value(metabb i8* %field, i64 0, metabb !36, metabb
> !47), !dbg !59
>
>   call void @llvm.dbg.value(metabb i32 %bb, i64 0, metabb !37, metabb
> !47), !dbg !60
>
>
>
> During dead argument elimination pass, some of the arguments are found
> “dead” (which they are) and removed, without removing  their correspondent
> llvm.dbg.value:
>
>
>
> ...
>
> DAE - Removing argument 1 (reg) from foo
>
> DAE - Removing argument 2 (field) from foo
>
> ...
>
>>
>
>
> define internal fastcc void @foo(i8* %aa, i32 %bb, ...) unnamed_addr #3
> !dbg !28 {
>
> entry:
>
>   call void @llvm.dbg.value(metabb !2, i64 0, metabb !34, metabb !47),
> !dbg !57
>
>   call void @llvm.dbg.value(metabb i8* null, i64 0, metabb !35, metabb
> !47), !dbg !58
>
>   call void @llvm.dbg.value(metabb i8* null, i64 0, metabb !36, metabb
> !47), !dbg !59
>
>   call void @llvm.dbg.value(metabb !2, i64 0, metabb !37, metabb !47),
> !dbg !60
>
>
>
> From that point on we carry dead debug info and correspondent metadata
> (DILocalVariable):
>
>
>
> !33 = !{!34, !35, !36, !37, ...}
>
> !34 = !DILocalVariable(name: "aa", arg: 1, scope: !28, file: !11, line:
> 90, type: !14)
>
> !35 = !DILocalVariable(name: "reg", arg: 2, scope: !28, file: !11, line:
> 90, type: !31)
>
> !36 = !DILocalVariable(name: "field", arg: 3, scope: !28, file: !11, line:
> 90, type: !31)
>
> !37 = !DILocalVariable(name: "bb", arg: 4, scope: !28, file: !11, line:
> 90, type: !6)
>
>
>
> In some instances it is wasteful but harmless, in others verifier is
> extremely unhappy about it.
>
>
>
> The question is:
>
> 1)      Should llvm.dbg.value for dead argument has been deleted?
>
> 2)      Should DILocalVariable has been deleted?
>
>
>
> Thanks…
>
>
>
>
>
> Sergei
>
>
>
> ---
>
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted
> by The Linux Foundation
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160415/504f44c9/attachment-0001.html>


More information about the llvm-dev mailing list