aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven Bosscher <stevenb@suse.de>2004-09-28 20:31:16 +0000
committerSteven Bosscher <steven@gcc.gnu.org>2004-09-28 20:31:16 +0000
commit78492bf5ac71894df6c63fe5eb69c65007d52ad0 (patch)
tree5d399914cbab0c2ba3f40a1b1790952a822bf7e9
parentef7878226aa58cf991bcf3b61c43b4e89e4f5a06 (diff)
downloadgcc-78492bf5ac71894df6c63fe5eb69c65007d52ad0.zip
gcc-78492bf5ac71894df6c63fe5eb69c65007d52ad0.tar.gz
gcc-78492bf5ac71894df6c63fe5eb69c65007d52ad0.tar.bz2
Makefile.in (tree-ssa-propagate.o): Depend on vec.h.
* Makefile.in (tree-ssa-propagate.o): Depend on vec.h. * tree-ssa-propagate.c: Include vec.h. (interesting_ssa_edges, varying_ssa_edges): Make these VECs instead of varrays. (cfg_blocks_add): Assert the block is not already in the worklist. Update uses of interesting_ssa_edges and varying_ssa_edges. (process_ssa_edge_worklist, ssa_prop_init, ssa_prop_fini, ssa_propagate): Likewise. From-SVN: r88249
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/Makefile.in2
-rw-r--r--gcc/tree-ssa-propagate.c40
3 files changed, 33 insertions, 20 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2847a26..11506d8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+2004-09-28 Steven Bosscher <stevenb@suse.de>
+
+ * Makefile.in (tree-ssa-propagate.o): Depend on vec.h.
+ * tree-ssa-propagate.c: Include vec.h.
+ (interesting_ssa_edges, varying_ssa_edges): Make these VECs
+ instead of varrays.
+ (cfg_blocks_add): Assert the block is not already in the worklist.
+ Update uses of interesting_ssa_edges and varying_ssa_edges.
+ (process_ssa_edge_worklist, ssa_prop_init, ssa_prop_fini,
+ ssa_propagate): Likewise.
+
2004-09-28 Joseph S. Myers <jsm@polyomino.org.uk>
PR c/16409
diff --git a/gcc/Makefile.in b/gcc/Makefile.in
index f890579..ec4af54 100644
--- a/gcc/Makefile.in
+++ b/gcc/Makefile.in
@@ -1635,7 +1635,7 @@ tree-ssa-propagate.o : tree-ssa-propagate.c $(TREE_FLOW_H) $(CONFIG_H) \
$(SYSTEM_H) $(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) $(GGC_H) output.h \
diagnostic.h errors.h function.h $(TIMEVAR_H) $(TM_H) coretypes.h \
$(TREE_DUMP_H) $(BASIC_BLOCK_H) tree-pass.h langhooks.h \
- tree-ssa-propagate.h
+ tree-ssa-propagate.h vec.h
tree-ssa-dom.o : tree-ssa-dom.c $(TREE_FLOW_H) $(CONFIG_H) $(SYSTEM_H) \
$(RTL_H) $(TREE_H) $(TM_P_H) $(EXPR_H) $(GGC_H) output.h diagnostic.h \
errors.h function.h $(TIMEVAR_H) $(TM_H) coretypes.h $(TREE_DUMP_H) \
diff --git a/gcc/tree-ssa-propagate.c b/gcc/tree-ssa-propagate.c
index e93b9c1..6fab4f4 100644
--- a/gcc/tree-ssa-propagate.c
+++ b/gcc/tree-ssa-propagate.c
@@ -40,7 +40,8 @@
#include "tree-pass.h"
#include "tree-ssa-propagate.h"
#include "langhooks.h"
-
+#include "varray.h"
+#include "vec.h"
/* This file implements a generic value propagation engine based on
the same propagation used by the SSA-CCP algorithm [1].
@@ -142,7 +143,7 @@ static sbitmap bb_in_list;
definition has changed. SSA edges are def-use edges in the SSA
web. For each D-U edge, we store the target statement or PHI node
U. */
-static GTY(()) varray_type interesting_ssa_edges;
+static GTY(()) VEC(tree) *interesting_ssa_edges;
/* Identical to INTERESTING_SSA_EDGES. For performance reasons, the
list of SSA edges is split into two. One contains all SSA edges
@@ -158,7 +159,7 @@ static GTY(()) varray_type interesting_ssa_edges;
don't use a separate worklist for VARYING edges, we end up with
situations where lattice values move from
UNDEFINED->INTERESTING->VARYING instead of UNDEFINED->VARYING. */
-static GTY(()) varray_type varying_ssa_edges;
+static GTY(()) VEC(tree) *varying_ssa_edges;
/* Return true if the block worklist empty. */
@@ -170,7 +171,8 @@ cfg_blocks_empty_p (void)
}
-/* Add a basic block to the worklist. */
+/* Add a basic block to the worklist. The block must not be already
+ in the worklist. */
static void
cfg_blocks_add (basic_block bb)
@@ -178,8 +180,7 @@ cfg_blocks_add (basic_block bb)
if (bb == ENTRY_BLOCK_PTR || bb == EXIT_BLOCK_PTR)
return;
- if (TEST_BIT (bb_in_list, bb->index))
- return;
+ gcc_assert (!TEST_BIT (bb_in_list, bb->index));
if (cfg_blocks_empty_p ())
{
@@ -247,9 +248,9 @@ add_ssa_edge (tree var, bool is_varying)
{
STMT_IN_SSA_EDGE_WORKLIST (use_stmt) = 1;
if (is_varying)
- VARRAY_PUSH_TREE (varying_ssa_edges, use_stmt);
+ VEC_safe_push (tree, varying_ssa_edges, use_stmt);
else
- VARRAY_PUSH_TREE (interesting_ssa_edges, use_stmt);
+ VEC_safe_push (tree, interesting_ssa_edges, use_stmt);
}
}
}
@@ -340,19 +341,20 @@ simulate_stmt (tree stmt)
/* Process an SSA edge worklist. WORKLIST is the SSA edge worklist to
drain. This pops statements off the given WORKLIST and processes
- them until there are no more statements on WORKLIST. */
+ them until there are no more statements on WORKLIST.
+ We take a pointer to WORKLIST because it may be reallocated when an
+ SSA edge is added to it in simulate_stmt. */
static void
-process_ssa_edge_worklist (varray_type *worklist)
+process_ssa_edge_worklist (VEC(tree) **worklist)
{
/* Drain the entire worklist. */
- while (VARRAY_ACTIVE_SIZE (*worklist) > 0)
+ while (VEC_length (tree, *worklist) > 0)
{
basic_block bb;
/* Pull the statement to simulate off the worklist. */
- tree stmt = VARRAY_TOP_TREE (*worklist);
- VARRAY_POP (*worklist);
+ tree stmt = VEC_pop (tree, *worklist);
/* If this statement was already visited by simulate_block, then
we don't need to visit it again here. */
@@ -463,8 +465,8 @@ ssa_prop_init (void)
basic_block bb;
/* Worklists of SSA edges. */
- VARRAY_TREE_INIT (interesting_ssa_edges, 20, "interesting_ssa_edges");
- VARRAY_TREE_INIT (varying_ssa_edges, 20, "varying_ssa_edges");
+ interesting_ssa_edges = VEC_alloc (tree, 20);
+ varying_ssa_edges = VEC_alloc (tree, 20);
executable_blocks = sbitmap_alloc (last_basic_block);
sbitmap_zero (executable_blocks);
@@ -507,8 +509,8 @@ ssa_prop_init (void)
static void
ssa_prop_fini (void)
{
- interesting_ssa_edges = NULL;
- varying_ssa_edges = NULL;
+ VEC_free (tree, interesting_ssa_edges);
+ VEC_free (tree, varying_ssa_edges);
cfg_blocks = NULL;
sbitmap_free (bb_in_list);
sbitmap_free (executable_blocks);
@@ -653,8 +655,8 @@ ssa_propagate (ssa_prop_visit_stmt_fn visit_stmt,
/* Iterate until the worklists are empty. */
while (!cfg_blocks_empty_p ()
- || VARRAY_ACTIVE_SIZE (interesting_ssa_edges) > 0
- || VARRAY_ACTIVE_SIZE (varying_ssa_edges) > 0)
+ || VEC_length (tree, interesting_ssa_edges) > 0
+ || VEC_length (tree, varying_ssa_edges) > 0)
{
if (!cfg_blocks_empty_p ())
{