[llvm-dev] Stripping Debug Locations on cross BB moves, part 2 (PR31891)

Reid Kleckner via llvm-dev llvm-dev at lists.llvm.org
Wed Feb 8 10:02:15 PST 2017


This was my concrete example from the PR (
https://llvm.org/bugs/show_bug.cgi?id=31891):

void useit1(float);
void useit2(float);
double fabs(double);
float fabsf(float f) {
  return (float)fabs((double)f);
}
void hoistit(int cond, float f) {
  if (cond) {
    useit1(fabsf(f));
  } else {
    useit2(fabsf(f));
  }
}

Obviously, hoisting the common call to fabsf is profitable. What line
information should we assign to it, both for profiling and for line table
purposes?

Stripping the location info or saying "line 0" is equivalent to saying
"hoistit line 0", because we'll add a line table entry for the prologue, as
David says. The alternative is to arbitrarily choose one of the others,
leading to a potentially confusing backtrace or profile. For the debugging
use case, this just seems like a cost of doing business with an optimized
binary, but for PGO, it creates a bad profile.

I think the proposed solution of stripping the line info but leaving scope
info on the call is probably the right thing to do for now. It handles all
use cases that we have today. Eventually I like Adrian's idea of a bit on
the DILocation or Instruction that says "sloc info consumer beware: this
instruction was hoisted or speculated". That preserves the most
information. The one use case I can think of for that bit it is sanitizer
instrumentation, where any source location is better than no source
location (want file, function, and approximate line), and grovelling around
in the nearby instruction stream isn't easy.

On Wed, Feb 8, 2017 at 9:25 AM, David Blaikie <dblaikie at gmail.com> wrote:

> So Reid came across a case where the current strategy (dropping locations
> when they move across basic blocks) proves to be at odds with another
> precept we have: inlinable calls must have locations, so that if/when they
> are inlined the location can be accurately described (due to the nature of
> our IR representation of inlining, a location must be given for the call
> site so that the DIEs for the inlined subroutine can be described)
>
> Any ideas on how we should approach this?
>
> We could have a bit in DebugLoc (or other choice of representation) for
> the non-line location. For the line table this would work the same as
> absent DebugLoc - for calls it would cause call_file/line/discriminator (do
> we have a call_discriminator? We probably should, don't know if we do) to
> be omitted which is something the LLVM IR representation currently can't
> express.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20170208/b6d419e2/attachment.html>


More information about the llvm-dev mailing list