PR59723: fix LTO + fortran namelist ICEs

Richard Biener rguenther@suse.de
Tue Feb 4 14:49:00 GMT 2014


On Tue, 4 Feb 2014, Dominique Dhumieres wrote:

> With the petches (an a minor fix in gcc/lto/lto.c) the remaining failures
> are
> 
> FAIL: gfortran.dg/debug/pr35154-dwarf2.f -gdwarf-2  scan-assembler (DW_AT_name: "label"|"label[^\n]*"[^\n]*DW_AT_name)
> FAIL: gfortran.dg/debug/pr35154-dwarf2.f -gdwarf-2 -g3  scan-assembler (DW_AT_name: "label"|"label[^\n]*"[^\n]*DW_AT_name)
> FAIL: gfortran.dg/bind_c_array_params_2.f90  -O   scan-assembler-times myBindC 1
> FAIL: gfortran.dg/bind_c_vars.f90  -O0  (test for excess errors)
> FAIL: gfortran.dg/bind_c_vars.f90  -O1  (test for excess errors)
> FAIL: gfortran.dg/bind_c_vars.f90  -O2  (test for excess errors)
> FAIL: gfortran.dg/bind_c_vars.f90  -O3 -fomit-frame-pointer  (test for excess errors)
> FAIL: gfortran.dg/bind_c_vars.f90  -O3 -fomit-frame-pointer -funroll-loops  (test for excess errors)
> FAIL: gfortran.dg/bind_c_vars.f90  -O3 -fomit-frame-pointer -funroll-all-loops -finline-functions  (test for excess errors)
> FAIL: gfortran.dg/bind_c_vars.f90  -O3 -g  (test for excess errors)
> FAIL: gfortran.dg/bind_c_vars.f90  -Os  (test for excess errors)
> FAIL: gfortran.dg/namelist_14.f90  -O3 -g  (internal compiler error)
> FAIL: gfortran.dg/namelist_14.f90  -O3 -g  (test for excess errors)
> FAIL: gfortran.dg/namelist_51.f90  -O3 -g  (test for excess errors)
> FAIL: gfortran.dg/namelist_69.f90  -O3 -g  (internal compiler error)
> FAIL: gfortran.dg/namelist_69.f90  -O3 -g  (test for excess errors)
> FAIL: gfortran.dg/namelist_70.f90  -O3 -g  (internal compiler error)
> FAIL: gfortran.dg/namelist_70.f90  -O3 -g  (test for excess errors)
> FAIL: gfortran.dg/pr48636-2.f90  -O   scan-ipa-dump cp "Creating a specialized node of bar/[0-9]*\\."
> FAIL: gfortran.dg/pr52835.f90  -O   scan-tree-dump optimized "bar "
> FAIL: gfortran.dg/pr53787.f90  -O   scan-ipa-dump cp "Creating a specialized node of init"
> FAIL: gfortran.dg/pr53787.f90  -O   scan-ipa-dump-times cp "Aggregate replacements" 2
> 
> The ICEs are
> 
> /opt/gcc/work/gcc/testsuite/gfortran.dg/namelist_14.f90:96:0: internal compiler error: in force_decl_die, at dwarf2out.c:20211
> 
> The excess error for gfortran.dg/namelist_51.f90 is
> 
> warning: invalid DWARF generated by the compiler: DIE 0x000001f0 has multiple  AT_calling_convention attributes in '/var/folders/8q/sh_swgz96r7f5vnn08f7fxr00000gn/T//ccub2YMQ.ltrans0.ltrans.o'.
> 
> Note that if the test is compiled with -g only, I get an ICE
> 
> lto1: internal compiler error: in add_AT_specification, at dwarf2out.c:4096
> 
> I have looked to the scan errors for bind_c_array_params_2.f90:
> 
> myBindC appears twice
> 
> 	call	_myBindC
> 	.ascii "_main\0\0\0\0\0\0\0\0\0\0\0\0\274\0\0\0_myBindC\0\0\2\0\0\0\0\0\0\0\0\0\356\0\0\0__gfortran_set_options ...
> 
> and for pr48636-2.f90 where "Creating a specialized node of bar"
> is replaced with "Creating a specialized node of __foo_MOD_bar".
> 
> Such failures are quite easy to fix, but I wonder if they worth the effort.

The dwarf2out.c ICEs are fixed with the tree_is_indexable hunk.

Bootstrapped and tested on x86_64-unknown-linux-gnu, SPEC 2k6 -flto -g
built and gfortran.dg tested with -flto, applied to trunk.

Richard.

2014-02-04  Richard Biener  <rguenther@suse.de>

	PR lto/59723
	* lto-streamer-out.c (tree_is_indexable): Force NAMELIST_DECLs
	in function context local.
	(lto_output_tree_ref): Do not write trees from lto_output_tree_ref.
	* lto-streamer-in.c (lto_input_tree_ref): Handle LTO_namelist_decl_ref
	similar to LTO_imported_decl_ref.

	lto/
	* lto.c (mentions_vars_p): Handle NAMELIST_DECL.
	(lto_fixup_prevailing_decls): Handle fixing up CONSTRUCTOR values.

Index: gcc/lto-streamer-in.c
===================================================================
*** gcc/lto-streamer-in.c	(revision 207455)
--- gcc/lto-streamer-in.c	(working copy)
*************** lto_input_tree_ref (struct lto_input_blo
*** 244,275 ****
      case LTO_imported_decl_ref:
      case LTO_label_decl_ref:
      case LTO_translation_unit_decl_ref:
        ix_u = streamer_read_uhwi (ib);
        result = lto_file_decl_data_get_var_decl (data_in->file_data, ix_u);
        break;
  
-     case LTO_namelist_decl_ref:
-       {
- 	tree tmp;
- 	vec<constructor_elt, va_gc> *nml_decls = NULL;
- 	unsigned i, n;
- 
- 	result = make_node (NAMELIST_DECL);
- 	TREE_TYPE (result) = void_type_node;
- 	DECL_NAME (result) = stream_read_tree (ib, data_in);
- 	n = streamer_read_uhwi (ib);
- 	for (i = 0; i < n; i++)
- 	  {
- 	    ix_u = streamer_read_uhwi (ib);
- 	    tmp = lto_file_decl_data_get_var_decl (data_in->file_data, ix_u);
- 	    gcc_assert (tmp != NULL_TREE);
- 	    CONSTRUCTOR_APPEND_ELT (nml_decls, NULL_TREE, tmp);
- 	  }
- 	NAMELIST_DECL_ASSOCIATED_DECL (result) = build_constructor (NULL_TREE,
- 								    nml_decls);
- 	break;
-       }
- 
      default:
        gcc_unreachable ();
      }
--- 244,254 ----
      case LTO_imported_decl_ref:
      case LTO_label_decl_ref:
      case LTO_translation_unit_decl_ref:
+     case LTO_namelist_decl_ref:
        ix_u = streamer_read_uhwi (ib);
        result = lto_file_decl_data_get_var_decl (data_in->file_data, ix_u);
        break;
  
      default:
        gcc_unreachable ();
      }
Index: gcc/lto-streamer-out.c
===================================================================
*** gcc/lto-streamer-out.c	(revision 207455)
--- gcc/lto-streamer-out.c	(working copy)
*************** tree_is_indexable (tree t)
*** 139,145 ****
      return variably_modified_type_p (TREE_TYPE (DECL_CONTEXT (t)), NULL_TREE);
    else if (((TREE_CODE (t) == VAR_DECL && !TREE_STATIC (t))
  	    || TREE_CODE (t) == TYPE_DECL
! 	    || TREE_CODE (t) == CONST_DECL)
  	   && decl_function_context (t))
      return false;
    else if (TREE_CODE (t) == DEBUG_EXPR_DECL)
--- 139,146 ----
      return variably_modified_type_p (TREE_TYPE (DECL_CONTEXT (t)), NULL_TREE);
    else if (((TREE_CODE (t) == VAR_DECL && !TREE_STATIC (t))
  	    || TREE_CODE (t) == TYPE_DECL
! 	    || TREE_CODE (t) == CONST_DECL
! 	    || TREE_CODE (t) == NAMELIST_DECL)
  	   && decl_function_context (t))
      return false;
    else if (TREE_CODE (t) == DEBUG_EXPR_DECL)
*************** lto_output_tree_ref (struct output_block
*** 255,273 ****
        break;
  
      case NAMELIST_DECL:
!       {
! 	unsigned i;
! 	tree value, tmp;
! 
! 	streamer_write_record_start (ob, LTO_namelist_decl_ref);
! 	stream_write_tree (ob, DECL_NAME (expr), true);
! 	tmp = NAMELIST_DECL_ASSOCIATED_DECL (expr);
! 	gcc_assert (tmp != NULL_TREE);
! 	streamer_write_uhwi (ob, CONSTRUCTOR_ELTS (tmp)->length());
! 	FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (tmp), i, value)
! 	  lto_output_var_decl_index (ob->decl_state, ob->main_stream, value);
! 	break;
!       }
  
      case NAMESPACE_DECL:
        streamer_write_record_start (ob, LTO_namespace_decl_ref);
--- 256,264 ----
        break;
  
      case NAMELIST_DECL:
!       streamer_write_record_start (ob, LTO_namelist_decl_ref);
!       lto_output_var_decl_index (ob->decl_state, ob->main_stream, expr);
!       break;
  
      case NAMESPACE_DECL:
        streamer_write_record_start (ob, LTO_namespace_decl_ref);

Index: gcc/lto/lto.c
===================================================================
*** gcc/lto/lto.c	(revision 207455)
--- gcc/lto/lto.c	(working copy)
*************** mentions_vars_p (tree t)
*** 926,931 ****
--- 926,932 ----
      case RESULT_DECL:
      case IMPORTED_DECL:
      case NAMESPACE_DECL:
+     case NAMELIST_DECL:
        return mentions_vars_p_decl_common (t);
  
      case VAR_DECL:
*************** lto_fixup_prevailing_decls (tree t)
*** 2597,2603 ****
    enum tree_code code = TREE_CODE (t);
    bool fixed = false;
  
!   gcc_checking_assert (code != CONSTRUCTOR && code != TREE_BINFO);
    LTO_NO_PREVAIL (TREE_TYPE (t));
    if (CODE_CONTAINS_STRUCT (code, TS_COMMON))
      LTO_NO_PREVAIL (TREE_CHAIN (t));
--- 2598,2604 ----
    enum tree_code code = TREE_CODE (t);
    bool fixed = false;
  
!   gcc_checking_assert (code != TREE_BINFO);
    LTO_NO_PREVAIL (TREE_TYPE (t));
    if (CODE_CONTAINS_STRUCT (code, TS_COMMON))
      LTO_NO_PREVAIL (TREE_CHAIN (t));
*************** lto_fixup_prevailing_decls (tree t)
*** 2659,2664 ****
--- 2660,2672 ----
        for (i = TREE_OPERAND_LENGTH (t) - 1; i >= 0; --i)
  	LTO_SET_PREVAIL (TREE_OPERAND (t, i));
      }
+   else if (TREE_CODE (t) == CONSTRUCTOR)
+     {
+       unsigned i;
+       tree val;
+       FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (t), i, val)
+ 	LTO_SET_PREVAIL (val);
+     }
    else
      {
        switch (code)



More information about the Gcc-patches mailing list