tree-into-ssa.c (insert_phi_nodes_for): Pass argument WORK_STACK by reference.
authorDiego Novillo <dnovillo@redhat.com>
Mon, 29 Nov 2004 20:02:09 +0000 (20:02 +0000)
committerDiego Novillo <dnovillo@gcc.gnu.org>
Mon, 29 Nov 2004 20:02:09 +0000 (15:02 -0500)
* 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.

From-SVN: r91481

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/pr18712.c [new file with mode: 0644]
gcc/tree-into-ssa.c

index 8a2c5f84f529b257920ffd0f36241059c38a3d44..777abddb0514531ee1d3e9484d3c8f1fc4826cd0 100644 (file)
@@ -1,3 +1,10 @@
+2004-11-29  Diego Novillo  <dnovillo@redhat.com>
+
+       * 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.
+
 2004-11-29  Daniel Jacobowitz  <dan@codesourcery.com>
 
        PR c/7544
index 83f1554f40925bf537b24e6839787ac37bbee4c8..1decc466260a1b0ad2de031fd944b4bef2539277 100644 (file)
@@ -1,3 +1,7 @@
+2004-11-29  Diego Novillo  <dnovillo@redhat.com>
+
+       * gcc.c-torture/compile/pr18712.c: New test.
+
 2004-11-29  Joseph Myers  <joseph@codesourcery.com>
 
        PR c/7544
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr18712.c b/gcc/testsuite/gcc.c-torture/compile/pr18712.c
new file mode 100644 (file)
index 0000000..7d53aaa
--- /dev/null
@@ -0,0 +1,17 @@
+void *eintr_source (void *arg)
+{
+  int ts = 0;
+  
+  if (arg)
+    foo ();
+  
+  while (1)
+    {
+      if (arg)
+       foo ();
+      
+      foo1 (&ts);
+    }
+  
+  return 0;
+}
index f79799ee372efb757a70e7b81783cf70780cb60c..41d752459f7bc8ac40e8cb53a58360faa85de759 100644 (file)
@@ -156,7 +156,7 @@ static void insert_phi_nodes (bitmap *, 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, size_t *uid_p)
    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 names_to_rename)
 
   /* 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 names_to_rename)
       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 *dfs, VEC(basic_block) *work_stack)
 
   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 *dfs, VEC(basic_block) *work_stack)
      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 *dfs, VEC(basic_block) *work_stack)
        {
          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);
        }
     }