Message ID | 20160718125315.55cwqwxlkcejeued@virgil.suse.cz |
---|---|
State | New |
Headers | show |
Dear Martin, This looks like an 'obvious' fix. OK for all the branches, 4.9->trunk. Thanks for the patch Paul On 18 July 2016 at 14:53, Martin Jambor <mjambor@suse.cz> wrote: > Ping (this time also CCing fortran@gcc.gnu and Honza). > > I really think this should be backported to 4.9 in time for the last > release. > > Thanks, > > Martin > > ----- Original message from Martin Jambor <mjambor@suse.cz> ----- > > Date: Thu, 30 Jun 2016 11:13:17 +0200 > From: Martin Jambor <mjambor@suse.cz> > To: GCC Patches <gcc-patches@gcc.gnu.org> > Subject: Fix PR fortran/71688 > > Hi, > > PR 71688 is about an ICE in cgraphunit.c caused by the fact that > Fortran FE creates two separate call-graph nodes for a single function > decl, if you are interested, complete backtraces leading to the point > of creating them are in bugzilla. > > The intuitive fix, changing one of these points so that they call > cgraph::get_create rather than cgraph_node::create works and given the > comment just before the line also seems like the correct thing to do: > > /* Register this function with cgraph just far enough to get it > added to our parent's nested function list. > If there are static coarrays in this function, the nested _caf_init > function has already called cgraph_create_node, which also created > the cgraph node for this function. */ > > It is interesting that the bug lurked so long there. I have > bootstrapped and tested the patch below on x86_64-linux, is it OK for > trunk and (after a while) for all active release branches? > > Thanks, > > Martin > > > 2016-06-29 Martin Jambor <mjambor@suse.cz> > > PR fortran/71688 > * trans-decl.c (gfc_generate_function_code): Use get_create rather > than create to get a call graph node. > > testsuite/ > gfortran.dg/pr71688.f90: New test. > > > diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c > index 2f5e434..0e68736 100644 > --- a/gcc/fortran/trans-decl.c > +++ b/gcc/fortran/trans-decl.c > @@ -6336,7 +6336,7 @@ gfc_generate_function_code (gfc_namespace * ns) > function has already called cgraph_create_node, which also created > the cgraph node for this function. */ > if (!has_coarray_vars || flag_coarray != GFC_FCOARRAY_LIB) > - (void) cgraph_node::create (fndecl); > + (void) cgraph_node::get_create (fndecl); > } > else > cgraph_node::finalize_function (fndecl, true); > diff --git a/gcc/testsuite/gfortran.dg/pr71688.f90 b/gcc/testsuite/gfortran.dg/pr71688.f90 > new file mode 100644 > index 0000000..dbb6d18 > --- /dev/null > +++ b/gcc/testsuite/gfortran.dg/pr71688.f90 > @@ -0,0 +1,13 @@ > +! { dg-do compile } > +! { dg-options "-fcoarray=lib" } > + > +program p > + call s > +contains > + subroutine s > + real :: x[*] = 1 > + block > + end block > + x = 2 > + end > +end > > ----- End original message -----
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c index 2f5e434..0e68736 100644 --- a/gcc/fortran/trans-decl.c +++ b/gcc/fortran/trans-decl.c @@ -6336,7 +6336,7 @@ gfc_generate_function_code (gfc_namespace * ns) function has already called cgraph_create_node, which also created the cgraph node for this function. */ if (!has_coarray_vars || flag_coarray != GFC_FCOARRAY_LIB) - (void) cgraph_node::create (fndecl); + (void) cgraph_node::get_create (fndecl); } else cgraph_node::finalize_function (fndecl, true); diff --git a/gcc/testsuite/gfortran.dg/pr71688.f90 b/gcc/testsuite/gfortran.dg/pr71688.f90 new file mode 100644 index 0000000..dbb6d18 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr71688.f90 @@ -0,0 +1,13 @@ +! { dg-do compile } +! { dg-options "-fcoarray=lib" } + +program p + call s +contains + subroutine s + real :: x[*] = 1 + block + end block + x = 2 + end +end
Ping (this time also CCing fortran@gcc.gnu and Honza). I really think this should be backported to 4.9 in time for the last release. Thanks, Martin ----- Original message from Martin Jambor <mjambor@suse.cz> ----- Date: Thu, 30 Jun 2016 11:13:17 +0200 From: Martin Jambor <mjambor@suse.cz> To: GCC Patches <gcc-patches@gcc.gnu.org> Subject: Fix PR fortran/71688 Hi, PR 71688 is about an ICE in cgraphunit.c caused by the fact that Fortran FE creates two separate call-graph nodes for a single function decl, if you are interested, complete backtraces leading to the point of creating them are in bugzilla. The intuitive fix, changing one of these points so that they call cgraph::get_create rather than cgraph_node::create works and given the comment just before the line also seems like the correct thing to do: /* Register this function with cgraph just far enough to get it added to our parent's nested function list. If there are static coarrays in this function, the nested _caf_init function has already called cgraph_create_node, which also created the cgraph node for this function. */ It is interesting that the bug lurked so long there. I have bootstrapped and tested the patch below on x86_64-linux, is it OK for trunk and (after a while) for all active release branches? Thanks, Martin 2016-06-29 Martin Jambor <mjambor@suse.cz> PR fortran/71688 * trans-decl.c (gfc_generate_function_code): Use get_create rather than create to get a call graph node. testsuite/ gfortran.dg/pr71688.f90: New test. ----- End original message -----