This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix VTA ICE on Fortran COMMONs (PR debug/43166)


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
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]