Commit 35bfaf4d by Trevor Saunders Committed by Trevor Saunders

make depth_first_search_ds a class

gcc/ChangeLog:

2017-05-13  Trevor Saunders  <tbsaunde+gcc@tbsaunde.org>

	* cfganal.c (connect_infinite_loops_to_exit): Adjust.
	(depth_first_search::depth_first_search): Change structure init
	function to this constructor.
	(depth_first_search::add_bb): Rename function to this member.
	(depth_first_search::execute): Likewise.
	(flow_dfs_compute_reverse_finish): Adjust.

From-SVN: r248026
parent 8f48c622
2017-05-13 Trevor Saunders <tbsaunde+gcc@tbsaunde.org> 2017-05-13 Trevor Saunders <tbsaunde+gcc@tbsaunde.org>
* cfganal.c (connect_infinite_loops_to_exit): Adjust.
(depth_first_search::depth_first_search): Change structure init
function to this constructor.
(depth_first_search::add_bb): Rename function to this member.
(depth_first_search::execute): Likewise.
(flow_dfs_compute_reverse_finish): Adjust.
2017-05-13 Trevor Saunders <tbsaunde+gcc@tbsaunde.org>
* ddg.c (find_nodes_on_paths): Use auto_sbitmap. * ddg.c (find_nodes_on_paths): Use auto_sbitmap.
(longest_simple_path): Likewise. (longest_simple_path): Likewise.
* shrink-wrap.c (spread_components): Likewise. * shrink-wrap.c (spread_components): Likewise.
......
...@@ -28,25 +28,24 @@ along with GCC; see the file COPYING3. If not see ...@@ -28,25 +28,24 @@ along with GCC; see the file COPYING3. If not see
#include "cfganal.h" #include "cfganal.h"
#include "cfgloop.h" #include "cfgloop.h"
namespace {
/* Store the data structures necessary for depth-first search. */ /* Store the data structures necessary for depth-first search. */
struct depth_first_search_ds { class depth_first_search
/* stack for backtracking during the algorithm */ {
basic_block *stack; public:
depth_first_search ();
basic_block execute (basic_block);
void add_bb (basic_block);
/* number of edges in the stack. That is, positions 0, ..., sp-1 private:
have edges. */ /* stack for backtracking during the algorithm */
unsigned int sp; auto_vec<basic_block, 20> m_stack;
/* record of basic blocks already seen by depth-first search */ /* record of basic blocks already seen by depth-first search */
sbitmap visited_blocks; auto_sbitmap m_visited_blocks;
}; };
}
static void flow_dfs_compute_reverse_init (depth_first_search_ds *);
static void flow_dfs_compute_reverse_add_bb (depth_first_search_ds *,
basic_block);
static basic_block flow_dfs_compute_reverse_execute (depth_first_search_ds *,
basic_block);
static void flow_dfs_compute_reverse_finish (depth_first_search_ds *);
/* Mark the back edges in DFS traversal. /* Mark the back edges in DFS traversal.
Return nonzero if a loop (natural or otherwise) is present. Return nonzero if a loop (natural or otherwise) is present.
...@@ -597,30 +596,23 @@ add_noreturn_fake_exit_edges (void) ...@@ -597,30 +596,23 @@ add_noreturn_fake_exit_edges (void)
void void
connect_infinite_loops_to_exit (void) connect_infinite_loops_to_exit (void)
{ {
basic_block unvisited_block = EXIT_BLOCK_PTR_FOR_FN (cfun);
basic_block deadend_block;
depth_first_search_ds dfs_ds;
/* Perform depth-first search in the reverse graph to find nodes /* Perform depth-first search in the reverse graph to find nodes
reachable from the exit block. */ reachable from the exit block. */
flow_dfs_compute_reverse_init (&dfs_ds); depth_first_search dfs;
flow_dfs_compute_reverse_add_bb (&dfs_ds, EXIT_BLOCK_PTR_FOR_FN (cfun)); dfs.add_bb (EXIT_BLOCK_PTR_FOR_FN (cfun));
/* Repeatedly add fake edges, updating the unreachable nodes. */ /* Repeatedly add fake edges, updating the unreachable nodes. */
basic_block unvisited_block = EXIT_BLOCK_PTR_FOR_FN (cfun);
while (1) while (1)
{ {
unvisited_block = flow_dfs_compute_reverse_execute (&dfs_ds, unvisited_block = dfs.execute (unvisited_block);
unvisited_block);
if (!unvisited_block) if (!unvisited_block)
break; break;
deadend_block = dfs_find_deadend (unvisited_block); basic_block deadend_block = dfs_find_deadend (unvisited_block);
make_edge (deadend_block, EXIT_BLOCK_PTR_FOR_FN (cfun), EDGE_FAKE); make_edge (deadend_block, EXIT_BLOCK_PTR_FOR_FN (cfun), EDGE_FAKE);
flow_dfs_compute_reverse_add_bb (&dfs_ds, deadend_block); dfs.add_bb (deadend_block);
} }
flow_dfs_compute_reverse_finish (&dfs_ds);
return;
} }
/* Compute reverse top sort order. This is computing a post order /* Compute reverse top sort order. This is computing a post order
...@@ -1094,31 +1086,22 @@ pre_and_rev_post_order_compute (int *pre_order, int *rev_post_order, ...@@ -1094,31 +1086,22 @@ pre_and_rev_post_order_compute (int *pre_order, int *rev_post_order,
search context. If INITIALIZE_STACK is nonzero, there is an search context. If INITIALIZE_STACK is nonzero, there is an
element on the stack. */ element on the stack. */
static void depth_first_search::depth_first_search () :
flow_dfs_compute_reverse_init (depth_first_search_ds *data) m_stack (n_basic_blocks_for_fn (cfun)),
m_visited_blocks (last_basic_block_for_fn (cfun))
{ {
/* Allocate stack for back-tracking up CFG. */ bitmap_clear (m_visited_blocks);
data->stack = XNEWVEC (basic_block, n_basic_blocks_for_fn (cfun));
data->sp = 0;
/* Allocate bitmap to track nodes that have been visited. */
data->visited_blocks = sbitmap_alloc (last_basic_block_for_fn (cfun));
/* None of the nodes in the CFG have been visited yet. */
bitmap_clear (data->visited_blocks);
return;
} }
/* Add the specified basic block to the top of the dfs data /* Add the specified basic block to the top of the dfs data
structures. When the search continues, it will start at the structures. When the search continues, it will start at the
block. */ block. */
static void void
flow_dfs_compute_reverse_add_bb (depth_first_search_ds *data, basic_block bb) depth_first_search::add_bb (basic_block bb)
{ {
data->stack[data->sp++] = bb; m_stack.quick_push (bb);
bitmap_set_bit (data->visited_blocks, bb->index); bitmap_set_bit (m_visited_blocks, bb->index);
} }
/* Continue the depth-first search through the reverse graph starting with the /* Continue the depth-first search through the reverse graph starting with the
...@@ -1126,42 +1109,31 @@ flow_dfs_compute_reverse_add_bb (depth_first_search_ds *data, basic_block bb) ...@@ -1126,42 +1109,31 @@ flow_dfs_compute_reverse_add_bb (depth_first_search_ds *data, basic_block bb)
are marked. Returns an unvisited basic block, or NULL if there is none are marked. Returns an unvisited basic block, or NULL if there is none
available. */ available. */
static basic_block basic_block
flow_dfs_compute_reverse_execute (depth_first_search_ds *data, depth_first_search::execute (basic_block last_unvisited)
basic_block last_unvisited)
{ {
basic_block bb; basic_block bb;
edge e; edge e;
edge_iterator ei; edge_iterator ei;
while (data->sp > 0) while (!m_stack.is_empty ())
{ {
bb = data->stack[--data->sp]; bb = m_stack.pop ();
/* Perform depth-first search on adjacent vertices. */ /* Perform depth-first search on adjacent vertices. */
FOR_EACH_EDGE (e, ei, bb->preds) FOR_EACH_EDGE (e, ei, bb->preds)
if (!bitmap_bit_p (data->visited_blocks, e->src->index)) if (!bitmap_bit_p (m_visited_blocks, e->src->index))
flow_dfs_compute_reverse_add_bb (data, e->src); add_bb (e->src);
} }
/* Determine if there are unvisited basic blocks. */ /* Determine if there are unvisited basic blocks. */
FOR_BB_BETWEEN (bb, last_unvisited, NULL, prev_bb) FOR_BB_BETWEEN (bb, last_unvisited, NULL, prev_bb)
if (!bitmap_bit_p (data->visited_blocks, bb->index)) if (!bitmap_bit_p (m_visited_blocks, bb->index))
return bb; return bb;
return NULL; return NULL;
} }
/* Destroy the data structures needed for depth-first search on the
reverse graph. */
static void
flow_dfs_compute_reverse_finish (depth_first_search_ds *data)
{
free (data->stack);
sbitmap_free (data->visited_blocks);
}
/* Performs dfs search from BB over vertices satisfying PREDICATE; /* Performs dfs search from BB over vertices satisfying PREDICATE;
if REVERSE, go against direction of edges. Returns number of blocks if REVERSE, go against direction of edges. Returns number of blocks
found and their list in RSLT. RSLT can contain at most RSLT_MAX items. */ found and their list in RSLT. RSLT can contain at most RSLT_MAX items. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment