tree-flow.h (insert_edge_copies_seq): Undeclare.
2009-05-20 Martin Jambor <mjambor@suse.cz> * tree-flow.h (insert_edge_copies_seq): Undeclare. (sra_insert_before): Likewise. (sra_insert_after): Likewise. (sra_init_cache): Likewise. (sra_type_can_be_decomposed_p): Likewise. * tree-mudflap.c (insert_edge_copies_seq): Copied here from tree-sra.c * tree-sra.c (sra_type_can_be_decomposed_p): Made static. (sra_insert_before): Likewise. (sra_insert_after): Likewise. (sra_init_cache): Likewise. (insert_edge_copies_seq): Made static and moved upwards. * tree-complex.c (extract_component): Added VIEW_CONVERT_EXPR switch case. * tree-flow-inline.h (contains_view_convert_expr_p): New function. * ipa-prop.c (get_ssa_def_if_simple_copy): New function. (determine_cst_member_ptr): Call get_ssa_def_if_simple_copy to skip simple copies. From-SVN: r147733
This commit is contained in:
parent
3f6f0eb2e4
commit
7ec492570b
|
@ -1,3 +1,26 @@
|
||||||
|
2009-05-20 Martin Jambor <mjambor@suse.cz>
|
||||||
|
|
||||||
|
* tree-flow.h (insert_edge_copies_seq): Undeclare.
|
||||||
|
(sra_insert_before): Likewise.
|
||||||
|
(sra_insert_after): Likewise.
|
||||||
|
(sra_init_cache): Likewise.
|
||||||
|
(sra_type_can_be_decomposed_p): Likewise.
|
||||||
|
* tree-mudflap.c (insert_edge_copies_seq): Copied here from tree-sra.c
|
||||||
|
* tree-sra.c (sra_type_can_be_decomposed_p): Made static.
|
||||||
|
(sra_insert_before): Likewise.
|
||||||
|
(sra_insert_after): Likewise.
|
||||||
|
(sra_init_cache): Likewise.
|
||||||
|
(insert_edge_copies_seq): Made static and moved upwards.
|
||||||
|
|
||||||
|
* tree-complex.c (extract_component): Added VIEW_CONVERT_EXPR switch
|
||||||
|
case.
|
||||||
|
|
||||||
|
* tree-flow-inline.h (contains_view_convert_expr_p): New function.
|
||||||
|
|
||||||
|
* ipa-prop.c (get_ssa_def_if_simple_copy): New function.
|
||||||
|
(determine_cst_member_ptr): Call get_ssa_def_if_simple_copy to skip
|
||||||
|
simple copies.
|
||||||
|
|
||||||
2009-05-20 Richard Guenther <rguenther@suse.de>
|
2009-05-20 Richard Guenther <rguenther@suse.de>
|
||||||
|
|
||||||
* expr.c (expand_expr_real_1): Avoid calling do_store_flag
|
* expr.c (expand_expr_real_1): Avoid calling do_store_flag
|
||||||
|
|
|
@ -428,6 +428,22 @@ fill_member_ptr_cst_jump_function (struct ipa_jump_func *jfunc,
|
||||||
jfunc->value.member_cst.delta = delta;
|
jfunc->value.member_cst.delta = delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If RHS is an SSA_NAMe and it is defined by a simple copy assign statement,
|
||||||
|
return the rhs of its defining statement. */
|
||||||
|
|
||||||
|
static inline tree
|
||||||
|
get_ssa_def_if_simple_copy (tree rhs)
|
||||||
|
{
|
||||||
|
while (TREE_CODE (rhs) == SSA_NAME && !SSA_NAME_IS_DEFAULT_DEF (rhs))
|
||||||
|
{
|
||||||
|
gimple def_stmt = SSA_NAME_DEF_STMT (rhs);
|
||||||
|
|
||||||
|
if (gimple_assign_single_p (def_stmt))
|
||||||
|
rhs = gimple_assign_rhs1 (def_stmt);
|
||||||
|
}
|
||||||
|
return rhs;
|
||||||
|
}
|
||||||
|
|
||||||
/* Traverse statements from CALL backwards, scanning whether the argument ARG
|
/* Traverse statements from CALL backwards, scanning whether the argument ARG
|
||||||
which is a member pointer is filled in with constant values. If it is, fill
|
which is a member pointer is filled in with constant values. If it is, fill
|
||||||
the jump function JFUNC in appropriately. METHOD_FIELD and DELTA_FIELD are
|
the jump function JFUNC in appropriately. METHOD_FIELD and DELTA_FIELD are
|
||||||
|
@ -467,6 +483,7 @@ determine_cst_member_ptr (gimple call, tree arg, tree method_field,
|
||||||
fld = TREE_OPERAND (lhs, 1);
|
fld = TREE_OPERAND (lhs, 1);
|
||||||
if (!method && fld == method_field)
|
if (!method && fld == method_field)
|
||||||
{
|
{
|
||||||
|
rhs = get_ssa_def_if_simple_copy (rhs);
|
||||||
if (TREE_CODE (rhs) == ADDR_EXPR
|
if (TREE_CODE (rhs) == ADDR_EXPR
|
||||||
&& TREE_CODE (TREE_OPERAND (rhs, 0)) == FUNCTION_DECL
|
&& TREE_CODE (TREE_OPERAND (rhs, 0)) == FUNCTION_DECL
|
||||||
&& TREE_CODE (TREE_TYPE (TREE_OPERAND (rhs, 0))) == METHOD_TYPE)
|
&& TREE_CODE (TREE_TYPE (TREE_OPERAND (rhs, 0))) == METHOD_TYPE)
|
||||||
|
@ -484,6 +501,7 @@ determine_cst_member_ptr (gimple call, tree arg, tree method_field,
|
||||||
|
|
||||||
if (!delta && fld == delta_field)
|
if (!delta && fld == delta_field)
|
||||||
{
|
{
|
||||||
|
rhs = get_ssa_def_if_simple_copy (rhs);
|
||||||
if (TREE_CODE (rhs) == INTEGER_CST)
|
if (TREE_CODE (rhs) == INTEGER_CST)
|
||||||
{
|
{
|
||||||
delta = rhs;
|
delta = rhs;
|
||||||
|
|
|
@ -604,6 +604,7 @@ extract_component (gimple_stmt_iterator *gsi, tree t, bool imagpart_p,
|
||||||
case INDIRECT_REF:
|
case INDIRECT_REF:
|
||||||
case COMPONENT_REF:
|
case COMPONENT_REF:
|
||||||
case ARRAY_REF:
|
case ARRAY_REF:
|
||||||
|
case VIEW_CONVERT_EXPR:
|
||||||
{
|
{
|
||||||
tree inner_type = TREE_TYPE (TREE_TYPE (t));
|
tree inner_type = TREE_TYPE (TREE_TYPE (t));
|
||||||
|
|
||||||
|
|
|
@ -1136,6 +1136,21 @@ ref_contains_array_ref (const_tree ref)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return true if REF has an VIEW_CONVERT_EXPR somewhere in it. */
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
contains_view_convert_expr_p (const_tree ref)
|
||||||
|
{
|
||||||
|
while (handled_component_p (ref))
|
||||||
|
{
|
||||||
|
if (TREE_CODE (ref) == VIEW_CONVERT_EXPR)
|
||||||
|
return true;
|
||||||
|
ref = TREE_OPERAND (ref, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/* Return true, if the two ranges [POS1, SIZE1] and [POS2, SIZE2]
|
/* Return true, if the two ranges [POS1, SIZE1] and [POS2, SIZE2]
|
||||||
overlap. SIZE1 and/or SIZE2 can be (unsigned)-1 in which case the
|
overlap. SIZE1 and/or SIZE2 can be (unsigned)-1 in which case the
|
||||||
range is open-ended. Otherwise return false. */
|
range is open-ended. Otherwise return false. */
|
||||||
|
|
|
@ -881,13 +881,6 @@ tree vn_lookup_with_vuses (tree, VEC (tree, gc) *);
|
||||||
/* In tree-ssa-sink.c */
|
/* In tree-ssa-sink.c */
|
||||||
bool is_hidden_global_store (gimple);
|
bool is_hidden_global_store (gimple);
|
||||||
|
|
||||||
/* In tree-sra.c */
|
|
||||||
void insert_edge_copies_seq (gimple_seq, basic_block);
|
|
||||||
void sra_insert_before (gimple_stmt_iterator *, gimple_seq);
|
|
||||||
void sra_insert_after (gimple_stmt_iterator *, gimple_seq);
|
|
||||||
void sra_init_cache (void);
|
|
||||||
bool sra_type_can_be_decomposed_p (tree);
|
|
||||||
|
|
||||||
/* In tree-loop-linear.c */
|
/* In tree-loop-linear.c */
|
||||||
extern void linear_transform_loops (void);
|
extern void linear_transform_loops (void);
|
||||||
extern unsigned perfect_loop_nest_depth (struct loop *);
|
extern unsigned perfect_loop_nest_depth (struct loop *);
|
||||||
|
|
|
@ -447,6 +447,26 @@ execute_mudflap_function_ops (void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Insert a gimple_seq SEQ on all the outgoing edges out of BB. Note that
|
||||||
|
if BB has more than one edge, STMT will be replicated for each edge.
|
||||||
|
Also, abnormal edges will be ignored. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
insert_edge_copies_seq (gimple_seq seq, basic_block bb)
|
||||||
|
{
|
||||||
|
edge e;
|
||||||
|
edge_iterator ei;
|
||||||
|
unsigned n_copies = -1;
|
||||||
|
|
||||||
|
FOR_EACH_EDGE (e, ei, bb->succs)
|
||||||
|
if (!(e->flags & EDGE_ABNORMAL))
|
||||||
|
n_copies++;
|
||||||
|
|
||||||
|
FOR_EACH_EDGE (e, ei, bb->succs)
|
||||||
|
if (!(e->flags & EDGE_ABNORMAL))
|
||||||
|
gsi_insert_seq_on_edge (e, n_copies-- > 0 ? gimple_seq_copy (seq) : seq);
|
||||||
|
}
|
||||||
|
|
||||||
/* Create and initialize local shadow variables for the lookup cache
|
/* Create and initialize local shadow variables for the lookup cache
|
||||||
globals. Put their decls in the *_l globals for use by
|
globals. Put their decls in the *_l globals for use by
|
||||||
mf_build_check_statement_for. */
|
mf_build_check_statement_for. */
|
||||||
|
|
|
@ -236,7 +236,7 @@ is_sra_scalar_type (tree type)
|
||||||
instantiated, just that if we decide to break up the type into
|
instantiated, just that if we decide to break up the type into
|
||||||
separate pieces that it can be done. */
|
separate pieces that it can be done. */
|
||||||
|
|
||||||
bool
|
static bool
|
||||||
sra_type_can_be_decomposed_p (tree type)
|
sra_type_can_be_decomposed_p (tree type)
|
||||||
{
|
{
|
||||||
unsigned int cache = TYPE_UID (TYPE_MAIN_VARIANT (type)) * 2;
|
unsigned int cache = TYPE_UID (TYPE_MAIN_VARIANT (type)) * 2;
|
||||||
|
@ -1267,6 +1267,26 @@ build_element_name (struct sra_elt *elt)
|
||||||
return XOBFINISH (&sra_obstack, char *);
|
return XOBFINISH (&sra_obstack, char *);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Insert a gimple_seq SEQ on all the outgoing edges out of BB. Note that
|
||||||
|
if BB has more than one edge, STMT will be replicated for each edge.
|
||||||
|
Also, abnormal edges will be ignored. */
|
||||||
|
|
||||||
|
static void
|
||||||
|
insert_edge_copies_seq (gimple_seq seq, basic_block bb)
|
||||||
|
{
|
||||||
|
edge e;
|
||||||
|
edge_iterator ei;
|
||||||
|
unsigned n_copies = -1;
|
||||||
|
|
||||||
|
FOR_EACH_EDGE (e, ei, bb->succs)
|
||||||
|
if (!(e->flags & EDGE_ABNORMAL))
|
||||||
|
n_copies++;
|
||||||
|
|
||||||
|
FOR_EACH_EDGE (e, ei, bb->succs)
|
||||||
|
if (!(e->flags & EDGE_ABNORMAL))
|
||||||
|
gsi_insert_seq_on_edge (e, n_copies-- > 0 ? gimple_seq_copy (seq) : seq);
|
||||||
|
}
|
||||||
|
|
||||||
/* Instantiate an element as an independent variable. */
|
/* Instantiate an element as an independent variable. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -2789,29 +2809,9 @@ generate_element_init (struct sra_elt *elt, tree init, gimple_seq *seq_p)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Insert a gimple_seq SEQ on all the outgoing edges out of BB. Note that
|
|
||||||
if BB has more than one edge, STMT will be replicated for each edge.
|
|
||||||
Also, abnormal edges will be ignored. */
|
|
||||||
|
|
||||||
void
|
|
||||||
insert_edge_copies_seq (gimple_seq seq, basic_block bb)
|
|
||||||
{
|
|
||||||
edge e;
|
|
||||||
edge_iterator ei;
|
|
||||||
unsigned n_copies = -1;
|
|
||||||
|
|
||||||
FOR_EACH_EDGE (e, ei, bb->succs)
|
|
||||||
if (!(e->flags & EDGE_ABNORMAL))
|
|
||||||
n_copies++;
|
|
||||||
|
|
||||||
FOR_EACH_EDGE (e, ei, bb->succs)
|
|
||||||
if (!(e->flags & EDGE_ABNORMAL))
|
|
||||||
gsi_insert_seq_on_edge (e, n_copies-- > 0 ? gimple_seq_copy (seq) : seq);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Helper function to insert LIST before GSI, and set up line number info. */
|
/* Helper function to insert LIST before GSI, and set up line number info. */
|
||||||
|
|
||||||
void
|
static void
|
||||||
sra_insert_before (gimple_stmt_iterator *gsi, gimple_seq seq)
|
sra_insert_before (gimple_stmt_iterator *gsi, gimple_seq seq)
|
||||||
{
|
{
|
||||||
gimple stmt = gsi_stmt (*gsi);
|
gimple stmt = gsi_stmt (*gsi);
|
||||||
|
@ -2823,7 +2823,7 @@ sra_insert_before (gimple_stmt_iterator *gsi, gimple_seq seq)
|
||||||
|
|
||||||
/* Similarly, but insert after GSI. Handles insertion onto edges as well. */
|
/* Similarly, but insert after GSI. Handles insertion onto edges as well. */
|
||||||
|
|
||||||
void
|
static void
|
||||||
sra_insert_after (gimple_stmt_iterator *gsi, gimple_seq seq)
|
sra_insert_after (gimple_stmt_iterator *gsi, gimple_seq seq)
|
||||||
{
|
{
|
||||||
gimple stmt = gsi_stmt (*gsi);
|
gimple stmt = gsi_stmt (*gsi);
|
||||||
|
@ -3601,7 +3601,7 @@ debug_sra_elt_name (struct sra_elt *elt)
|
||||||
fputc ('\n', stderr);
|
fputc ('\n', stderr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
static void
|
||||||
sra_init_cache (void)
|
sra_init_cache (void)
|
||||||
{
|
{
|
||||||
if (sra_type_decomp_cache)
|
if (sra_type_decomp_cache)
|
||||||
|
|
Loading…
Reference in New Issue