tree-sra.c (is_sra_candidate_ref): Remove second arg; all callers changed.

* tree-sra.c (is_sra_candidate_ref): Remove second arg; all callers
	changed.
	(is_sra_candidate_complex_ref): New function.
	(scalarize_modify_expr): Call it and check for LHS also.

From-SVN: r83784
This commit is contained in:
Richard Kenner 2004-06-28 12:12:51 +00:00 committed by Richard Kenner
parent 5f2dcbe1ff
commit 03797ac58c
2 changed files with 51 additions and 17 deletions

View File

@ -1,5 +1,10 @@
2004-06-28 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* tree-sra.c (is_sra_candidate_ref): Remove second arg; all callers
changed.
(is_sra_candidate_complex_ref): New function.
(scalarize_modify_expr): Call it and check for LHS also.
* tree-pretty-print.c (dump_function_declaration): New.
(dump_generic_node, case FUNCTION_TYPE): Call it.
(dump_generic_node, case RECORD_TYPE): Don't output dup semicolon.

View File

@ -160,21 +160,13 @@ is_sra_candidate_decl (tree decl)
}
/* Return true if EXP is of the form <ref decl>, where REF is one of the
field access references we handle and DECL is an SRA candidate.
Set ALLOW_BIT_FIELD_REF to accept BIT_FIELD_REF as well. This is
normally false, except when we're trying to work around it. */
field access references we handle and DECL is an SRA candidate. */
static bool
is_sra_candidate_ref (tree exp, bool allow_bit_field_ref)
is_sra_candidate_ref (tree exp)
{
switch (TREE_CODE (exp))
{
case BIT_FIELD_REF:
if (!allow_bit_field_ref)
break;
/* FALLTHRU */
case COMPONENT_REF:
case REALPART_EXPR:
case IMAGPART_EXPR:
@ -187,6 +179,28 @@ is_sra_candidate_ref (tree exp, bool allow_bit_field_ref)
return false;
}
/* Return true if EXP is of the form <ref decl>, where REF is a nest of
references handled by handle_components_p and DECL is an SRA candidate.
*VAR_P is set to DECL. */
static bool
is_sra_candidate_complex_ref (tree exp, tree *var_p)
{
tree orig_exp = exp;
while (TREE_CODE (exp) == REALPART_EXPR || TREE_CODE (exp) == IMAGPART_EXPR
|| handled_component_p (exp))
exp = TREE_OPERAND (exp, 0);
if (orig_exp != exp && is_sra_candidate_decl (exp))
{
*var_p = exp;
return true;
}
return false;
}
/* Return the scalar in SRA_MAP[VAR_IX][FIELD_IX]. If none exists, create
a new scalar with type TYPE. */
@ -916,9 +930,10 @@ scalarize_modify_expr (block_stmt_iterator *si_p)
tree stmt = bsi_stmt (*si_p);
tree lhs = TREE_OPERAND (stmt, 0);
tree rhs = TREE_OPERAND (stmt, 1);
tree var = NULL_TREE;
/* Found AGGREGATE.FIELD = ... */
if (is_sra_candidate_ref (lhs, false))
if (is_sra_candidate_ref (lhs))
{
tree sym;
v_may_def_optype v_may_defs;
@ -936,10 +951,12 @@ scalarize_modify_expr (block_stmt_iterator *si_p)
}
/* Found ... = AGGREGATE.FIELD */
else if (is_sra_candidate_ref (rhs, false))
else if (is_sra_candidate_ref (rhs))
scalarize_component_ref (stmt, &TREE_OPERAND (stmt, 1));
/* Found ... = BIT_FIELD_REF <>. This is similar to a CALL_EXPR, if the
/* Found a complex reference nesting involving a candidate decl. This
should only occur if the above condition is false if a BIT_FIELD_REF or
VIEW_CONVERT_EXPR is involved. This is similar to a CALL_EXPR, if the
operand of the BIT_FIELD_REF is a scalarizable structure, we need to
copy from its scalar replacements before doing the bitfield operation.
@ -951,10 +968,22 @@ scalarize_modify_expr (block_stmt_iterator *si_p)
generates a BIT_FIELD_REF operation for one of the comparisons,
preventing the optimizers from removing all the redundant
operations. */
else if (is_sra_candidate_ref (rhs, true))
else if (is_sra_candidate_complex_ref (rhs, &var))
{
tree var = TREE_OPERAND (rhs, 0);
emit_scalar_copies (si_p, var, var, FIELD_SCALAR);
/* If the LHS of the assignment is also a scalarizable structure, insert
copies into the scalar replacements after the call. */
if (is_sra_candidate_decl (lhs))
{
tree list = create_scalar_copies (lhs, lhs, SCALAR_FIELD);
if (EXPR_HAS_LOCATION (stmt))
annotate_all_with_locus (&list, EXPR_LOCATION (stmt));
if (stmt_ends_bb_p (stmt))
insert_edge_copies (list, bb_for_stmt (stmt));
else
bsi_insert_after (si_p, list, BSI_NEW_STMT);
}
}
/* Found AGGREGATE = ... or ... = AGGREGATE */
@ -983,7 +1012,7 @@ scalarize_tree_list (tree list, block_stmt_iterator *si_p, bitmap done)
bitmap_set_bit (done, index);
}
}
else if (is_sra_candidate_ref (arg, false))
else if (is_sra_candidate_ref (arg))
{
tree stmt = bsi_stmt (*si_p);
scalarize_component_ref (stmt, &TREE_VALUE (op));
@ -1071,7 +1100,7 @@ scalarize_return_expr (block_stmt_iterator *si_p)
emit_scalar_copies (si_p, rhs, rhs, FIELD_SCALAR);
/* Handle 'return STRUCTURE.FIELD;' */
else if (is_sra_candidate_ref (rhs, false))
else if (is_sra_candidate_ref (rhs))
scalarize_component_ref (stmt, rhs_p);
/* Handle 'return CALL_EXPR;' */