<div dir="ltr"><a class="GWVZpf gW" id="IloFPc-0" href="mailto:aprantl@apple.com" tabindex="-1">+Adrian Prantl</a> who might have some ideas about the representation choices/current/future behavior here<br><br><div class="gmail_quote"><div dir="ltr">On Fri, Jul 29, 2016 at 12:27 PM Keith Walker via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="EN-GB" link="blue" vlink="purple">
<div class="m_7442281572412701042WordSection1">
<p class="MsoNormal">I have been investigating missing variables / incorrect variable values  when debugging code compiled at –O1 (and above) and believe that I have tracked the issue down to the interaction of the generation of IR @llvm.dbg.value entries and
 phi nodes.  I would welcome someone who is more familiar with the generation of debug information to help me determine if what I think is going wrong is correct and guidance on the best/correct way of fixing the issue.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">[I was using the ARM and AArch64 targets in my investigation, but I believe that this issue is target independent]<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">The following simple C code reproducer:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">int func(int a)<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">{<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">       int c = 1;<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">        if (a < 0 ) {<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">                c = 2;<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">        }<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">        return c;<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">}<u></u><u></u></span></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Generates the following IR when compiling at –O0<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">define i32 @func(i32 %a) #0 !dbg !8 {<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">entry:<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  %a.addr = alloca i32, align 4<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  %c = alloca i32, align 4<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  store i32 %a, i32* %a.addr, align 4<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  call void @llvm.dbg.declare(metadata i32* %a.addr, metadata !12, metadata !13), !dbg !14<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  call void @llvm.dbg.declare(metadata i32* %c, metadata !15, metadata !13), !dbg !16<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  store i32 1, i32* %c, align 4, !dbg !16<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  %0 = load i32, i32* %a.addr, align 4, !dbg !17<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  %cmp = icmp slt i32 %0, 0, !dbg !19<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  br i1 %cmp, label %if.then, label %if.end, !dbg !20<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">if.then:                                          ; preds = %entry<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  store i32 2, i32* %c, align 4, !dbg !21<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  br label %if.end, !dbg !23<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">if.end:                                           ; preds = %if.then, %entry<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  %1 = load i32, i32* %c, align 4, !dbg !24<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  ret i32 %1, !dbg !25<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">}<u></u><u></u></span></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">This generates sensible DWARF location information for the variable c.  So debugging the code compiled at –O0 is just fine .... looking at the value of c when on the return statement the correct value is returned.<br>
<br>
However if I pass this IR through the –mem2reg optimisation phase, the debug information for the variable C becomes incorrect for the return statement:<br>
<br>
<span style="font-family:"Courier New"">define i32 @func(i32 %a) #0 !dbg !8 {<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">entry:<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  call void @llvm.dbg.value(metadata i32 %a, i64 0, metadata !12, metadata !13), !dbg !14<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  call void @llvm.dbg.value(metadata i32 1, i64 0, metadata !15, metadata !13), !dbg !16<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  %cmp = icmp slt i32 %a, 0, !dbg !17<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  br i1 %cmp, label %if.then, label %if.end, !dbg !19<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">if.then:                                          ; preds = %entry<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  call void @llvm.dbg.value(metadata i32 2, i64 0, metadata !15, metadata !13), !dbg !16<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  br label %if.end, !dbg !20<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">if.end:                                           ; preds = %if.then, %entry<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  %c.0 = phi i32 [ 2, %if.then ], [ 1, %entry ]<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  ret i32 %c.0, !dbg !22<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">}<u></u><u></u></span></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">The value of the variable c when on the return statement is always incorrectly reported as being the value 2.   The generated DWARF location list for the variable c looks something like (the offset 00000038 is beyond the end of the function):<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">    00000013 00000004 00000024 (DW_OP_consts: 1; DW_OP_stack_value)<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">    00000020 00000024 00000038 (DW_OP_consts: 2; DW_OP_stack_value)<u></u><u></u></span></p>
<p class="MsoNormal" style="margin-bottom:12.0pt"><br>
I know what is wrong, I thought!    After the phi instruction there should be an @llvm.dbg.value call which describes the variable c as having the value returned by the phi, so I manually altered the IR to the following, thinking that the return statement would
 now be able to generate the correct location information for the variable c:<u></u><u></u></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">define i32 @func(i32 %a) #0 !dbg !8 {<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">entry:<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  call void @llvm.dbg.value(metadata i32 %a, i64 0, metadata !12, metadata !13), !dbg !14<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  call void @llvm.dbg.value(metadata i32 1, i64 0, metadata !15, metadata !13), !dbg !16<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  %cmp = icmp slt i32 %a, 0, !dbg !17<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  br i1 %cmp, label %if.then, label %if.end, !dbg !19<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">if.then:                                          ; preds = %entry<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  call void @llvm.dbg.value(metadata i32 2, i64 0, metadata !15, metadata !13), !dbg !16<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  br label %if.end, !dbg !20<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">if.end:                                           ; preds = %if.then, %entry<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  %c.0 = phi i32 [ 2, %if.then ], [ 1, %entry ]<u></u><u></u></span></p>
<p class="MsoNormal"><b><span style="font-family:"Courier New"">  call void @llvm.dbg.value(metadata i32 %c.0, i64 0, metadata !15, metadata !13), !dbg !16<u></u><u></u></span></b></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">  ret i32 %c.0, !dbg !22<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">}<u></u><u></u></span></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Unfortunately adding this additional line makes no difference to the generated debug information, and the value of the variable c is still incorrectly reported to be 2 when on the return statement.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">So my question is whether:<u></u><u></u></p>
<p class="m_7442281572412701042MsoListParagraph"><u></u><span>-<span style="font:7.0pt "Times New Roman"">         
</span></span><u></u>The above addition to the IR is the correct thing to do [but if so then there is possibly a further issue in SelectionDAGBuilder::visitIntrinsicCall()’s handling of this additional line (where it is currently being discarded)]<u></u><u></u></p>
<p class="m_7442281572412701042MsoListParagraph"><u></u><span>-<span style="font:7.0pt "Times New Roman"">         
</span></span><u></u>Some other @lldm.dbg.value entry should be produced to generate the correct debug information.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Keith<u></u><u></u></p>
</div>
</div>

_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br>
</blockquote></div></div>