<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On May 12, 2016, at 11:00 AM, Francois Pichet <<a href="mailto:pichet2000@gmail.com" class="">pichet2000@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Here is a specific case that make the debugging experiences degraded on my target:<div class=""><div class="">This is a loop simplified CFG:</div></div><div class=""><br class=""></div><div class=""><div class="">BB#0:</div><div class=""><span style="white-space:pre" class="">   </span>%R5<def> = OR_rr %R0, %R49    // this is %R5 only def.</div><div class=""><span style="white-space:pre" class="">   </span>DBG_VALUE %R5, %noreg, !"argc", <!18>; line no:4</div><div class="">   Successors according to CFG: BB#1<br class=""></div><div class=""><br class=""></div><div class="">BB#1:</div><div class="">    Live Ins: %R5</div><div class="">    Predecessors according to CFG: BB#0 BB#3</div><div class="">    ...</div><div class="">    Successors according to CFG: BB#2 BB#4</div><div class=""><br class=""></div><div class="">BB#2:</div><div class="">    Live Ins: %R5</div><div class="">    Predecessors according to CFG: BB#1</div><div class=""><span style="white-space:pre" class="">    </span>...</div><div class="">    Successors according to CFG: BB#3</div><div class=""><br class=""></div><div class="">BB#3:</div><div class="">    Live Ins: %R5</div><div class="">    Predecessors according to CFG: BB#2</div><div class=""><span style="white-space:pre" class="">    </span>...</div><div class="">    Successors according to CFG: BB#1</div><div class=""><br class=""></div><div class="">BB#4:</div><div class="">    Predecessors according to CFG: BB#1</div><div class=""><br class=""></div></div><div class=""><br class=""></div><div class="">Its obvious to me that the DEBUG_VALUE %R5, %noreg, !"argc" should be propagated to BB#1, BB#2 and BB#3. <br class=""></div><div class=""> </div><div class="">LiveDebugValue will currently not handle this case. The propagation will not be done for BB#1 because one of its predecessor BB3# doesn't have a DEBUG_VALUE %R5. But R5 is still guaranteed to correspond to argc. <br class=""></div><div class=""><br class=""></div><div class="">I am investigating how to extend LiveDebugValue for a case like this.</div></div></div></blockquote><div><br class=""></div><div>That sounds like a bug in LiveDebugValues, or there must be something missing from your example. LiveDebugValues should propagate the DBG_VALUE in this case. Are you sure that R5 isn’t clobbered or regmask’ed by any instruction, and that there is no conflicting DBG_VALUE?</div><div><br class=""></div><div>-- adrian</div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class=""><br class=""></div></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Wed, May 11, 2016 at 5:53 PM, Adrian Prantl <span dir="ltr" class=""><<a href="mailto:aprantl@apple.com" target="_blank" class="">aprantl@apple.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class="">The most obvious place where it is lacking at the moment is that it only supports DBG_VALUEs in registers. Adding support for constant values, memory locations, and fp constants would be a big win!<div class=""><br class=""></div><div class="">thanks,</div><div class="">Adrian</div><div class=""><div class="h5"><div class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">On May 11, 2016, at 2:52 PM, Francois Pichet <<a href="mailto:pichet2000@gmail.com" target="_blank" class="">pichet2000@gmail.com</a>> wrote:</div><br class=""><div class=""><div dir="ltr" class="">In retrospect I totally agree with you. I am looking at LiveDebugValue again to see if I can improve certain specific cases.</div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Wed, May 11, 2016 at 5:14 PM, Adrian Prantl <span dir="ltr" class=""><<a href="mailto:aprantl@apple.com" target="_blank" class="">aprantl@apple.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class=""><br class=""><div class=""><span class=""><blockquote type="cite" class=""><div class="">On May 11, 2016, at 2:09 PM, Francois Pichet <<a href="mailto:pichet2000@gmail.com" target="_blank" class="">pichet2000@gmail.com</a>> wrote:</div><br class=""><div class=""><div dir="ltr" class=""><div class="">Good point.</div><div class=""><br class=""></div>Currently yes a DEBUG_VALUE "x", vreg0 will be added in BB2. Now I realize this might be wrong in some (corner?) cases where vreg0 no longer refer to "x"<div class=""><br class=""></div><div class="">My fix would be to propagate the DEBUG_VALUE only if "x" is associated with only a single virtual register.</div><div class="">BTW, my goal is to generally improve DEBUG_VALUE for optimized code, not make it 100% correct.</div></div></div></blockquote><div class=""><br class=""></div></span>I hold the (perhaps somewhat extreme) position that having debug info the *may* be correct is worse than having no debug info at all, because it means that — in the end — you then cannot trust *anything* reported by the debugger. (There are some debatable corner cases, for example, in contrast to the debugger, the user may know over which path the control flow arrived at the current break point, but these are far in between.)</div><div class=""><br class=""></div><div class="">That said, I’m very open to improvements to the quality and correctness, so please don’t feel discouraged :-)</div><span class=""><font color="#888888" class=""><div class=""><br class=""></div></font></span><div class=""><span class=""><font color="#888888" class="">-- adrian</font></span><span class=""><br class=""><br class=""><blockquote type="cite" class=""><div class=""><div class="gmail_extra"><br class=""><div class="gmail_quote">On Wed, May 11, 2016 at 4:43 PM, Adrian Prantl <span dir="ltr" class=""><<a href="mailto:aprantl@apple.com" target="_blank" class="">aprantl@apple.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><br class="">
> On May 11, 2016, at 1:12 PM, Francois Pichet <<a href="mailto:pichet2000@gmail.com" target="_blank" class="">pichet2000@gmail.com</a>> wrote:<br class="">
><br class="">
</span><span class="">> Hello,<br class="">
><br class="">
> Regarding the problem of debug range for optimized code.<br class="">
> Currently a DEBUG_VALUE will be inserted after the <def>vregX<br class="">
> DEBUG_VALUE are only valid until the end of the current MachineBasicBlock. That's the main problem.<br class="">
> Why not simply iterate over all uses of vregX and insert an DEBUG_VALUE in all the MachineBasicBlocks where vregX is used. (pre regalloc)<br class="">
><br class="">
> I prototyped a small pass to do that and at first it seems to improve .debug_loc range validity and enhance the debugging experience for optimized code.<br class="">
<br class="">
</span>The problem that I see with this approach is that DEBUG_VALUEs are only valid until the next DEBUG_VALUE that describes the same variable. How does your pass handle:<br class="">
<br class="">
  BB0:<br class="">
    DEBUG_VALUE “x”, vreg0<br class="">
<br class="">
  | |<br class="">
  | BB1:<br class="">
  |  DEBUG_VALUE “x”, vreg1<br class="">
  | |<br class="">
  \_____BB2:<br class="">
    |    |<br class="">
    |____/<br class="">
  BB2:<br class="">
    vreg0 // still not clobbered here.<br class="">
<br class="">
Does it insert a DEBUG_VALUE “x”, vreg0 into BB2?<br class="">
<span class=""><font color="#888888" class=""><br class="">
-- adrian<br class="">
<br class="">
</font></span></blockquote></div><br class=""></div>
</div></blockquote></span></div><br class=""></div></blockquote></div><br class=""></div>
</div></blockquote></div><br class=""></div></div></div></div></blockquote></div><br class=""></div>
</div></blockquote></div><br class=""></body></html>