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> 2005-10-19 Steven Bosscher <stevenb@suse.de>
PR c/23228 PR c/23228

View File

@ -1463,6 +1463,67 @@ construct_exit_block (void)
update_bb_for_insn (exit_block); 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 /* Translate the intermediate representation contained in the CFG
from GIMPLE trees to RTL. from GIMPLE trees to RTL.
@ -1484,6 +1545,9 @@ tree_expand_cfg (void)
/* Prepare the rtl middle end to start recording block changes. */ /* Prepare the rtl middle end to start recording block changes. */
reset_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 the variables recorded during gimple lowering. */
expand_used_vars (); 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 /* This function will rewrite the current program using the variable mapping
found in MAP. If the replacement vector VALUES is provided, any found in MAP. If the replacement vector VALUES is provided, any
occurrences of partitions with non-null entries in the vector will be 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. */ /* Flush out flow graph and SSA data. */
delete_var_map (map); delete_var_map (map);
/* Mark arrays indexed with non-constant indices with TREE_ADDRESSABLE. */
discover_nonconstant_array_refs ();
in_ssa_p = false; in_ssa_p = false;
} }