This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Fix PR 18712
- From: Diego Novillo <dnovillo at redhat dot com>
- To: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Date: Mon, 29 Nov 2004 15:12:49 -0500
- Subject: Fix PR 18712
- Organization: Red Hat Canada
I should have been more careful when I converted varrays to VEC in tree-into-ssa.c.
The stack of blocks may need more slots than the size of the CFG. If
every basic block has a definition for a variable, we will temporarily
need more space because we have the same block multiple times in the
work stack.
I tried other ways of preventing adding duplicate blocks, but I was
getting slower compile times. It's safer to just use VEC_safe_push.
Bootstrapped and tested x86, x86-64 and ppc.
Diego.
PR tree-optimization/18712
* tree-into-ssa.c (insert_phi_nodes_for): Pass argument
WORK_STACK by reference.
Call VEC_safe_push instead of VEC_quick_push.
Update all users.
testsuite/ChangeLog:
* gcc.c-torture/compile/pr18712.c: New test.
Index: tree-into-ssa.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-into-ssa.c,v
retrieving revision 2.33
diff -d -c -p -u -r2.33 tree-into-ssa.c
--- tree-into-ssa.c 25 Nov 2004 22:31:08 -0000 2.33
+++ tree-into-ssa.c 29 Nov 2004 18:27:47 -0000
@@ -156,7 +156,7 @@ static void insert_phi_nodes (bitmap *,
static void rewrite_stmt (struct dom_walk_data *, basic_block,
block_stmt_iterator);
static inline void rewrite_operand (use_operand_p);
-static void insert_phi_nodes_for (tree, bitmap *, VEC(basic_block) *);
+static void insert_phi_nodes_for (tree, bitmap *, VEC(basic_block) **);
static tree get_reaching_def (tree);
static hashval_t def_blocks_hash (const void *);
static int def_blocks_eq (const void *, const void *);
@@ -588,8 +588,8 @@ prepare_def_operand_for_rename (tree def
WORK_STACK is the vector used to implement the worklist of basic
blocks. */
-static inline
-void insert_phi_nodes_1 (tree var, bitmap *dfs, VEC(basic_block) *work_stack)
+static inline void
+insert_phi_nodes_1 (tree var, bitmap *dfs, VEC(basic_block) **work_stack)
{
if (get_phi_state (var) != NEED_PHI_STATE_NO)
insert_phi_nodes_for (var, dfs, work_stack);
@@ -614,7 +614,7 @@ insert_phi_nodes (bitmap *dfs, bitmap na
/* Vector WORK_STACK is a stack of CFG blocks. Each block that contains
an assignment or PHI node will be pushed to this stack. */
- work_stack = VEC_alloc (basic_block, last_basic_block);
+ work_stack = VEC_alloc (basic_block, n_basic_blocks);
/* Iterate over all variables in VARS_TO_RENAME. For each variable, add
to the work list all the blocks that have a definition for the
@@ -625,17 +625,17 @@ insert_phi_nodes (bitmap *dfs, bitmap na
EXECUTE_IF_SET_IN_BITMAP (names_to_rename, 0, i, bi)
{
if (ssa_name (i))
- insert_phi_nodes_1 (ssa_name (i), dfs, work_stack);
+ insert_phi_nodes_1 (ssa_name (i), dfs, &work_stack);
}
}
else if (vars_to_rename)
EXECUTE_IF_SET_IN_BITMAP (vars_to_rename, 0, i, bi)
{
- insert_phi_nodes_1 (referenced_var (i), dfs, work_stack);
+ insert_phi_nodes_1 (referenced_var (i), dfs, &work_stack);
}
else
for (i = 0; i < num_referenced_vars; i++)
- insert_phi_nodes_1 (referenced_var (i), dfs, work_stack);
+ insert_phi_nodes_1 (referenced_var (i), dfs, &work_stack);
VEC_free (basic_block, work_stack);
@@ -999,7 +999,7 @@ htab_statistics (FILE *file, htab_t htab
implement the worklist of basic blocks. */
static void
-insert_phi_nodes_for (tree var, bitmap *dfs, VEC(basic_block) *work_stack)
+insert_phi_nodes_for (tree var, bitmap *dfs, VEC(basic_block) **work_stack)
{
struct def_blocks_d *def_map;
bitmap phi_insertion_points;
@@ -1017,7 +1017,7 @@ insert_phi_nodes_for (tree var, bitmap *
EXECUTE_IF_SET_IN_BITMAP (def_map->def_blocks, 0, bb_index, bi)
{
- VEC_quick_push (basic_block, work_stack, BASIC_BLOCK (bb_index));
+ VEC_safe_push (basic_block, *work_stack, BASIC_BLOCK (bb_index));
}
/* Pop a block off the worklist, add every block that appears in
@@ -1032,12 +1032,12 @@ insert_phi_nodes_for (tree var, bitmap *
determine if fully pruned or semi pruned SSA form was appropriate.
We now always use fully pruned SSA form. */
- while (VEC_length (basic_block, work_stack) > 0)
+ while (VEC_length (basic_block, *work_stack) > 0)
{
unsigned dfs_index;
bitmap_iterator bi;
- bb = VEC_pop (basic_block, work_stack);
+ bb = VEC_pop (basic_block, *work_stack);
bb_index = bb->index;
EXECUTE_IF_AND_COMPL_IN_BITMAP (dfs[bb_index],
@@ -1046,7 +1046,10 @@ insert_phi_nodes_for (tree var, bitmap *
{
basic_block bb = BASIC_BLOCK (dfs_index);
- VEC_quick_push (basic_block, work_stack, bb);
+ /* Use a safe push because if there is a definition of VAR
+ in every basic block, then WORK_STACK may eventually have
+ more than N_BASIC_BLOCK entries. */
+ VEC_safe_push (basic_block, *work_stack, bb);
bitmap_set_bit (phi_insertion_points, dfs_index);
}
}
Index: testsuite/gcc.c-torture/compile/pr18712.c
===================================================================
RCS file: testsuite/gcc.c-torture/compile/pr18712.c
diff -N testsuite/gcc.c-torture/compile/pr18712.c
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ testsuite/gcc.c-torture/compile/pr18712.c 29 Nov 2004 18:27:49 -0000
@@ -0,0 +1,17 @@
+void *eintr_source (void *arg)
+{
+ int ts = 0;
+
+ if (arg)
+ foo ();
+
+ while (1)
+ {
+ if (arg)
+ foo ();
+
+ foo1 (&ts);
+ }
+
+ return 0;
+}