<div dir="ltr">Oops, forgot to reply-all (& adding a few other people to the 'to' line)<br><div class="gmail_quote">---------- Forwarded message ----------<br>From: <b class="gmail_sendername">David Blaikie</b> <span dir="ltr"><<a href="mailto:dblaikie@gmail.com">dblaikie@gmail.com</a>></span><br>Date: Mon, Sep 21, 2015 at 11:22 AM<br>Subject: Re: [llvm-dev] extending liveness of 'this' pointer via FAKE_USE opcode<br>To: "Pieb, Wolfgang" <<a href="mailto:Wolfgang_Pieb@playstation.sony.com">Wolfgang_Pieb@playstation.sony.com</a>><br><br><br><div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote"><span class="">On Mon, Sep 21, 2015 at 11:16 AM, Pieb, Wolfgang via llvm-dev <span dir="ltr"><<a href="mailto:llvm-dev@lists.llvm.org" target="_blank">llvm-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">





<div lang="EN-US" link="blue" vlink="purple">
<div>
<p class="MsoNormal">Hello!<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">At Sony we've seen some serious customer interest in having the 'this' pointer visible throughout an entire function during<u> </u>debugging. However, optimizations may eliminate it after its last use, so we've been looking for a way to artificially extend its liverange to the end of the function.</p></div></div></blockquote><div><br></div></span><div>How much have you observed the actual (usually a register, yes?) register being reused, versus the debug info just not successfully describing its location? LLVM's optimized debug info still does a pretty bad job tracking optimized values (especially anything that gets promoted out of an alloca into a register)</div><span class=""><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><u></u></p>
<p class="MsoNormal"><u></u> So far, the most compelling way we can think of, and one we have used successfully in the past in at least one other compiler,</p><p class="MsoNormal"><u></u></p>
<p class="MsoNormal">is to create a 'fake use' of the 'this' pointer at the end of the function, compelling the rest of the compiler to not optimize it away.</p></div></div></blockquote><div><br></div></span><div>Is there some more general heuristic we should consider rather than special casing the 'this' pointer? (something that might help other cases of parameters being optimized away entirely that would still be valuable to the user? Should we try to preserve all parameter values? All variables?)</div><span class=""><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><u></u><u></u></p>
<p class="MsoNormal"><u></u> At the moment there doesn't seem to be a good way to create such a fake use in LLVM (please enlighten us if you know of one), so we are</p><p class="MsoNormal"><u></u></p>
<p class="MsoNormal">proposing to introduce a new intrinsic (e.g. llvm.fake_use), which would take a single value argument, representing a use of that value.
<u></u><u></u></p>
<p class="MsoNormal">The intrinsic would be lowered to a new invariant TargetOpcode (e.g. FAKE_USE), which serves the same purpose at the MI level.
<u></u><u></u></p>
<p class="MsoNormal">Code emission would simply ignore the new opcode. </p></div></div></blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Frontends could use the intrinsic to extend liveranges of variables as desired. As a first use case, clang would accept a new option<u></u><u></u></p>
<p class="MsoNormal">(e.g. -fkeep-this-ptr) which would cause a fake use of 'this' to be inserted at the end of a function, making it available for inspection<u></u><u></u></p>
<p class="MsoNormal">throughout the entire function body.</p></div></div></blockquote><div><br></div></span><div>Do you have much in the way of performance numbers to get a sense of the impact of this feature? (& possibly the impact with the sliding scale of "this pointer or all parameters or all variables" sort of thing)</div><span class=""><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><u></u><u></u></p>
<p class="MsoNormal"><u></u> One important note is that since such an option would affect code generation, it cannot be automatically enabled by -g. However, should there be</p><p class="MsoNormal"><u></u></p>
<p class="MsoNormal">eventually support for a -Og mode (optimize for debugging), that mode could enable it.</p></div></div></blockquote><div><br></div></span><div>Is it worth considering adding -Og now/for this feature?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=""><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal"><u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Any comments or alternative ideas are appreciated.<u></u><u></u></p>
</div>
</div>

<br></span>_______________________________________________<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>
<br></blockquote></div><br></div></div>
</div><br></div>