[Bug target/102683] [12 Regression] ICE in set_min_and_max_values_for_integral_type, at stor-layout.c:2851

qing.zhao at oracle dot com gcc-bugzilla@gcc.gnu.org
Mon Oct 11 14:41:34 GMT 2021


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=102683

--- Comment #5 from Qing Zhao <qing.zhao at oracle dot com> ---
> --- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
> But we should avoid
> the .DEFERRED_INIT here.  The GENERIC is
> 
>    struct C y;
>  <<cleanup_point <<< Unknown tree: expr_stmt
>  (void) (y = n == 1 ? TARGET_EXPR <D.1917, x> : TARGET_EXPR <D.1916,
> {.c=__complex__ (3.0e+0, 3.0e+0)}>) >>>>>;
> 
> so we have first
> 
>        stmt <decl_expr 0x7ffff6666da0 type <void_type 0x7ffff6558f18 void>
>            side-effects arg:0 <var_decl 0x7ffff7ff52d0 y>
>            t.i:10:5 start: t.i:10:5 finish: t.i:10:5>
> 
> and then
> 
>        stmt <cleanup_point_expr 0x7ffff6666e00 type <void_type 0x7ffff6558f18
> void>
>            side-effects
>            arg:0 <expr_stmt 0x7ffff6666de0 type <void_type 0x7ffff6558f18
> void>
>                side-effects
>                arg:0 <convert_expr 0x7ffff6666dc0 type <void_type
> 0x7ffff6558f18 void>
>                    side-effects
>                    arg:0 <init_expr 0x7ffff66810a0 type <record_type
> 0x7ffff6663d20 C>
>                        side-effects arg:0 <var_decl 0x7ffff7ff52d0 y>
>                        arg:1 <cond_expr 0x7ffff66772d0 type <record_type
> 0x7ffff6663d20 C>
> ...
> 
> so this is an INIT_EXPR which never(?) requires .DEFERRED_INIT?  Of course
> we're instrumenting the DECL_EXPR, not the INIT_EXPR and at that point
> we didn't see the INIT_EXPR.

Currently, in simplification phase, for each DECL_EXPR, we check:

  if (VAR_P (decl) && !DECL_EXTERNAL (decl))
    {
      tree init = DECL_INITIAL (decl);

      If (!init. && is_var_need_auto_init (decl))
        gimple_add_init_for_auto_var (decl…)


We assume that FE will put the explicit initializer of a DECL to its
DECL_INITIAL. 
Clearly for this testing case, this is not the case.

I am wondering why FE does not put the initializer of this DECL to its
DECL_INITIAL for this case?

> 
> I wonder if we want a bit on DECL_EXPR denoting whether the decl is
> fully initialized?

Yes, if FE can mark this bit, it will be easier and simpler for the
implementation.


More information about the Gcc-bugs mailing list