summaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-propagate.c
diff options
context:
space:
mode:
authorspark <spark@138bc75d-0d04-0410-961f-82ee72b054a4>2008-05-28 20:15:10 +0000
committerspark <spark@138bc75d-0d04-0410-961f-82ee72b054a4>2008-05-28 20:15:10 +0000
commit69eee21db577b8a270fae4da3cc5f8686ca93057 (patch)
treeeec1f0a98236b0cc50a93f03ae95201e815b992a /gcc/tree-ssa-propagate.c
parente8a6d961f10be0350c17bfc3cd7e843c6d444812 (diff)
downloadgcc-69eee21db577b8a270fae4da3cc5f8686ca93057.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@136124 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/tree-ssa-propagate.c')
-rw-r--r--gcc/tree-ssa-propagate.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/gcc/tree-ssa-propagate.c b/gcc/tree-ssa-propagate.c
index ae7fe848213..b0371805568 100644
--- a/gcc/tree-ssa-propagate.c
+++ b/gcc/tree-ssa-propagate.c
@@ -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))