https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83992
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Keywords| |wrong-debug
Status|UNCONFIRMED |NEW
Last reconfirmed| |2018-01-24
Ever confirmed|0 |1
--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Ian Lance Taylor from comment #4)
> Sure, we can fix the test case. But in general Go is intended to provide
> accurate tracebacks, and this is a case where it is failing to do so. This
> is independent of the fact that the loop is heavily optimized; that doesn't
> matter here. The point is that anywhere in the loop should be in the same
> basic block. I don't think that accurate tracebacks are an unreasonable
> goal so I'd like to push back a bit.
>
> The problem with the statement with no location is that due to future
> optimizations it winds up at the start of the basic block. The eventual
> effect is that the first statement of the basic block appears to be in the
> preceding block. That makes no sense, as the block is a loop. By the time
> we get to 232t.optimized, the block looks like this:
>
> <bb 4> [local count: 1063004407]:
> # ivtmp_7 = PHI <2147483647(3), ivtmp_1(4)>
> # DEBUG j => (int) (2147483647 - ivtmp_7)
> # DEBUG D#1 => (int) (2147483648 - ivtmp_7)
> [foo.go:6:31] # DEBUG j => D#1
> # DEBUG j => D#1
> ivtmp_1 = ivtmp_7 + 18446744073709551615;
> [foo.go:6:17] if (ivtmp_1 != 0)
> goto <bb 4>; [98.99%]
> else
> goto <bb 3>; [1.01%]
>
> Perhaps it is correct that the `ivtmp_1 =` line shouldn't have a location,
> but it does after all get a location in the end. That location shouldn't be
> in an entirely differently basic block.
stmts with no location just get the location of whatever was there before.
This might not work very well for stmts at the beginning of a basic block.
Do we leave the "whatever was there before" to the assembler? If so we
should probably have some heuristic, like setting the location of the
first stmt of a basic block to either its own or the first stmt with a
location?
Note that not assigning a location to "artificial" stmts is exactly to avoid
jumping around when those stmts move -- they are not supposed to influence
the experienced "debug flow". But as said, this might not work as designed
for the start of a basic block. What happens when there is no stmt with
a location in side a basic block? Is there a way to tell the
debugger/assembler
"this stmt has no line information"?