tree-ssa-propagate.c (set_rhs): Preserve the histogram and the eh region information.

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
This commit is contained in:
Seongbae Park 2008-05-28 20:15:10 +00:00 committed by Seongbae Park
parent 77da4248a9
commit b608a1bc71
4 changed files with 46 additions and 4 deletions

View 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.

View 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))

View 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

View 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 *);