From 0679656478759e3bfd02f6f0a4b22fd792b736d7 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 25 Feb 2010 11:50:24 +0100 Subject: [PATCH] re PR debug/43166 (ICE in simplify_subreg on fortran code) PR debug/43166 * cfgexpand.c (expand_debug_expr) : 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. From-SVN: r157063 --- gcc/ChangeLog | 4 ++++ gcc/cfgexpand.c | 6 +++++- gcc/fortran/ChangeLog | 7 +++++++ gcc/fortran/trans-common.c | 5 ++++- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/gfortran.dg/debug/pr43166.f | 14 ++++++++++++++ 6 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/debug/pr43166.f diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a8c96f2754c..c66acfa1914 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2010-02-25 Jakub Jelinek + PR debug/43166 + * cfgexpand.c (expand_debug_expr) : If mode is + BLKmode, assert op0 is a MEM and just adjust its mode. + PR debug/43165 * cfgexpand.c (expand_debug_expr): Don't call simplify_gen_subreg if bitpos isn't multiple of mode's bitsize. diff --git a/gcc/cfgexpand.c b/gcc/cfgexpand.c index e60df874482..7b8df04bed0 100644 --- a/gcc/cfgexpand.c +++ b/gcc/cfgexpand.c @@ -2316,7 +2316,11 @@ expand_debug_expr (tree exp) else op0 = copy_rtx (op0); - if (GET_MODE (op0) == BLKmode) + if (GET_MODE (op0) == BLKmode + /* If op0 is not BLKmode, but BLKmode is, adjust_mode + below would ICE. While it is likely a FE bug, + try to be robust here. See PR43166. */ + || mode == BLKmode) { gcc_assert (MEM_P (op0)); op0 = adjust_address_nv (op0, mode, 0); diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index af4bf20d3f4..08a6b680330 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2010-02-25 Jakub Jelinek + + PR debug/43166 + * trans-common.c (build_common_decl): Also update DECL_MODE, + and DECL_SIZE when encountering a larger common block and call + layout_decl. + 2010-02-24 Tobias Burnus PR fortran/43042 diff --git a/gcc/fortran/trans-common.c b/gcc/fortran/trans-common.c index 62a2e018210..844ac1d2674 100644 --- a/gcc/fortran/trans-common.c +++ b/gcc/fortran/trans-common.c @@ -1,5 +1,5 @@ /* Common block and equivalence list handling - Copyright (C) 2000, 2003, 2004, 2005, 2006, 2007, 2008, 2009 + Copyright (C) 2000, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. Contributed by Canqun Yang @@ -399,8 +399,11 @@ build_common_decl (gfc_common_head *com, tree union_type, bool is_init) 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); } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 14685fdad5e..c3fbe6646b5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2010-02-25 Jakub Jelinek + PR debug/43166 + * gfortran.dg/debug/pr43166.f: New test. + PR debug/43165 * gcc.dg/torture/pr43165.c: New test. diff --git a/gcc/testsuite/gfortran.dg/debug/pr43166.f b/gcc/testsuite/gfortran.dg/debug/pr43166.f new file mode 100644 index 00000000000..a3146150b99 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/debug/pr43166.f @@ -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