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]: Speed up SSAPRE and enable load PRE


This patch speeds up SSAPRE (particularly with checking, where some
testcases go from 123 seconds to 2.37 seconds), and enables load PRE.

Load PRE applies quite a bit. It doesn't handle component refs yet,
unfortunately.

bootstrapped and reg-tested on both i686-pc-linux-gnu, and ppc64-linux
2003-11-04  Daniel Berlin  <dberlin@dberlin.org>

	* tree-ssa-pre.c (count_stmts_in_bb): Removed.
	(set_var_phis): Only call bb_for_stmt once.
	(insert_one_operand): Remove endtree, endtreep, a lot of special handling
	no longer needed.  Remove insert_done.
	(collect_expressions): Enable INDIRECT_REF and SSA_NAME handling.

Index: tree-ssa-pre.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/Attic/tree-ssa-pre.c,v
retrieving revision 1.1.4.96
diff -u -3 -p -r1.1.4.96 tree-ssa-pre.c
--- tree-ssa-pre.c	4 Nov 2003 00:29:37 -0000	1.1.4.96
+++ tree-ssa-pre.c	4 Nov 2003 19:58:03 -0000
@@ -141,9 +141,6 @@ static void insert_occ_in_preorder_dt_or
 static void insert_euse_in_preorder_dt_order_1 (struct expr_info *,
 						basic_block);
 static void insert_euse_in_preorder_dt_order (struct expr_info *);
-#ifdef ENABLE_CHECKING
-static int count_stmts_in_bb (basic_block);
-#endif
 static bool ephi_has_unsafe_arg (tree);
 static void reset_down_safe (tree, int);
 static void compute_down_safety (struct expr_info *);
@@ -664,14 +661,15 @@ static bitmap varphis;
 static void
 set_var_phis (struct expr_info *ei, tree phi)
 {
+  basic_block bb = bb_for_stmt (phi);
   /* If we've already got an EPHI set to be placed in PHI's BB, we
      don't need to do this again. */
-  if (!bitmap_bit_p (varphis, bb_for_stmt (phi)->index)
-	&& !bitmap_bit_p (dfphis, bb_for_stmt (phi)->index))
+  if (!bitmap_bit_p (varphis, bb->index)
+	&& !bitmap_bit_p (dfphis, bb->index))
     {
       tree phi_operand;
       int curr_phi_operand;
-      bitmap_set_bit (varphis, bb_for_stmt (phi)->index);
+      bitmap_set_bit (varphis, bb->index);
       for (curr_phi_operand = 0;
            curr_phi_operand < PHI_NUM_ARGS (phi);
            curr_phi_operand++)
@@ -937,7 +935,7 @@ insert_occ_in_preorder_dt_order (struct
 	current = VARRAY_TREE (ei->occurs, i);
 	current = current ? current : VARRAY_TREE (ei->kills, i);
 	current = current ? current : VARRAY_TREE (ei->lefts, i);
-  block = bb_for_stmt (current);
+	block = bb_for_stmt (current);
 	if (VARRAY_TREE (ei->kills, i) != NULL)
 	  {
 	    tree killexpr  = VARRAY_TREE (ei->kills, i);
@@ -1335,10 +1333,10 @@ bool load_modified_real_occ_real_occ (tr
 static
 bool load_modified_phi_result (basic_block bb, tree cr)
 {
-  if (bb_for_stmt (SSA_NAME_DEF_STMT (cr)) != bb)
+  basic_block defbb = bb_for_stmt (SSA_NAME_DEF_STMT (cr));
+  if (defbb != bb)
     {
-      if (dominated_by_p (pre_idom, bb,
-			  bb_for_stmt (SSA_NAME_DEF_STMT (cr))))
+      if (dominated_by_p (pre_idom, bb, defbb))
 	return false;
     }
   else
@@ -1935,14 +1933,9 @@ insert_one_operand (struct expr_info *ei
   tree temp = ei->temp;
   tree copy;
   tree newtemp;
-  tree endtree;
-  tree *endtreep;
   basic_block bb = bb_for_stmt (x);
   edge e = NULL;
   block_stmt_iterator bsi;
-#ifdef ENABLE_CHECKING
-  bool insert_done = false;
-#endif

   /* Insert definition of expr at end of BB containing x. */
   copy = TREE_OPERAND (EREF_STMT (ephi), 1);
@@ -1964,27 +1957,6 @@ insert_one_operand (struct expr_info *ei
       fprintf (dump_file, " (on edge), because of EPHI");
       fprintf (dump_file, " in BB %d\n", bb_for_stmt (ephi)->index);
     }
-  /* Sigh. last_stmt and last_stmt_ptr use bsi_last,
-     which is broken in some cases.  Get the last
-     statement the hard way.  */
-  {
-    block_stmt_iterator bsi2;
-    block_stmt_iterator bsi3;
-    if (!bsi_end_p (bsi_start (bb)))
-      {
-	for (bsi2 = bsi3 = bsi_start (bb);
-	     !bsi_end_p (bsi2);
-	     bsi_next (&bsi2))
-	  bsi3 = bsi2;
-	endtree = bsi_stmt (bsi3);
-	endtreep = bsi_stmt_ptr (bsi3);
-      }
-    else
-      {
-	endtree = NULL_TREE;
-	endtreep = NULL;
-      }
-  }
   set_bb_for_stmt (expr, bb);

   /* Find the edge to insert on. */
@@ -1992,40 +1964,9 @@ insert_one_operand (struct expr_info *ei
   if (e == NULL)
     abort ();

-  /* Do the insertion.
-     If the block is empty, don't worry about updating
-     pointers, just insert before the beginning of the
-     successor block.
-     Otherwise, need to get a BSI in case
-     insert_on_edge_immediate does an insert before,
-     in which case we will  need to update pointers like
-     do_proper_save does.   */
+  /* Do the insertion.  */
   bsi = bsi_start (bb);
-  if (bsi_end_p (bsi_start (bb)))
-    {
-#ifdef ENABLE_CHECKING
-      insert_done = true;
-#endif
-      bsi_insert_on_edge_immediate (e, expr, NULL, NULL);
-    }
-  else
-    {
-      for (; !bsi_end_p (bsi); bsi_next (&bsi))
-	{
-	  if (bsi_stmt (bsi) == endtree)
-	    {
-#ifdef ENABLE_CHECKING
-	      insert_done = true;
-#endif
-	      bsi_insert_on_edge_immediate (e, expr, &bsi, NULL);
-	      break;
-	    }
-	}
-    }
-#ifdef ENABLE_CHECKING
-  if (!insert_done)
-    abort ();
-#endif
+  bsi_insert_on_edge_immediate (e, expr, NULL, NULL);

   EPHI_ARG_DEF (ephi, opnd_indx) = create_expr_ref (ei, ei->expr, EUSE_NODE,
 						    bb, 0);
@@ -2096,8 +2037,9 @@ finalize_1 (struct expr_info *ei)
       else
 	{
 	  edge succ;
+	  basic_block bb = bb_for_stmt (x);
 	  /* For each ephi in the successor blocks.  */
-	  for (succ = bb_for_stmt (x)->succ; succ; succ = succ->succ_next)
+	  for (succ = bb->succ; succ; succ = succ->succ_next)
 	    {
 	      tree ephi = ephi_at_block (succ->dest);
 	      if (ephi == NULL_TREE)
@@ -2529,28 +2471,6 @@ calculate_increment (struct expr_info *e
 #endif


-#ifdef ENABLE_CHECKING
-static int
-count_stmts_in_bb (basic_block bb)
-{
-  block_stmt_iterator bsi;
-  int num_stmt1 = 0;
-  int num_stmt2 = 0;
-
-  bsi = bsi_start (bb);
-  for (; !bsi_end_p (bsi); bsi_next  (&bsi))
-    num_stmt1++;
-
-  bsi = bsi_last (bb);
-  for (; !bsi_end_p (bsi); bsi_prev  (&bsi))
-    num_stmt2++;
-
-  /* Reverse iterators are broken, so don't abort for now.
-     if (num_stmt1 != num_stmt2)
-     abort ();  */
-  return num_stmt1;
-}
-#endif
 /* Perform an insertion of EXPR before/after USE, depending on the
    value of BEFORE.  */

@@ -2633,9 +2553,6 @@ code_motion (struct expr_info *ei)
   tree use;
   tree newtemp;
   size_t euse_iter;
-#ifdef ENABLE_CHECKING
-  int before, after;
-#endif
   tree temp = ei->temp;
   bb_ann_t ann;
   basic_block bb;
@@ -2686,6 +2603,7 @@ code_motion (struct expr_info *ei)
 	  tree newexpr;
 	  tree use_stmt;
 	  tree copy;
+	  basic_block usebb = bb_for_stmt (use);
 	  use_stmt = EREF_STMT (use);

 	  copy = TREE_OPERAND (use_stmt, 1);
@@ -2699,7 +2617,7 @@ code_motion (struct expr_info *ei)
 	  if (dump_file)
 	    {
 	      fprintf (dump_file, "In BB %d, insert save of ",
-		       bb_for_stmt (use)->index);
+		       usebb->index);
 	      print_generic_expr (dump_file, copy, 0);
 	      fprintf (dump_file, " to ");
 	      print_generic_expr (dump_file, newtemp, 0);
@@ -2712,16 +2630,8 @@ code_motion (struct expr_info *ei)
 	    }
 	  modify_stmt (newexpr);
 	  modify_stmt (use_stmt);
-	  set_bb_for_stmt (newexpr, bb_for_stmt (use));
-#ifdef ENABLE_CHECKING
-	  before = count_stmts_in_bb (bb_for_stmt (use));
-#endif
+	  set_bb_for_stmt (newexpr, usebb);
 	  EREF_STMT (use) = do_proper_save (use_stmt, newexpr, true);
-#ifdef ENABLE_CHECKING
-	  after = count_stmts_in_bb (bb_for_stmt (use));
-	  if (before + 1 != after)
-	    abort ();
-#endif
 	  pre_stats.saves++;
 	}
       else if (EREF_RELOAD (use))
@@ -3186,8 +3096,8 @@ collect_expressions (basic_block block,
       if ((TREE_CODE_CLASS (TREE_CODE (expr)) == '2'
 	   || TREE_CODE_CLASS (TREE_CODE (expr)) == '<'
 	   /*|| TREE_CODE_CLASS (TREE_CODE (expr)) == '1'*/
-/*	   || TREE_CODE (expr) == SSA_NAME
-	   || TREE_CODE (expr) == INDIRECT_REF*/)
+	   || TREE_CODE (expr) == SSA_NAME
+	   || TREE_CODE (expr) == INDIRECT_REF)
 	  && !ann->makes_aliased_stores
 	  && !ann->has_volatile_ops)
 	{


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