public inbox for gcc-prs@sourceware.org
help / color / mirror / Atom feed
* Re: optimization/10863: [tree-ssa] ICE in assign_var
@ 2003-05-19 15:26 Diego Novillo
  0 siblings, 0 replies; 4+ messages in thread
From: Diego Novillo @ 2003-05-19 15:26 UTC (permalink / raw)
  To: law; +Cc: gcc-prs

The following reply was made to PR optimization/10863; it has been noted by GNATS.

From: Diego Novillo <dnovillo@redhat.com>
To: bangerth@dealii.org
Cc: gcc-gnats@gcc.gnu.org
Subject: Re: optimization/10863: [tree-ssa] ICE in assign_var
Date: Mon, 19 May 2003 11:18:11 -0400

 On Mon, May 19, 2003 at 02:43:47PM -0000, bangerth@dealii.org wrote:
 
 > g/x> /home/bangerth/bin/gcc-3.4-tree-ssa/bin/c++ -O2 -c x.cc
 > x.cc: In function `void baz(const S&)':
 > x.cc:6: internal compiler error: in assign_vars, at tree-ssa.c:1557
 > Please submit a full bug report,
 > with preprocessed source if appropriate.
 > See <URL:http://gcc.gnu.org/bugs.html> for instructions.
 > 
 The modifications I'm making to stop treating INDIRECT_REF nodes
 as variables should fix this problem.  I'll test this again after
 I'm done with the patch.
 
 
 Diego.


^ permalink raw reply	[flat|nested] 4+ messages in thread
* Re: optimization/10863: [tree-ssa] ICE in assign_var
@ 2003-05-20 17:17 Andrew MacLeod
  0 siblings, 0 replies; 4+ messages in thread
From: Andrew MacLeod @ 2003-05-20 17:17 UTC (permalink / raw)
  To: law; +Cc: gcc-prs

The following reply was made to PR optimization/10863; it has been noted by GNATS.

From: Andrew MacLeod <amacleod@redhat.com>
To: bangerth@dealii.org
Cc: gcc-gnats@gcc.gnu.org
Subject: Re: optimization/10863: [tree-ssa] ICE in assign_var
Date: 20 May 2003 13:10:59 -0400

 On Mon, 2003-05-19 at 10:43, bangerth@dealii.org wrote:
 > 
 > >Number:         10863
 > >Category:       optimization
 > >Synopsis:       [tree-ssa] ICE in assign_var
 
 There is a workaround available for this bug which can be used by anyone
 who wants/needs it until Diego's changes are ready.  
 
 I posted it to gcc-patches last week (Friday 16th maybe?), I will attach
 it here again.  Its the hack Ive been using to test overlapping live
 ranges. 
 
 Andrew
 
 
 Index: tree-ssa-copyprop.c
 ===================================================================
 RCS file: /cvs/gcc/gcc/gcc/Attic/tree-ssa-copyprop.c,v
 retrieving revision 1.1.2.2
 diff -c -p -r1.1.2.2 tree-ssa-copyprop.c
 *** tree-ssa-copyprop.c	13 May 2003 17:27:23 -0000	1.1.2.2
 --- tree-ssa-copyprop.c	16 May 2003 18:09:46 -0000
 *************** get_original (var, vuse_p)
 *** 217,240 ****
       {
         tree orig = TREE_OPERAND (def_stmt, 1);
   
 !       /* If the original variable is an INDIRECT_REF, then DEF_STMT will
 ! 	 contain a virtual use of the variable's base pointer.  We also
 ! 	 need to copy that.  */
 !       if (TREE_CODE (SSA_NAME_VAR (orig)) == INDIRECT_REF)
 ! 	{
 ! 	  size_t i;
 ! 	  varray_type vuses = vuse_ops (def_stmt);
 ! 	  tree base_ptr = TREE_OPERAND (SSA_NAME_VAR (orig), 0);
 ! 
 ! 	  for (i = 0; i < VARRAY_ACTIVE_SIZE (vuses); i++)
 ! 	    if (base_ptr == SSA_NAME_VAR (VARRAY_TREE (vuses, i)))
 ! 	      {
 ! 		*vuse_p = VARRAY_TREE (vuses, i);
 ! 		break;
 ! 	      }
 ! 	}
 ! 
 !       return orig;
       }
   
     return NULL_TREE;
 --- 217,226 ----
       {
         tree orig = TREE_OPERAND (def_stmt, 1);
   
 !       /* If the original variable is an INDIRECT_REF, then this isn't a copy
 !          (it is a load from memory), so don't propagate it.  */
 !       if (TREE_CODE (SSA_NAME_VAR (orig)) != INDIRECT_REF)
 ! 	return orig;
       }
   
     return NULL_TREE;
 Index: tree-ssa-live.c
 ===================================================================
 RCS file: /cvs/gcc/gcc/gcc/Attic/tree-ssa-live.c,v
 retrieving revision 1.1.2.4
 diff -c -p -r1.1.2.4 tree-ssa-live.c
 *** tree-ssa-live.c	8 May 2003 20:29:30 -0000	1.1.2.4
 --- tree-ssa-live.c	16 May 2003 18:09:46 -0000
 *************** register_ssa_partition (map, ssa_var)
 *** 106,111 ****
 --- 106,115 ----
   {
     if (TREE_CODE (ssa_var) != SSA_NAME)
       abort ();
 + 
 +   if (TREE_CODE (SSA_NAME_VAR (ssa_var)) == INDIRECT_REF)
 +     return;
 +     
     map->partition_to_var[SSA_NAME_VERSION (ssa_var)] = ssa_var;
   }
   
 Index: tree-ssa.c
 ===================================================================
 RCS file: /cvs/gcc/gcc/gcc/Attic/tree-ssa.c,v
 retrieving revision 1.1.4.80
 diff -c -p -r1.1.4.80 tree-ssa.c
 *** tree-ssa.c	16 May 2003 18:09:19 -0000	1.1.4.80
 --- tree-ssa.c	16 May 2003 18:09:47 -0000
 *************** struct ssa_stats_d
 *** 149,159 ****
     long num_const_prop;
     long num_copy_prop;
     long num_re;
 -   /* FIXME.  [UNSSA] Not needed after SSA->normal pass is working.  */
 - #if 1
 -   long blocked_optimizations;
 -   long blocked_by_life_crossing;
 - #endif
   };
   
   static struct ssa_stats_d ssa_stats;
 --- 149,154 ----
 *************** static void set_livein_block		PARAMS ((t
 *** 169,175 ****
   static void insert_phi_nodes		PARAMS ((bitmap *, sbitmap));
   static void insert_phis_for_deferred_variables PARAMS ((varray_type));
   static void rewrite_block		PARAMS ((basic_block, tree));
 ! static void rewrite_stmt		PARAMS ((block_stmt_iterator,
   						 varray_type *,
   						 varray_type *));
   static inline void rewrite_operand	PARAMS ((tree *));
 --- 164,170 ----
   static void insert_phi_nodes		PARAMS ((bitmap *, sbitmap));
   static void insert_phis_for_deferred_variables PARAMS ((varray_type));
   static void rewrite_block		PARAMS ((basic_block, tree));
 ! static int rewrite_stmt			PARAMS ((block_stmt_iterator,
   						 varray_type *,
   						 varray_type *));
   static inline void rewrite_operand	PARAMS ((tree *));
 *************** static void coalesce_ssa_name		PARAMS ((
 *** 210,220 ****
   static void assign_vars			PARAMS ((var_map));
   static inline void set_if_valid		PARAMS ((var_map, sbitmap, tree));
   static inline void add_conflicts_if_valid	PARAMS ((root_var_p, conflict_graph, var_map, sbitmap, tree));
 ! 
 ! /* FIXME: [UNSSA] Remove once the real unSSA pass is implemented.  */
 ! #if 1
 ! static bool var_is_live			PARAMS ((tree, basic_block));
 ! #endif
   
   /* Return nonzero if RHS may be copy propagated into subsequent
      uses of LHS.  */
 --- 205,212 ----
   static void assign_vars			PARAMS ((var_map));
   static inline void set_if_valid		PARAMS ((var_map, sbitmap, tree));
   static inline void add_conflicts_if_valid	PARAMS ((root_var_p, conflict_graph, var_map, sbitmap, tree));
 ! static void replace_variable  		PARAMS ((var_map, tree *));
 ! static void eliminate_extraneous_phis	PARAMS ((void));
   
   /* Return nonzero if RHS may be copy propagated into subsequent
      uses of LHS.  */
 *************** rewrite_block (bb, eq_expr_value)
 *** 783,790 ****
     /* Step 2.  Rewrite every variable used in each statement the block with
        its immediate reaching definitions.  Update the current definition of
        a variable when a new real or virtual definition is found.  */
 !   for (si = bsi_start (bb); !bsi_end_p (si); bsi_next (&si))
 !     rewrite_stmt (si, &block_defs, &block_avail_exprs);
   
     /* Step 3.  Visit all the successor blocks of BB looking for PHI nodes.
        For every PHI node found, add a new argument containing the current
 --- 775,785 ----
     /* Step 2.  Rewrite every variable used in each statement the block with
        its immediate reaching definitions.  Update the current definition of
        a variable when a new real or virtual definition is found.  */
 !   for (si = bsi_start (bb); !bsi_end_p (si); )
 !     if (!rewrite_stmt (si, &block_defs, &block_avail_exprs))
 !       bsi_next (&si);
 !     else
 !       bsi_remove (&si);
   
     /* Step 3.  Visit all the successor blocks of BB looking for PHI nodes.
        For every PHI node found, add a new argument containing the current
 *************** assign_vars (map)
 *** 1551,1561 ****
   	      print_generic_expr (tree_ssa_dump_file, var, TDF_SLIM);
   	    }
   
 - 	  /* FIXME. Since we still don't have passes that create overlapping 
 - 	  live ranges, the code above should've coalesced all the versions of
 - 	  the variable together.  */
 - 	  abort ();
 - 
   	  var = create_temp (t);
   	  change_partition_var (map, var, i);
   	  ann = var_ann (var);
 --- 1546,1551 ----
 *************** assign_vars (map)
 *** 1572,1587 ****
     delete_root_var (rv);
   }
   
   
 ! /* Take function FNDECL out of SSA form.
   
 !    FIXME: Need to support overlapping live ranges for different versions of
 ! 	  the same variable.  At the moment, we will silently generate
 ! 	  wrong code if an optimizer pass moves code so that two versions
 ! 	  of the same variable have overlapping live ranges.
   
 ! 	  NOTE: Look for the string '[UNSSA]' to re-enable code that
 ! 	  depends on a properly working unSSA pass.  */
   
   void
   rewrite_out_of_ssa (fndecl)
 --- 1562,1718 ----
     delete_root_var (rv);
   }
   
 + /* HACK.  */
 + #if 1
 + 
 + static tree replace_embedded_vars	PARAMS ((tree *, int *, void *));
 + 
 + static tree hack_stmt;
 + static var_map hack_map;
 + static root_var_p hack_rv;
 + 
 + 
 + /* Look for *s and (*s)_x in the stmt's. Match them up with the VUSES of
 +    versions of s, and replace s with the corerct root variable.  */
 + 
 + static tree
 + replace_embedded_vars (tp, walk_subtrees, data)
 +      tree *tp;
 +      int *walk_subtrees ATTRIBUTE_UNUSED;
 +      void *data ATTRIBUTE_UNUSED;
 + {
 +   tree t = *tp;
 +   size_t i, num_ops;
 +   varray_type ops;
 +   
 +   if (TREE_CODE (t) == INDIRECT_REF)
 +     {
 +       tree var = TREE_OPERAND (t, 0);
 +       tree new_var = NULL_TREE;
 +       int tmp, tmp2;
 +       if (TREE_CODE (var) != SSA_NAME) 
 + 	{
 + 	  /* Scan the VUSES, looking for a version of var. */
 + 	  ops = vuse_ops (hack_stmt);
 + 	  num_ops = ((ops) ? VARRAY_ACTIVE_SIZE (ops) : 0);
 + 	  for (i = 0; i < num_ops; i++)
 + 	    {
 + 	      tmp = var_to_partition (hack_map, VARRAY_TREE (ops, i));
 + 	      if (tmp == NO_PARTITION)
 + 		continue;
 + 	      tmp2 = find_root_var (hack_rv, tmp);
 + 	      if (tmp2 != ROOT_VAR_NONE && root_var (hack_rv, tmp2) != var)
 + 		{
 + 		  if (var == SSA_NAME_VAR (VARRAY_TREE (ops, i)))
 + 		    {
 + 		      new_var = partition_to_var (hack_map, tmp);
 + 		      break;
 + 		    }
 + 		}
 + 	    }
 + 	  if (new_var != NULL_TREE)
 + 	    {
 + 	      tree new_tree = copy_node (t);
 + 	      TREE_OPERAND (new_tree, 0) = new_var;
 + 	      *tp = new_tree;
   
 ! 	      if (tree_ssa_dump_file)
 ! 		{
 ! 		  print_generic_stmt (tree_ssa_dump_file, hack_stmt, 128);
 ! 		  fprintf(tree_ssa_dump_file, "\nHACK. Replaced *");
 ! 		  print_generic_expr (tree_ssa_dump_file, var, TDF_SLIM);
 ! 		  fprintf(tree_ssa_dump_file, " with *");
 ! 		  print_generic_expr (tree_ssa_dump_file, new_var, TDF_SLIM);
 ! 		  fprintf(tree_ssa_dump_file, "\n");
 ! 		}
 ! 	    }
   
 ! 	}
 ! 
 !     }
 !   return NULL_TREE;
 ! }
 ! #endif
 ! 
 ! /* Replace *p with whatever variable it has been rewritten to.  */
 ! 
 ! static void
 ! replace_variable (map, p)
 !      var_map map;
 !      tree *p;
 ! {
 !   tree new_var;
 !   tree var = *p;
 !   tree copy;
 ! 
 !   new_var = var_to_partition_to_var (map, var);
 !   if (new_var)
 !     *p = new_var;
 !   else
 !     {
 !       /* Replace (*var)_version with just (*var).  */
 !       if (TREE_CODE (SSA_NAME_VAR (var)) == INDIRECT_REF)
 !         {
 ! 	  tree var2 = TREE_OPERAND (SSA_NAME_VAR (var), 0);
 ! 	  new_var = var_to_partition_to_var (map, var2);
 ! 	  copy = copy_node (SSA_NAME_VAR (var));
 ! 	  if (new_var)
 ! 	    TREE_OPERAND (copy, 0) = new_var;
 ! 	  else
 ! 	    TREE_OPERAND (copy, 0) = var2;
 ! 	  *p = copy;
 ! 	}
 !     }
 ! }
 ! 
 ! 
 ! /* Eliminate any PHI nodes are not used to generate real code.  This reduces 
 !    the number of variables in the partition, meaning we will have less 
 !    computations to perform.  */
 ! 
 ! static void
 ! eliminate_extraneous_phis ()
 ! {
 !   tree phi, result, var, last, temp;
 !   basic_block bb;
 ! 
 !   /* Look for PHI nodes which result in:
 !       - A version of the GLOBAL VAR. This is for alising only. 
 !       - A version of an indirect ref. These are load/store alising placeholders. 
 ! 	All code which is generated will use the variable located *under* the
 ! 	INDIRECT_REF.  */
 ! 
 !   FOR_EACH_BB (bb)
 !     {
 !       phi = phi_nodes (bb);
 !       for (last = NULL; phi; )
 !         {
 !           result = PHI_RESULT (phi);
 ! 	  var = SSA_NAME_VAR (result);
 ! 	  if (TREE_CODE (var) == INDIRECT_REF || var == global_var)
 ! 	    {
 ! 	      if (tree_ssa_dump_file && (tree_ssa_dump_flags & TDF_DETAILS))
 ! 	        {
 ! 		  fprintf (tree_ssa_dump_file, 
 ! 			   "BB %d. Removing extraneous PHI:",
 ! 			   bb->index);
 ! 		  print_generic_stmt (tree_ssa_dump_file, phi, TDF_SLIM);
 ! 		  fprintf (tree_ssa_dump_file, "\n");
 ! 		}
 ! 	      temp = phi;
 !               phi = TREE_CHAIN (phi);
 !               remove_phi_node (temp, last, bb);
 !             }
 !           else
 !             {
 !               last = phi;
 !               phi = TREE_CHAIN (phi);
 !             }
 !         }
 !     }
 ! }
   
 ! /* Take function FNDECL out of SSA form.  */
   
   void
   rewrite_out_of_ssa (fndecl)
 *************** rewrite_out_of_ssa (fndecl)
 *** 1594,1604 ****
 --- 1725,1745 ----
     tree phi, next;
     elim_graph g;
     int repeat;
 + #if 1
 +   /* HACK. */
 +   root_var_p rv;
 + #endif
 + 
   
     timevar_push (TV_TREE_SSA_TO_NORMAL);
   
     tree_ssa_dump_file = dump_begin (TDI_optimized, &tree_ssa_dump_flags);
   
 +   if (tree_ssa_dump_file && (tree_ssa_dump_flags & TDF_DETAILS))
 +     dump_tree_cfg (tree_ssa_dump_file, (tree_ssa_dump_flags & ~TDF_DETAILS));
 + 
 +   eliminate_extraneous_phis ();
 + 
     map = create_ssa_var_map ();
   
     /* Shrink the map to include only referenced variables.  Exclude variables
 *************** rewrite_out_of_ssa (fndecl)
 *** 1622,1627 ****
 --- 1763,1775 ----
     compact_var_map (map, VARMAP_NORMAL);
     assign_vars (map);
   
 + #if 1
 + /* HACK for pointer rename workaround.  */
 + rv = init_root_var (map);
 + if (tree_ssa_dump_file)
 +   dump_root_var (tree_ssa_dump_file, rv);
 + #endif
 + 
     if (tree_ssa_dump_file && (tree_ssa_dump_flags & TDF_DETAILS))
       {
         fprintf(tree_ssa_dump_file, "After Root variable replacement:\n");
 *************** rewrite_out_of_ssa (fndecl)
 *** 1652,1668 ****
   	  for (i = 0; i < num_ops; i++)
   	    {
   	      use_p = VARRAY_GENERIC_PTR (ops, i);
 ! 	      *use_p = var_to_partition_to_var (map, *use_p);
   	    }
   
   	  if (def_op (stmt))
   	    {
   	      tree *def_p = def_op (stmt);
 ! 	      *def_p = var_to_partition_to_var (map, *def_p);
   
 ! 	      if (is_copy && num_ops == 1 && use_p && (*def_p == *use_p))
   		remove = 1;
   	    }
   
   	  /* Remove copies of the form 'var = var'.  */
   	  if (remove)
 --- 1800,1825 ----
   	  for (i = 0; i < num_ops; i++)
   	    {
   	      use_p = VARRAY_GENERIC_PTR (ops, i);
 !               replace_variable (map, use_p);
   	    }
   
   	  if (def_op (stmt))
   	    {
   	      tree *def_p = def_op (stmt);
 !               replace_variable (map, def_p);
   
 ! 	      if (is_copy && num_ops == 1 && use_p && def_p && (*def_p == *use_p))
   		remove = 1;
   	    }
 + #if 1
 + /* HACK. Look for *p = .. and see if the 'p' needs to be renamed.  */
 + 
 + 
 +           hack_stmt = stmt;
 +           hack_map = map;
 +           hack_rv = rv;
 +           walk_tree (&stmt, replace_embedded_vars, NULL, NULL);
 + #endif
   
   	  /* Remove copies of the form 'var = var'.  */
   	  if (remove)
 *************** rewrite_out_of_ssa (fndecl)
 *** 1687,1695 ****
 --- 1844,1861 ----
   
     delete_elim_graph (g);
   
 + #if 1
 + /* HACK for pointer renaming workaround.  */
 +   if (rv)
 +     delete_root_var (rv);
 + #endif
 + 
     /* If any copies were inserted on edges, actually insert them now.  */
     bsi_commit_edge_inserts (0, NULL);
   
 +   if (tree_ssa_dump_file && (tree_ssa_dump_flags & TDF_DETAILS))
 +     dump_tree_cfg (tree_ssa_dump_file, (tree_ssa_dump_flags & ~TDF_DETAILS));
 + 
     /* Do some cleanups which reduce the amount of data the
        tree->rtl expanders deal with.  */
     do
 *************** void
 *** 1765,1771 ****
   dump_tree_ssa_stats (file)
        FILE *file;
   {
 !   long tmp, n_exprs;
   
     fprintf (file, "Total number of statements:                   %6ld\n\n",
   	   ssa_stats.num_stmts);
 --- 1931,1937 ----
   dump_tree_ssa_stats (file)
        FILE *file;
   {
 !   long n_exprs;
   
     fprintf (file, "Total number of statements:                   %6ld\n\n",
   	   ssa_stats.num_stmts);
 *************** dump_tree_ssa_stats (file)
 *** 1786,1802 ****
   	   ssa_stats.num_re, PERCENT (ssa_stats.num_re,
   				      n_exprs));
   
 -   /* FIXME.  [UNSSA] Not needed after SSA->normal pass is working.  */
 - #if 1
 -   fprintf (file, "    Optimizations blocked by lack of unSSA:   %6ld (%.0f%%)\n",
 - 	   ssa_stats.blocked_optimizations,
 - 	   PERCENT (ssa_stats.blocked_optimizations, n_exprs));
 - 
 -   tmp = ssa_stats.blocked_optimizations - ssa_stats.blocked_by_life_crossing;
 -   fprintf (file, "    Optimizations blocked due to pruned SSA:  %6ld (%.0f%%)\n",
 - 	   tmp, PERCENT (tmp, n_exprs));
 - #endif
 - 
     fprintf (file, "\nHash table statistics:\n");
   
     fprintf (file, "    def_blocks: ");
 --- 1952,1957 ----
 *************** insert_phi_nodes_for (var, dfs, def_maps
 *** 1983,1989 ****
   }
   
   
 ! /* Rewrite the statement pointed by iterator SI into SSA form.
      
      BLOCK_DEFS_P points to a stack with all the definitions found in the
         block.  This is used by rewrite_block to restore the current reaching
 --- 2138,2145 ----
   }
   
   
 ! /* Rewrite the statement pointed by iterator SI into SSA form. Return
 !    1 if the stmt is to be deleted.
      
      BLOCK_DEFS_P points to a stack with all the definitions found in the
         block.  This is used by rewrite_block to restore the current reaching
 *************** insert_phi_nodes_for (var, dfs, def_maps
 *** 2029,2035 ****
         replace the constant and copy propagation passes.  It only does very
         simplistic propagation while renaming.  */
   
 ! static void
   rewrite_stmt (si, block_defs_p, block_avail_exprs_p)
        block_stmt_iterator si;
        varray_type *block_defs_p;
 --- 2185,2191 ----
         replace the constant and copy propagation passes.  It only does very
         simplistic propagation while renaming.  */
   
 ! static int
   rewrite_stmt (si, block_defs_p, block_avail_exprs_p)
        block_stmt_iterator si;
        varray_type *block_defs_p;
 *************** rewrite_stmt (si, block_defs_p, block_av
 *** 2043,2049 ****
   
     stmt = bsi_stmt (si);
     if (IS_EMPTY_STMT (stmt))
 !     return;
   
     ann = stmt_ann (stmt);
     ssa_stats.num_stmts++;
 --- 2199,2205 ----
   
     stmt = bsi_stmt (si);
     if (IS_EMPTY_STMT (stmt))
 !     return 0;
   
     ann = stmt_ann (stmt);
     ssa_stats.num_stmts++;
 *************** rewrite_stmt (si, block_defs_p, block_av
 *** 2090,2107 ****
         val = get_value_for (*op_p, const_and_copies);
         if (val)
   	{
 - #if 1
 - 	  /* FIXME: [UNSSA] Remove the following check after implementing
 - 	     SSA->normal.  For the time being, avoid doing copy propagation
 - 	     if that would make two versions of VAL to be live at the same
 - 	     time.  */
 - 	  if (TREE_CODE (val) == SSA_NAME && !var_is_live (val, ann->bb))
 - 	    {
 - 	      ssa_stats.blocked_optimizations++;
 - 	      continue;
 - 	    }
 - #endif
 - 
   	  /* If the replacement is a constant, mark the statement modified
   	     because it just lost an operand.  */
   	  if (TREE_CONSTANT (val))
 --- 2246,2251 ----
 *************** rewrite_stmt (si, block_defs_p, block_av
 *** 2180,2216 ****
   	      fprintf (tree_ssa_dump_file, "'\n");
   	    }
   
 - 	  /* FIXME: [UNSSA] Re-enable this once the SSA->normal pass is
 - 	     implemented.  Otherwise, this leads to cases where a PHI node
 - 	     contains arguments from different variables, which is
 - 	     something we can't handle with the current unSSA pass.  It may
 - 	     also lead to cases where we re-use the LHS of a computation at
 - 	     a point where more than one version of the LHS is live at the
 - 	     same time.  */
 - #if 0
 - 	  ssa_stats.num_re++;
 - 	  TREE_OPERAND (stmt, 1) = cached_lhs;
 - 	  ann->modified = 1;
 - #else
   	  if (cached_lhs && get_value_for (*def_p, currdefs) == cached_lhs)
   	    {
   	      /* A redundant assignment to the same lhs, perhaps a new
                    evaluation of an expression temporary that is still live.
                    Just discard it.  */
   	      ssa_stats.num_re++;
 ! 	      bsi_remove (&si);
 ! 	      return;
   	    }
 ! 	  if (var_is_live (cached_lhs, ann->bb))
 ! 	    {
 ! 	      register_new_def (*def_p, cached_lhs, block_defs_p);
 ! 	      TREE_OPERAND (stmt, 1) = cached_lhs;
 ! 	      ann->modified = 1;
 ! 	      ssa_stats.num_re++;
 ! 	    }
 ! 	  else
 ! 	    ssa_stats.blocked_optimizations++;
 ! #endif
   	}
       }
   
 --- 2324,2341 ----
   	      fprintf (tree_ssa_dump_file, "'\n");
   	    }
   
   	  if (cached_lhs && get_value_for (*def_p, currdefs) == cached_lhs)
   	    {
   	      /* A redundant assignment to the same lhs, perhaps a new
                    evaluation of an expression temporary that is still live.
                    Just discard it.  */
   	      ssa_stats.num_re++;
 ! 	      return 1;
   	    }
 ! 
 ! 	  ssa_stats.num_re++;
 ! 	  TREE_OPERAND (stmt, 1) = cached_lhs;
 ! 	  ann->modified = 1;
   	}
       }
   
 *************** rewrite_stmt (si, block_defs_p, block_av
 *** 2243,2248 ****
 --- 2368,2375 ----
         register_new_def (SSA_NAME_VAR (VDEF_RESULT (vdef)), 
   			VDEF_RESULT (vdef), block_defs_p);
       }
 + 
 +   return 0;
   }
   
   
 *************** get_def_blocks_for (var)
 *** 2803,2850 ****
     dm.var = var;
     return (struct def_blocks_d *) htab_find (def_blocks, (void *) &dm);
   }
 - 
 - #if 1
 - /* Return true if the variable VAR is live at this point of the
 -    dominator tree walk.  This means that the current reaching definition
 -    for VAR is itself and that VAR is livein at basic block BB.
 - 
 -    FIXME: [UNSSA] This will not be necessary when the unSSA pass is
 -    implemented.  */
 - 
 - static bool
 - var_is_live (var, bb)
 -      tree var;
 -      basic_block bb;
 - {
 -   basic_block def_bb;
 -   struct def_blocks_d *def_map;
 -   tree real_var = SSA_NAME_VAR (var);
 - 
 -   if (get_value_for (real_var, currdefs) != var)
 -     {
 -       ssa_stats.blocked_by_life_crossing++;
 -       return false;
 -     }
 - 
 -   /* This is gross, but since it's temporary, close your eyes.  It's needed
 -      to avoid miscompiling java/jcf-write.c:generate_classfile, where the
 -      fully pruned SSA form is not inserting PHI nodes in the main loop of
 -      the function for variable 'ptr'.  This makes two versions of 'ptr'
 -      live at the same time.
 - 
 -      If there are any blocks between VAR's definition block and BB where
 -      VAR is defined again, then two versions of VAR are live at the same
 -      time.  */
 -   def_map = get_def_blocks_for (real_var);
 -   def_bb = bb_for_stmt (SSA_NAME_DEF_STMT (var));
 -   if (def_bb && bitmap_first_set_bit (def_map->def_blocks) >= 0)
 -     {
 -       int i;
 -       EXECUTE_IF_SET_IN_BITMAP (def_map->def_blocks, def_bb->index + 1, i,
 - 	return ((i < bb->index) ? false : true));
 -     }
 - 
 -   return true;
 - }
 - #endif
 --- 2930,2932 ----
 


^ permalink raw reply	[flat|nested] 4+ messages in thread
* Re: optimization/10863: [tree-ssa] ICE in assign_var
@ 2003-05-19 14:51 bangerth
  0 siblings, 0 replies; 4+ messages in thread
From: bangerth @ 2003-05-19 14:51 UTC (permalink / raw)
  To: bangerth, gcc-bugs, gcc-prs, law, nobody

Synopsis: [tree-ssa] ICE in assign_var

Responsible-Changed-From-To: unassigned->law
Responsible-Changed-By: bangerth
Responsible-Changed-When: Mon May 19 14:51:39 2003
Responsible-Changed-Why:
    Same as 10862

http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view%20audit-trail&database=gcc&pr=10863


^ permalink raw reply	[flat|nested] 4+ messages in thread
* optimization/10863: [tree-ssa] ICE in assign_var
@ 2003-05-19 14:46 bangerth
  0 siblings, 0 replies; 4+ messages in thread
From: bangerth @ 2003-05-19 14:46 UTC (permalink / raw)
  To: gcc-gnats


>Number:         10863
>Category:       optimization
>Synopsis:       [tree-ssa] ICE in assign_var
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    unassigned
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Mon May 19 14:46:02 UTC 2003
>Closed-Date:
>Last-Modified:
>Originator:     Wolfgang Bangerth
>Release:        unknown-1.0
>Organization:
>Environment:

>Description:
This proved hard to track down (thus a test case that's a little
longish), but worthwhile since this assertion triggers in
some 20 files of my library:
----------------------------------
void foo();

struct B {
    ~B() {
      int *p;
      if (0 != p) {
          int** x = 0;
          int* q = p;
          *x = q;
      }
    }
};

struct V : B {
    V() { }
    V(const V& x) { foo(); }
};

struct S {
    S(const S&);
};

struct P {
    S s;
    V v;
    P(const S& a, const V& b) : s(a), v(b) {}
};

void bar (P);
void baz (const S &s)
{
  P p(s, V());
  bar(p);
}
------------------------------

g/x> /home/bangerth/bin/gcc-3.4-tree-ssa/bin/c++ -O2 -c x.cc
x.cc: In function `void baz(const S&)':
x.cc:6: internal compiler error: in assign_vars, at tree-ssa.c:1557
Please submit a full bug report,
with preprocessed source if appropriate.
See <URL:http://gcc.gnu.org/bugs.html> for instructions.

W.
>How-To-Repeat:

>Fix:

>Release-Note:
>Audit-Trail:
>Unformatted:


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2003-05-20 17:17 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-05-19 15:26 optimization/10863: [tree-ssa] ICE in assign_var Diego Novillo
  -- strict thread matches above, loose matches on Subject: below --
2003-05-20 17:17 Andrew MacLeod
2003-05-19 14:51 bangerth
2003-05-19 14:46 bangerth

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).