cfgexpand.c (discover_nonconstant_array_refs_r, [...]): Move here from tree-outof-ssa.c

* cfgexpand.c (discover_nonconstant_array_refs_r,
	discover_nonconstant_array_refs): Move here from tree-outof-ssa.c
	(tree_expand_cfg): Call discover_nonconstant_array_refs.
	* tree-outof-ssa.c (rewrite_out_of_ssa): Remove call to
	discover_nonconstant_array_refs.

From-SVN: r105623
This commit is contained in:
Ulrich Weigand 2005-10-19 16:27:10 +00:00 committed by Ulrich Weigand
parent f95f80d1a7
commit a1b23b2f7c
3 changed files with 72 additions and 66 deletions

View File

@ -1,3 +1,11 @@
2005-10-19 Ulrich Weigand <Ulrich.Weigand@de.ibm.com>
* cfgexpand.c (discover_nonconstant_array_refs_r,
discover_nonconstant_array_refs): Move here from tree-outof-ssa.c
(tree_expand_cfg): Call discover_nonconstant_array_refs.
* tree-outof-ssa.c (rewrite_out_of_ssa): Remove call to
discover_nonconstant_array_refs.
2005-10-19 Steven Bosscher <stevenb@suse.de>
PR c/23228

View File

@ -1463,6 +1463,67 @@ construct_exit_block (void)
update_bb_for_insn (exit_block);
}
/* Helper function for discover_nonconstant_array_refs.
Look for ARRAY_REF nodes with non-constant indexes and mark them
addressable. */
static tree
discover_nonconstant_array_refs_r (tree * tp, int *walk_subtrees,
void *data ATTRIBUTE_UNUSED)
{
tree t = *tp;
if (IS_TYPE_OR_DECL_P (t))
*walk_subtrees = 0;
else if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
{
while (((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
&& is_gimple_min_invariant (TREE_OPERAND (t, 1))
&& (!TREE_OPERAND (t, 2)
|| is_gimple_min_invariant (TREE_OPERAND (t, 2))))
|| (TREE_CODE (t) == COMPONENT_REF
&& (!TREE_OPERAND (t,2)
|| is_gimple_min_invariant (TREE_OPERAND (t, 2))))
|| TREE_CODE (t) == BIT_FIELD_REF
|| TREE_CODE (t) == REALPART_EXPR
|| TREE_CODE (t) == IMAGPART_EXPR
|| TREE_CODE (t) == VIEW_CONVERT_EXPR
|| TREE_CODE (t) == NOP_EXPR
|| TREE_CODE (t) == CONVERT_EXPR)
t = TREE_OPERAND (t, 0);
if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
{
t = get_base_address (t);
if (t && DECL_P (t))
TREE_ADDRESSABLE (t) = 1;
}
*walk_subtrees = 0;
}
return NULL_TREE;
}
/* RTL expansion is not able to compile array references with variable
offsets for arrays stored in single register. Discover such
expressions and mark variables as addressable to avoid this
scenario. */
static void
discover_nonconstant_array_refs (void)
{
basic_block bb;
block_stmt_iterator bsi;
FOR_EACH_BB (bb)
{
for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
walk_tree (bsi_stmt_ptr (bsi), discover_nonconstant_array_refs_r,
NULL , NULL);
}
}
/* Translate the intermediate representation contained in the CFG
from GIMPLE trees to RTL.
@ -1484,6 +1545,9 @@ tree_expand_cfg (void)
/* Prepare the rtl middle end to start recording block changes. */
reset_block_changes ();
/* Mark arrays indexed with non-constant indices with TREE_ADDRESSABLE. */
discover_nonconstant_array_refs ();
/* Expand the variables recorded during gimple lowering. */
expand_used_vars ();

View File

@ -1826,69 +1826,6 @@ dump_replaceable_exprs (FILE *f, tree *expr)
}
/* Helper function for discover_nonconstant_array_refs.
Look for ARRAY_REF nodes with non-constant indexes and mark them
addressable. */
static tree
discover_nonconstant_array_refs_r (tree * tp, int *walk_subtrees,
void *data ATTRIBUTE_UNUSED)
{
tree t = *tp;
if (IS_TYPE_OR_DECL_P (t))
*walk_subtrees = 0;
else if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
{
while (((TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
&& is_gimple_min_invariant (TREE_OPERAND (t, 1))
&& (!TREE_OPERAND (t, 2)
|| is_gimple_min_invariant (TREE_OPERAND (t, 2))))
|| (TREE_CODE (t) == COMPONENT_REF
&& (!TREE_OPERAND (t,2)
|| is_gimple_min_invariant (TREE_OPERAND (t, 2))))
|| TREE_CODE (t) == BIT_FIELD_REF
|| TREE_CODE (t) == REALPART_EXPR
|| TREE_CODE (t) == IMAGPART_EXPR
|| TREE_CODE (t) == VIEW_CONVERT_EXPR
|| TREE_CODE (t) == NOP_EXPR
|| TREE_CODE (t) == CONVERT_EXPR)
t = TREE_OPERAND (t, 0);
if (TREE_CODE (t) == ARRAY_REF || TREE_CODE (t) == ARRAY_RANGE_REF)
{
t = get_base_address (t);
if (t && DECL_P (t))
TREE_ADDRESSABLE (t) = 1;
}
*walk_subtrees = 0;
}
return NULL_TREE;
}
/* RTL expansion is not able to compile array references with variable
offsets for arrays stored in single register. Discover such
expressions and mark variables as addressable to avoid this
scenario. */
static void
discover_nonconstant_array_refs (void)
{
basic_block bb;
block_stmt_iterator bsi;
FOR_EACH_BB (bb)
{
for (bsi = bsi_start (bb); !bsi_end_p (bsi); bsi_next (&bsi))
walk_tree (bsi_stmt_ptr (bsi), discover_nonconstant_array_refs_r,
NULL , NULL);
}
}
/* This function will rewrite the current program using the variable mapping
found in MAP. If the replacement vector VALUES is provided, any
occurrences of partitions with non-null entries in the vector will be
@ -2598,9 +2535,6 @@ rewrite_out_of_ssa (void)
/* Flush out flow graph and SSA data. */
delete_var_map (map);
/* Mark arrays indexed with non-constant indices with TREE_ADDRESSABLE. */
discover_nonconstant_array_refs ();
in_ssa_p = false;
}