https://gcc.gnu.org/bugzilla/show_bug.cgi?id=90735
--- Comment #1 from Martin Sebor <msebor at gcc dot gnu.org> ---
The output of the -fdump-tree-all-lineno option shows the correct location
information in the a.c.007t.omplower dump:
;; Function f (f, funcdef_no=0, decl_uid=1909, cgraph_uid=1, symbol_order=0)
f (int i, int j)
[../a.c:4:1] {
int * iftmp.0;
int * D.1920;
int c;
int * p;
try
{
[../a.c:6:22] if (i < 0) goto <D.1915>; else goto <D.1916>;
<D.1915>:
[../a.c:6:22] iftmp.0 = [../a.c:6:20] &a;
goto <D.1917>;
<D.1916>:
[../a.c:6:22] iftmp.0 = [../a.c:6:24] &b;
<D.1917>:
[../a.c:6:8] p = iftmp.0;
[../a.c:7:7] _1 = [../a.c:7:7] *p;
[../a.c:7:6] if (_1 != 0) goto <D.1918>; else goto <D.1919>;
<D.1918>:
[../a.c:8:12] D.1920 = p;
[../a.c:8:12] // predicted unlikely by early return (on trees) predictor.
[../a.c:8:12] return D.1920;
<D.1919>:
[../a.c:9:6] if (j < 0) goto <D.1921>; else goto <D.1922>;
<D.1921>:
[../a.c:10:7] p = [../a.c:10:9] &c;
<D.1922>:
[../a.c:12:10] D.1920 = p;
[../a.c:12:10] return D.1920;
}
finally
{
c = {CLOBBER};
}
}
but the a.c.008t.lower dump below does not. The two return statements (one on
line 8 and the other on line 12) are merged into one at the end of the
function. I'm not sure what would be a good solution here. Keeping the
location of either one of the statement would still lead to inaccurate results
in some cases. But maybe that's better than no location at all.
;; Function f (f, funcdef_no=0, decl_uid=1909, cgraph_uid=1, symbol_order=0)
f (int i, int j)
{
int * p;
int c;
int * D.1920;
int * iftmp.0;
try
{
[../a.c:6:22] if (i < 0) goto <D.1915>; else goto <D.1916>;
<D.1915>:
[../a.c:6:22] iftmp.0 = [../a.c:6:20] &a;
goto <D.1917>;
<D.1916>:
[../a.c:6:22] iftmp.0 = [../a.c:6:24] &b;
<D.1917>:
[../a.c:6:8] p = iftmp.0;
[../a.c:7:7] _1 = [../a.c:7:7] *p;
[../a.c:7:6] if (_1 != 0) goto <D.1918>; else goto <D.1919>;
<D.1918>:
[../a.c:8:12] D.1920 = p;
[../a.c:8:12] // predicted unlikely by early return (on trees) predictor.
[../a.c:8:12] goto <D.1923>;
<D.1919>:
[../a.c:9:6] if (j < 0) goto <D.1921>; else goto <D.1922>;
<D.1921>:
[../a.c:10:7] p = [../a.c:10:9] &c;
<D.1922>:
[../a.c:12:10] D.1920 = p;
[../a.c:12:10] goto <D.1923>;
}
finally
{
c = {CLOBBER};
}
<D.1923>:
return D.1920;
}