[PATCH] Fix VTA ICE on Fortran COMMONs (PR debug/43166)
Richard Guenther
richard.guenther@gmail.com
Thu Feb 25 11:09:00 GMT 2010
On Thu, Feb 25, 2010 at 12:22 AM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> The following testcase ICEs, because of a Fortran FE bug, where when a
> common needs to grow DECL_MODE isn't adjusted and thus in expand_debug_expr
> we see a VAR_DECL with BLKmode type, yet DECL_RTL for it has SImode.
> We then try to convert the modes using simplify_gen_subreg, which of course
> ICEs. The following patch fixes the Fortran FE to update also DECL_SIZE,
> DECL_MODE and other stuff (alignment, DECL_RTL if already set), but IMHO it
> doesn't hurt to make expand_debug_expr more robust too.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
>
> 2010-02-24 Jakub Jelinek <jakub@redhat.com>
>
> PR debug/43166
> * cfgexpand.c (expand_debug_expr) <case VAR_DECL>: If mode is
> BLKmode, assert op0 is a MEM and just adjust its mode.
>
> * trans-common.c (build_common_decl): Also update DECL_MODE,
> and DECL_SIZE when encountering a larger common block and call
> layout_decl.
>
> * gfortran.dg/debug/pr43166.f: New test.
>
> --- gcc/cfgexpand.c.jj 2010-02-24 17:12:05.000000000 +0100
> +++ gcc/cfgexpand.c 2010-02-24 20:31:51.000000000 +0100
> @@ -2316,7 +2316,7 @@ expand_debug_expr (tree exp)
> else
> op0 = copy_rtx (op0);
>
> - if (GET_MODE (op0) == BLKmode)
> + if (GET_MODE (op0) == BLKmode || mode == BLKmode)
Ok if you add a comment here - people may find that redundant
test confusing (and even will be able to delete it w/o testsuite
regressions).
Thanks,
Richard.
> {
> gcc_assert (MEM_P (op0));
> op0 = adjust_address_nv (op0, mode, 0);
> --- gcc/fortran/trans-common.c.jj 2009-11-28 13:13:06.000000000 +0100
> +++ gcc/fortran/trans-common.c 2010-02-24 20:04:17.000000000 +0100
> @@ -399,8 +399,11 @@ build_common_decl (gfc_common_head *com,
> if (strcmp (com->name, BLANK_COMMON_NAME))
> gfc_warning ("Named COMMON block '%s' at %L shall be of the "
> "same size", com->name, &com->where);
> + DECL_SIZE (decl) = TYPE_SIZE (union_type);
> DECL_SIZE_UNIT (decl) = size;
> + DECL_MODE (decl) = TYPE_MODE (union_type);
> TREE_TYPE (decl) = union_type;
> + layout_decl (decl, 0);
> }
> }
>
> --- gcc/testsuite/gfortran.dg/debug/pr43166.f.jj 2010-02-24 20:17:26.000000000 +0100
> +++ gcc/testsuite/gfortran.dg/debug/pr43166.f 2010-02-24 20:20:14.000000000 +0100
> @@ -0,0 +1,14 @@
> +C PR debug/43166
> +C { dg-do compile }
> +C { dg-options "-O" }
> + SUBROUTINE FOO ()
> + INTEGER V1
> + COMMON // V1
> + END
> + SUBROUTINE BAR ()
> + INTEGER V0,V1,V2,V3
> + COMMON // V1(4),V2(85,4),V3
> + DO V3=1,V1(1)
> + V0=V2(V3,1)
> + END DO
> + END
>
> Jakub
>
More information about the Gcc-patches
mailing list