From: Seongbae Park Date: Wed, 28 May 2008 20:15:10 +0000 (+0000) Subject: tree-ssa-propagate.c (set_rhs): Preserve the histogram and the eh region information. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=b608a1bc71edb6b778407dd9bfdf0cbd6bcb4c1b;p=gcc.git tree-ssa-propagate.c (set_rhs): Preserve the histogram and the eh region information. 2008-05-28 Seongbae Park * 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5ffb956056b..406a0839a10 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2008-05-28 Seongbae Park + + * 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 * config/pa/pa.md: Remove extern frame_pointer_needed declaration. 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)) diff --git a/gcc/value-prof.c b/gcc/value-prof.c index 8b0087a850f..61b0a0773a2 100644 --- a/gcc/value-prof.c +++ b/gcc/value-prof.c @@ -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 diff --git a/gcc/value-prof.h b/gcc/value-prof.h index a01919bb3f9..2ab9df1cb53 100644 --- a/gcc/value-prof.h +++ b/gcc/value-prof.h @@ -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 *);