https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61409
Manuel López-Ibáñez <manu at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |NEW
Last reconfirmed| |2014-06-04
CC| |davidxl at gcc dot gnu.org
Ever confirmed|0 |1
Severity|normal |enhancement
--- Comment #4 from Manuel López-Ibáñez <manu at gcc dot gnu.org> ---
(In reply to Paul Eggert from comment #3)
> (In reply to Manuel López-Ibáñez from comment #1)
>
> > My guess is that what is uninitialized is "rw" and some optimization pass
> > messed up the variable names when creating temporaries.
>
> I'm afraid it's more serious than that, because 'rw = XWINDOW (make_window
> ());' always initializes 'rw'.
Yes you're right. Simplifying further we get:
extern long int make_window (void);
struct vectorlike_header { long int size; };
static _Bool
PSEUDOVECTORP (long int a)
{
if (! (((int) a & ~0) == 5))
return 0;
else
{
struct vectorlike_header *h = (void *) a - 5;
return (h->size == 4611686018595160064);
}
}
struct window
{
int line_height;
int pixel_width;
int pixel_height;
int column_width;
int text_cols;
int internal_border_width;
int left_fringe_width, right_fringe_width;
};
struct window *
make_frame (_Bool mini_p)
{
struct window *rw, *mw;
rw = (struct window *) make_window ();
if (mini_p)
{
long int a = make_window ();
if (!PSEUDOVECTORP (a)) return rw;
mw = (void*) a - 5;
}
rw->pixel_width = ((rw->text_cols * (rw->column_width))
+ (rw->left_fringe_width + (rw->right_fringe_width)) + 2 *
(rw->internal_border_width));
rw->pixel_height = ((rw->text_cols * (rw->line_height)));
if (mini_p)
{
mw->pixel_height = rw->pixel_height;
}
return rw;
}
For this, the uninit pass reports:
[WORKLIST]: add to initial list: mw_1 = PHI <mw_9(D)(9), mw_34(12)>
[CHECK]: examining phi: mw_1 = PHI <mw_9(D)(9), mw_34(12)>
[CHECK] Found def edge 1 in mw_1 = PHI <mw_9(D)(9), mw_34(12)>
[BEFORE SIMPLICATION -- [USE]:
mw_1->pixel_height = _28;
is guarded by :
mini_p_8(D) != 0
[BEFORE NORMALIZATION --[USE]:
mw_1->pixel_height = _28;
is guarded by :
mini_p_8(D) != 0
[AFTER NORMALIZATION -- [USE]:
mw_1->pixel_height = _28;
is guarded by :
mini_p_8(D) != 0
[BEFORE SIMPLICATION -- [DEF]:
mw_1 = PHI <mw_9(D)(9), mw_34(12)>
is guarded by :
mini_p_8(D) != 0 (.AND.) (.NOT.) _31 != 5 (.AND.) _35 == 4611686018595160064
[BEFORE NORMALIZATION --[DEF]:
mw_1 = PHI <mw_9(D)(9), mw_34(12)>
is guarded by :
mini_p_8(D) != 0 (.AND.) (.NOT.) _31 != 5 (.AND.) _35 == 4611686018595160064
[AFTER NORMALIZATION -- [DEF]:
mw_1 = PHI <mw_9(D)(9), mw_34(12)>
is guarded by :
_35 == 4611686018595160064 (.AND.) (.NOT.) _31 != 5 (.AND.) mini_p_8(D) != 0
[CHECK]: Found unguarded use: mw_1->pixel_height = _28;
It seems the computation of the logical guards cannot figure out that if (_35
== 4611686018595160064 (.AND.) (.NOT.) _31 != 5) is false then the function
terminates and there cannot be uninitialized uses. From the GIMPLE output, it
does not look as if it trivial to know this.