[Bug middle-end/15855] [3.4/4.0 Regression] g++ crash with -O2 and -O3 on input file

Jeffrey A Law law@redhat.com
Thu Dec 2 04:57:00 GMT 2004


On Wed, 2004-12-01 at 10:32 -0800, Richard Henderson wrote:
> On Wed, Dec 01, 2004 at 11:05:43AM -0700, Jeffrey A Law wrote:
> > I'm not checking in this change at the current time to give folks
> > (particularly Richard & Jason) a chance to comment.
> 
> If you get that much improvement out of it, sure.  Might want to
> put a comment before the static variables discussing this issue.
Here's what I actually checked in.  Only changes were in comments.

Cheers,
Jeff
-------------- next part --------------
        * tree.h (save_eptr, save_filt): Now file scoped statics.
        (honor_protect_cleanup_actions): Only create save_eptr and
        save_filt if they do not already exist.
        (lower_eh_constructs): Wipe all knowledge of save_eptr and
        save_filt before returning.

Index: tree-eh.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-eh.c,v
retrieving revision 2.20
diff -c -p -r2.20 tree-eh.c
*** tree-eh.c	23 Sep 2004 14:34:19 -0000	2.20
--- tree-eh.c	2 Dec 2004 04:54:34 -0000
*************** Boston, MA 02111-1307, USA.  */
*** 37,42 ****
--- 37,57 ----
  #include "langhooks.h"
  #include "ggc.h"
  
+ /* In some circumstances we have to save EH data around a nested
+    exception.  The EXC_PTR_EXPR and FILTER_EXPR values are saved
+    into these _DECL nodes.
+ 
+    We lazily create this pair of _DECL nodes once per function rather
+    than creating a new pair of _DECLs each time we need to save the
+    EXEC_PTR and FILTER.  This can save us literally thousands of _DECL
+    nodes when we have many inline destructors with an embedded try block.  
+ 
+    This is safe as we know the lifetime of the values in these _DECL nodes.
+    Their lifetimes also ensure that globbing these uses into a single
+    pair of _DECL nodes requires no additional PHI_NODEs or SSA_NAMEs when
+    compared to having a pair of _DECL nodes per inline destructor with
+    an embedded try block.  */
+ static tree save_eptr, save_filt;
  
  /* Nonzero if we are using EH to handle cleanups.  */
  static int using_eh_for_cleanups_p = 0;
*************** honor_protect_cleanup_actions (struct le
*** 807,816 ****
       we never fallthru from this copy of the finally block.  */
    if (finally_may_fallthru)
      {
!       tree save_eptr, save_filt;
! 
!       save_eptr = create_tmp_var (ptr_type_node, "save_eptr");
!       save_filt = create_tmp_var (integer_type_node, "save_filt");
  
        i = tsi_start (finally);
        x = build (EXC_PTR_EXPR, ptr_type_node);
--- 822,834 ----
       we never fallthru from this copy of the finally block.  */
    if (finally_may_fallthru)
      {
!       /* If we have not created _DECLs for saving the EXC_PTR
! 	 and FILTER_EXPR, create them now.  */
!       if (!save_eptr)
! 	{
! 	  save_eptr = create_tmp_var (ptr_type_node, "save_eptr");
! 	  save_filt = create_tmp_var (integer_type_node, "save_filt");
! 	}
  
        i = tsi_start (finally);
        x = build (EXC_PTR_EXPR, ptr_type_node);
*************** lower_eh_constructs (void)
*** 1644,1649 ****
--- 1662,1672 ----
    htab_delete (finally_tree);
  
    collect_eh_region_array ();
+ 
+   /* Wipe the DECLs we use for saving the EXC_PTR and FILTER_EXPR
+      to ensure we create new ones for the next function.  */
+   save_eptr = NULL;
+   save_filt = NULL;
  }
  
  struct tree_opt_pass pass_lower_eh =


More information about the Gcc-patches mailing list