This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[tree-ssa] [PATCH]: PRE update #2


Fix some bugs.
Might actually bootstrap now, we'll see.

2003-06-26  Daniel Berlin  <dberlin@dberlin.org>

	* tree-ssa-pre.c (fixup_domchildren): Rename from
	compute_domchildren, change to not use our own array.
	(domchildren): Remove variable.
	(insert_occ_in_preorder_dt_order_1): Use dom_children now.
	(insert_euse_in_preorder_dt_order_1): Ditto.
	(search_dt_preorder): Ditto.
	(handle_bb_creation): Fix to work properly.
	(tree_perform_ssapre): Remove remnants of domchildren.
	Redo dominator info if we have to due to a new block.

Index: tree-ssa-pre.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/Attic/tree-ssa-pre.c,v
retrieving revision 1.1.4.58
diff -u -3 -p -r1.1.4.58 tree-ssa-pre.c
--- tree-ssa-pre.c	25 Jun 2003 21:52:56 -0000	1.1.4.58
+++ tree-ssa-pre.c	26 Jun 2003 21:35:40 -0000
@@ -115,7 +115,7 @@ struct expr_info;
 static bool expr_lexically_eq (const tree, const tree);
 static void free_expr_info (struct expr_info *);
 static bitmap compute_idfs (bitmap *, tree);
-static void compute_domchildren (dominance_info, sbitmap *);
+static void fixup_domchildren (dominance_info);
 static inline bool a_dom_b (tree, tree);
 static void set_var_phis (struct expr_info *, tree);
 static void calculate_preorder (void);
@@ -205,7 +205,7 @@ static splay_tree idom_of_ephi;
 /* Map from blocks to their depth first number.  */
 static splay_tree dfn;

-static bool redo_dominators;
+static bool redo_dominators = false;

 static struct pre_stats_d
 {
@@ -223,9 +223,6 @@ static struct pre_stats_d

 static splay_tree old_new_map;

-/* sbitmap vector mapping blocks to the child blocks they dominate. */
-static sbitmap *domchildren;
-
 struct expr_info
 {
   /* The actual expression.  */
@@ -750,10 +747,11 @@ insert_occ_in_preorder_dt_order_1 (struc
             }
         }
     }
-  EXECUTE_IF_SET_IN_SBITMAP (domchildren[block->index], 0, i,
-  {
-    insert_occ_in_preorder_dt_order_1 (ei, fh, BASIC_BLOCK (i));
-  });
+  if (dom_children (block))
+    EXECUTE_IF_SET_IN_BITMAP (dom_children (block), 0, i,
+    {
+      insert_occ_in_preorder_dt_order_1 (ei, fh, BASIC_BLOCK (i));
+    });
 }

 static void
@@ -1670,10 +1668,11 @@ insert_euse_in_preorder_dt_order_1 (stru
 	  || TREE_CODE (ref) == ELEFT_NODE)
 	VARRAY_PUSH_TREE (ei->euses_dt_order, ref);
     }
-  EXECUTE_IF_SET_IN_SBITMAP (domchildren[block->index], 0, i,
-  {
-    insert_euse_in_preorder_dt_order_1 (ei, BASIC_BLOCK (i));
-  });
+  if (dom_children (block))
+    EXECUTE_IF_SET_IN_BITMAP (dom_children (block), 0, i,
+    {
+      insert_euse_in_preorder_dt_order_1 (ei, BASIC_BLOCK (i));
+    });
 }

 static void
@@ -1838,10 +1837,13 @@ handle_bb_creation (struct expr_info *ei
 	  int j;
 	  for (j = 0; j < num_elem; j++)
 	    if (PHI_ARG_EDGE (phi, j) == old_edge)
-	      {
-		PHI_ARG_EDGE (phi, j) = new_edge;
-		EPHI_ARG_EDGE (tempephi, j) = new_edge;
-	      }
+	      PHI_ARG_EDGE (phi, j) = new_edge;
+
+	  num_elem = EPHI_NUM_ARGS (tempephi);
+	  for (j = 0; j < num_elem; j++)
+	    if (EPHI_ARG_EDGE (tempephi, j) == old_edge)
+	      EPHI_ARG_EDGE (tempephi, j) = new_edge;
+
 	}
     }
 }
@@ -2750,10 +2752,10 @@ a_dom_b (tree a, tree b)
   return ret;
 }

-/* Compute the domchildren sbitmap vector from the list of immediate
-   dominators.  */
+/* Fixup the dom_children annotations. Only needed until
+   insert_on_edge_immediate does it for us. */
 static void
-compute_domchildren (dominance_info idom, sbitmap * domc)
+fixup_domchildren (dominance_info idom)
 {
   basic_block bb;
   FOR_EACH_BB (bb)
@@ -2761,7 +2763,8 @@ compute_domchildren (dominance_info idom
       basic_block dom;
       dom = get_immediate_dominator (idom, bb);
       if (dom && dom->index >= 0)
-        SET_BIT (domc[dom->index], bb->index);
+	add_dom_child (dom, bb);
+
     }
 }

@@ -3184,8 +3187,8 @@ search_dt_preorder (basic_block bb, int
 {
   int i;
   splay_tree_insert (dfn, (splay_tree_key) bb, num);
-  if (bb_ann (bb)->dom_children)
-    EXECUTE_IF_SET_IN_BITMAP (bb_ann (bb)->dom_children, 0, i,
+  if (dom_children (bb))
+    EXECUTE_IF_SET_IN_BITMAP (dom_children (bb), 0, i,
     {
       num = search_dt_preorder (BASIC_BLOCK (i), ++num);
     });
@@ -3216,9 +3219,7 @@ tree_perform_ssapre (tree fndecl)

   /* Compute immediate dominators.  */
   pre_idom = calculate_dominance_info (CDI_DOMINATORS);
-  domchildren = sbitmap_vector_alloc (last_basic_block, last_basic_block);
-  sbitmap_vector_zero (domchildren, last_basic_block);
-  compute_domchildren (pre_idom, domchildren);
+  fixup_domchildren (pre_idom);
   currbbs = n_basic_blocks;
   /* Compute dominance frontiers.  */
   pre_dfs = (bitmap *) xmalloc (sizeof (bitmap) * currbbs);
@@ -3301,7 +3302,39 @@ tree_perform_ssapre (tree fndecl)
       }

   for (k = 0; k < VARRAY_ACTIVE_SIZE (bexprs); k++)
-    pre_expression (VARRAY_GENERIC_PTR (bexprs, k), pre_dfs);
+    {
+      pre_expression (VARRAY_GENERIC_PTR (bexprs, k), pre_dfs);
+      if (redo_dominators)
+	{
+	  redo_dominators = false;
+
+	  free_dominance_info (pre_idom);
+	  free (pre_preorder);
+	  for (i = 0; i < currbbs; i++)
+	    BITMAP_XFREE (pre_dfs[i]);
+	  free (pre_dfs);
+	  splay_tree_delete (dfn);
+
+	  /* Recompute immediate dominators.  */
+	  pre_idom = calculate_dominance_info (CDI_DOMINATORS);
+	  fixup_domchildren (pre_idom);
+	  currbbs = n_basic_blocks;
+
+	  /* Reompute dominance frontiers.  */
+	  pre_dfs = (bitmap *) xmalloc (sizeof (bitmap) * currbbs);
+	  for (i = 0; i < currbbs; i++)
+	    pre_dfs[i] = BITMAP_XMALLOC ();
+	  compute_dominance_frontiers (pre_dfs, pre_idom);
+
+	  calculate_preorder ();
+	  dfn = splay_tree_new (splay_tree_compare_pointers, NULL, NULL);
+
+	  compute_dt_preorder ();
+
+	  /* Recompute immediate uses.  */
+	  compute_immediate_uses (TDFA_USE_OPS);
+	}
+    }
   for (k = 0; k < VARRAY_ACTIVE_SIZE (bexprs); k++)
     free_expr_info (VARRAY_GENERIC_PTR (bexprs, k));

@@ -3328,6 +3361,5 @@ tree_perform_ssapre (tree fndecl)
      BITMAP_XFREE (pre_dfs[i]);
   free (pre_dfs);
   splay_tree_delete (dfn);
-  sbitmap_vector_free (domchildren);
   timevar_pop (TV_TREE_PRE);
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]