https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80548
Aldy Hernandez <aldyh at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |aldyh at gcc dot gnu.org,
| |amacleod at redhat dot com,
| |law at gcc dot gnu.org
--- Comment #3 from Aldy Hernandez <aldyh at gcc dot gnu.org> ---
I think we should start thinking of any Wuninitialized warnings in terms of
missed threads, at least initially. Jeff has mentioned this in the past, an
I'm slowly being converted. I mean, not that there aren't problems in the
uninit code, but we should at least check that there are no missing threads.
The problematic read from x is in BB5:
<bb 5> [local count: 55807731]:
h (x_17, y_2);
y_16 = g ();
goto <bb 7>; [100.00%]
On paths starting on 2->3 x_17 is defined, whereas on paths starting on 2->6
x_17 is undefined:
<bb 6> [local count: 59055799]:
# x_17 = PHI <x_10(3), x_6(D)(2)>
Looking at the last threader (threadfull2) before the uninit pass we see boths
paths are registered for threading:
[3] Registering jump thread: (3, 6) incoming edge; (6, 7) normal (7, 8)
normal (8, 4) normal (4, 5) nocopy;
[4] Registering jump thread: (2, 6) incoming edge; (6, 7) normal (7, 8)
normal (8, 4) normal (4, 10) nocopy;
However, there were no threaded paths in the entire compilation:
$ grep thread a.c.338t.statistics
$
So sometime between registering the path for threading and the lowlevel BB
copier, we dropped the threads.
The culprit is duplicate_thread_path in the generic bits:
/* We do not handle subloops, i.e. all the blocks must belong to the
same loop. */
if (region[i]->loop_father != loop)
return false;
This is an area I'm unfamiliar with, but it seems we should be able to thread
this when loop optimizations are done.
And indeed, if we allow this when loop_done, no warning is emitted.