[Bug fortran/70937] [7 Regression] ICE: tree code ‘ssa_name’ is not supported in LTO streams

rguenth at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Fri May 6 09:30:00 GMT 2016


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

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jakub at gcc dot gnu.org

--- Comment #9 from Richard Biener <rguenth at gcc dot gnu.org> ---
For gfortran.dg/array_constructor_type_7.f03 the difference is

@@ -13,6 +13,7 @@
   bitsizetype D.3466;
   sizetype D.3467;

+    typedef character(kind=1) struct
character(kind=1)[1:2][1:.arr][1:2][1:.arr];
   D.3462 = (bitsizetype) (sizetype) _s * 8;
   D.3463 = (sizetype) _s;
   D.3464 = (bitsizetype) (sizetype) _a1 * 8;

which results in

  try
    {
      D.3477 = D.3458;
      D.3478 = D.3477 * 2;
      D.3479 = D.3459;
...
      .arr = MAX_EXPR <_9, 0>;
      _10 = (sizetype) .arr;
      _11 = (bitsizetype) _10;
      D.3458 = _11 * 8;

and thus an uninitialized use of D.3458.

Note there _is_ already a decl expr, but it looks like

        stmt <decl_expr 0x7ffff6a4eb60 type <array_type 0x7ffff6a4b498>
            side-effects arg 0 <var_decl 0x7ffff7ff6a20 arr>

so it is for a VAR_DECL.  It looks like the Fortran FE "gimplifes" type
sizes on its own (in some cases at least).  The above is built here:

void
gfc_trans_auto_array_allocation (tree decl, gfc_symbol * sym,
                                 gfc_wrapped_block * block)
{
...
  /* Evaluate character string length.  */
  if (sym->ts.type == BT_CHARACTER
      && onstack && !INTEGER_CST_P (sym->ts.u.cl->backend_decl))
    {
      gfc_conv_string_length (sym->ts.u.cl, NULL, &init);

      gfc_trans_vla_type_sizes (sym, &init);

      /* Emit a DECL_EXPR for this variable, which will cause the
         gimplifier to allocate storage, and all that good stuff.  */
      tmp = fold_build1_loc (input_location, DECL_EXPR, TREE_TYPE (decl),
decl);
      gfc_add_expr_to_block (&init, tmp);


and gfc_trans_vla_type_sizes has the interesting comment:

/* Make sure all type sizes and array domains are either constant,
   or variable or parameter decls.  This is a simplified variant
   of gimplify_type_sizes, but we can't use it here, as none of the
   variables in the expressions have been gimplified yet.
   As type sizes and domains for various variable length arrays
   contain VAR_DECLs that are only initialized at gfc_trans_deferred_vars
   time, without this routine gimplify_type_sizes in the middle-end
   could result in the type sizes being gimplified earlier than where
   those variables are initialized.  */

void
gfc_trans_vla_type_sizes (gfc_symbol *sym, stmtblock_t *body)


This code was added by Jakub ten years ago.

I can fix the wrong-code regressions by restricting place_decl_expr to work
on pointer types.  But all this looks like the wrong way to fix the FE
issue of missing DECL_EXPRs for some of its "anonymous" types it generates.

But the above FE "gimplification" code suggests that it is wrong if the
gimplifier ever sees non-gimplified type sizes.

In this case the FE generated

  {
    integer(kind=8) D.3445;

    D.3445 = args->dim[0].stride;
    stride.1 = D.3445 != 0 ? D.3445 : 1;
    args.0 = (character(kind=1)[0:D.3448][1:_args] * restrict) args->data;
    ubound.0 = (args->dim[0].ubound - args->dim[0].lbound) + 1;
    size.3 = stride.1 * ubound.0;
    offset.2 = -stride.1;
    D.3446 = (bitsizetype) (sizetype) _args * 8;

which is gimplified to

        _4 = (sizetype) _args;
        _5 = (bitsizetype) _4;
        D.3446 = _5 * 8;

but the expression (sizetype) _args was also used in the TYPE_DECLs
array type TYPE_SIZE

  SAVE_EXPR <((bitsizetype) _4 * (bitsizetype) (sizetype) ubound.0) * 8>

which the FE "gimplification" doesn't adjust.

The type we end up "gimplifying" is the one built by gfc_build_qualified_array.

They are connected via TYPE_NAME (but they do not share sizes, they even
use differently named decls):

SAVE_EXPR <((bitsizetype) (sizetype) _args * (bitsizetype) (sizetype) ubound.0)
* 8>
SAVE_EXPR <((bitsizetype) (sizetype) _args * (bitsizetype) (sizetype) size.3) *
8>

So the following patch also fixes this PR.

Index: gcc/fortran/trans-decl.c
===================================================================
--- gcc/fortran/trans-decl.c    (revision 235945)
+++ gcc/fortran/trans-decl.c    (working copy)
@@ -3818,6 +3818,9 @@ gfc_trans_vla_type_sizes (gfc_symbol *sy
     }

   gfc_trans_vla_type_sizes_1 (type, body);
+  if (TYPE_NAME (type)
+      && TREE_TYPE (TYPE_NAME (type)) != type)
+    gfc_trans_vla_type_sizes_1 (TREE_TYPE (TYPE_NAME (type)), body);
 }


or the following, only making sure to get the unsharing correct.

Index: gcc/fortran/trans-decl.c
===================================================================
--- gcc/fortran/trans-decl.c    (revision 235945)
+++ gcc/fortran/trans-decl.c    (working copy)
@@ -3818,6 +3818,11 @@ gfc_trans_vla_type_sizes (gfc_symbol *sy
     }

   gfc_trans_vla_type_sizes_1 (type, body);
+  /* gfc_build_qualified_array may have built this type but left TYPE_NAME
+     pointing to the original type whose type sizes we need to expose to
+     the gimplifier unsharing.  */
+  if (TYPE_NAME (type))
+    gfc_add_expr_to_block (body, build1 (DECL_EXPR, type, TYPE_NAME (type)));
 }



the last one I am testing now.


More information about the Gcc-bugs mailing list