mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-28 15:05:30 +08:00
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:
parent
f95f80d1a7
commit
a1b23b2f7c
@ -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
|
||||
|
@ -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 ();
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user