Commit 25e87727 by Steven Bosscher

cfganal.c: Include vec.h and vecprim.h.

	* cfganal.c: Include vec.h and vecprim.h.
	(compute_idf): Import from...
	* tree-into-ssa (compute_idf): ...here.
	* basic-block.h (compute_idf): Export.

From-SVN: r137158
parent ddb64924
2008-06-26 Steven Bosscher <steven@gcc.gnu.org>
* cfganal.c: Include vec.h and vecprim.h.
(compute_idf): Import from...
* tree-into-ssa (compute_idf): ...here.
* basic-block.h (compute_idf): Export.
2008-06-26 Joseph Myers <joseph@codesourcery.com>
* c-decl.c (merge_decls): Use !current_function_decl to check for
......
......@@ -529,6 +529,7 @@ extern int dfs_enumerate_from (basic_block, int,
bool (*)(const_basic_block, const void *),
basic_block *, int, const void *);
extern void compute_dominance_frontiers (bitmap *);
extern bitmap compute_idf (bitmap, bitmap *);
extern void dump_bb_info (basic_block, bool, bool, int, const char *, FILE *);
extern void dump_edge_info (FILE *, edge, int);
extern void brief_dump_cfg (FILE *);
......
......@@ -31,6 +31,8 @@ along with GCC; see the file COPYING3. If not see
#include "recog.h"
#include "toplev.h"
#include "tm_p.h"
#include "vec.h"
#include "vecprim.h"
#include "timevar.h"
/* Store the data structures necessary for depth-first search. */
......@@ -1292,3 +1294,64 @@ compute_dominance_frontiers (bitmap *frontiers)
timevar_pop (TV_DOM_FRONTIERS);
}
/* Given a set of blocks with variable definitions (DEF_BLOCKS),
return a bitmap with all the blocks in the iterated dominance
frontier of the blocks in DEF_BLOCKS. DFS contains dominance
frontier information as returned by compute_dominance_frontiers.
The resulting set of blocks are the potential sites where PHI nodes
are needed. The caller is responsible for freeing the memory
allocated for the return value. */
bitmap
compute_idf (bitmap def_blocks, bitmap *dfs)
{
bitmap_iterator bi;
unsigned bb_index, i;
VEC(int,heap) *work_stack;
bitmap phi_insertion_points;
work_stack = VEC_alloc (int, heap, n_basic_blocks);
phi_insertion_points = BITMAP_ALLOC (NULL);
/* Seed the work list with all the blocks in DEF_BLOCKS. We use
VEC_quick_push here for speed. This is safe because we know that
the number of definition blocks is no greater than the number of
basic blocks, which is the initial capacity of WORK_STACK. */
EXECUTE_IF_SET_IN_BITMAP (def_blocks, 0, bb_index, bi)
VEC_quick_push (int, work_stack, bb_index);
/* Pop a block off the worklist, add every block that appears in
the original block's DF that we have not already processed to
the worklist. Iterate until the worklist is empty. Blocks
which are added to the worklist are potential sites for
PHI nodes. */
while (VEC_length (int, work_stack) > 0)
{
bb_index = VEC_pop (int, work_stack);
/* Since the registration of NEW -> OLD name mappings is done
separately from the call to update_ssa, when updating the SSA
form, the basic blocks where new and/or old names are defined
may have disappeared by CFG cleanup calls. In this case,
we may pull a non-existing block from the work stack. */
gcc_assert (bb_index < (unsigned) last_basic_block);
EXECUTE_IF_AND_COMPL_IN_BITMAP (dfs[bb_index], phi_insertion_points,
0, i, bi)
{
/* 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 (int, heap, work_stack, i);
bitmap_set_bit (phi_insertion_points, i);
}
}
VEC_free (int, heap, work_stack);
return phi_insertion_points;
}
......@@ -985,66 +985,6 @@ prune_unused_phi_nodes (bitmap phis, bitmap kills, bitmap uses)
free (defs);
}
/* Given a set of blocks with variable definitions (DEF_BLOCKS),
return a bitmap with all the blocks in the iterated dominance
frontier of the blocks in DEF_BLOCKS. DFS contains dominance
frontier information as returned by compute_dominance_frontiers.
The resulting set of blocks are the potential sites where PHI nodes
are needed. The caller is responsible for freeing the memory
allocated for the return value. */
static bitmap
compute_idf (bitmap def_blocks, bitmap *dfs)
{
bitmap_iterator bi;
unsigned bb_index, i;
VEC(int,heap) *work_stack;
bitmap phi_insertion_points;
work_stack = VEC_alloc (int, heap, n_basic_blocks);
phi_insertion_points = BITMAP_ALLOC (NULL);
/* Seed the work list with all the blocks in DEF_BLOCKS. We use
VEC_quick_push here for speed. This is safe because we know that
the number of definition blocks is no greater than the number of
basic blocks, which is the initial capacity of WORK_STACK. */
EXECUTE_IF_SET_IN_BITMAP (def_blocks, 0, bb_index, bi)
VEC_quick_push (int, work_stack, bb_index);
/* Pop a block off the worklist, add every block that appears in
the original block's DF that we have not already processed to
the worklist. Iterate until the worklist is empty. Blocks
which are added to the worklist are potential sites for
PHI nodes. */
while (VEC_length (int, work_stack) > 0)
{
bb_index = VEC_pop (int, work_stack);
/* Since the registration of NEW -> OLD name mappings is done
separately from the call to update_ssa, when updating the SSA
form, the basic blocks where new and/or old names are defined
may have disappeared by CFG cleanup calls. In this case,
we may pull a non-existing block from the work stack. */
gcc_assert (bb_index < (unsigned) last_basic_block);
EXECUTE_IF_AND_COMPL_IN_BITMAP (dfs[bb_index], phi_insertion_points,
0, i, bi)
{
/* 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 (int, heap, work_stack, i);
bitmap_set_bit (phi_insertion_points, i);
}
}
VEC_free (int, heap, work_stack);
return phi_insertion_points;
}
/* Return the set of blocks where variable VAR is defined and the blocks
where VAR is live on entry (livein). Return NULL, if no entry is
found in DEF_BLOCKS. */
......
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