tree-ssa-propagate.c (set_rhs): Preserve the histogram and the eh region information.
authorSeongbae Park <seongbae.park@gmail.com>
Wed, 28 May 2008 20:15:10 +0000 (20:15 +0000)
committerSeongbae Park <spark@gcc.gnu.org>
Wed, 28 May 2008 20:15:10 +0000 (20:15 +0000)
2008-05-28  Seongbae Park  <seongbae.park@gmail.com>

* tree-ssa-propagate.c (set_rhs): Preserve the histogram
and the eh region information.
* value-prof.c (gimple_move_stmt_histograms): New function.
* value-prof.h (gimple_move_stmt_histograms): New function declaration.

From-SVN: r136124

gcc/ChangeLog
gcc/tree-ssa-propagate.c
gcc/value-prof.c
gcc/value-prof.h

index 5ffb956056b97c9a0fdc83df11e9ac5762111abd..406a0839a10a42a34c87912cc54094bf88417b8b 100644 (file)
@@ -1,3 +1,10 @@
+2008-05-28  Seongbae Park  <seongbae.park@gmail.com>
+
+       * tree-ssa-propagate.c (set_rhs): Preserve the histogram
+       and the eh region information.
+       * value-prof.c (gimple_move_stmt_histograms): New function.
+       * value-prof.h (gimple_move_stmt_histograms): New function declaration.
+
 2008-05-28  Andreas Tobler  <a.tobler@schweiz.org>
 
        * config/pa/pa.md: Remove extern frame_pointer_needed declaration.
index ae7fe84821398b85f9026b7be26faa6633180232..b037180556822ec60a3b127f6fe25b8086e139ac 100644 (file)
@@ -40,6 +40,7 @@
 #include "langhooks.h"
 #include "varray.h"
 #include "vec.h"
+#include "value-prof.h"
 
 /* This file implements a generic value propagation engine based on
    the same propagation used by the SSA-CCP algorithm [1].
@@ -680,9 +681,10 @@ bool
 set_rhs (tree *stmt_p, tree expr)
 {
   tree stmt = *stmt_p, op;
-  stmt_ann_t ann;
+  tree new_stmt;
   tree var;
   ssa_op_iter iter;
+  int eh_region;
 
   if (!valid_gimple_expression_p (expr))
     return false;
@@ -733,9 +735,22 @@ set_rhs (tree *stmt_p, tree expr)
     default:
       /* Replace the whole statement with EXPR.  If EXPR has no side
         effects, then replace *STMT_P with an empty statement.  */
-      ann = stmt_ann (stmt);
-      *stmt_p = TREE_SIDE_EFFECTS (expr) ? expr : build_empty_stmt ();
-      (*stmt_p)->base.ann = (tree_ann_t) ann;
+      new_stmt = TREE_SIDE_EFFECTS (expr) ? expr : build_empty_stmt ();
+      *stmt_p = new_stmt;
+
+      /* Preserve the annotation, the histograms and the EH region information
+         associated with the original statement. The EH information
+        needs to be preserved only if the new statement still can throw.  */
+      new_stmt->base.ann = (tree_ann_t) stmt_ann (stmt);
+      gimple_move_stmt_histograms (cfun, new_stmt, stmt);
+      if (tree_could_throw_p (new_stmt))
+       {
+         eh_region = lookup_stmt_eh_region (stmt);
+         /* We couldn't possibly turn a nothrow into a throw statement.  */
+         gcc_assert (eh_region >= 0);
+         remove_stmt_from_eh_region (stmt);
+         add_stmt_to_eh_region (new_stmt, eh_region);
+       }
 
       if (gimple_in_ssa_p (cfun)
          && TREE_SIDE_EFFECTS (expr))
index 8b0087a850f8fe593a197d56c4b75998c84c4d0b..61b0a0773a2d3691850d3f82cc6cfad2f58f74ae 100644 (file)
@@ -336,6 +336,25 @@ gimple_duplicate_stmt_histograms (struct function *fun, tree stmt,
     }
 }
 
+
+/* Move all histograms associated with OSTMT to STMT.  */
+
+void
+gimple_move_stmt_histograms (struct function *fun, tree stmt, tree ostmt)
+{
+  histogram_value val = gimple_histogram_value (fun, ostmt);
+  if (val)
+    {
+      /* The following three statements can't be reordered,
+         because histogram hashtab relies on stmt field value
+        for finding the exact slot. */
+      set_histogram_value (fun, ostmt, NULL);
+      for (; val != NULL; val = val->hvalue.next)
+       val->hvalue.stmt = stmt;
+      set_histogram_value (fun, stmt, val);
+    }
+}
+
 static bool error_found = false;
 
 /* Helper function for verify_histograms.  For each histogram reachable via htab
index a01919bb3f941e99a41f9aa385006b334685436e..2ab9df1cb53e4fac0fe779c0bd0ecad6687f323e 100644 (file)
@@ -116,6 +116,7 @@ void dump_histograms_for_stmt (struct function *, FILE *, tree);
 void gimple_remove_histogram_value (struct function *, tree, histogram_value);
 void gimple_remove_stmt_histograms (struct function *, tree);
 void gimple_duplicate_stmt_histograms (struct function *, tree, struct function *, tree);
+void gimple_move_stmt_histograms (struct function *, tree, tree);
 void verify_histograms (void);
 void free_histograms (void);
 void stringop_block_profile (tree, unsigned int *, HOST_WIDE_INT *);