mirror of
git://gcc.gnu.org/git/gcc.git
synced 2024-12-28 15:15:19 +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>
|
2005-10-19 Steven Bosscher <stevenb@suse.de>
|
||||||
|
|
||||||
PR c/23228
|
PR c/23228
|
||||||
|
@ -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 ();
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user