+2004-10-16 Zdenek Dvorak <dvorakz@suse.cz>
+
+ PR tree-optimization/17766
+ * basic-block.h (enum dom_state): DOM_CONS_OK removed.
+ (dom_info_available_p): Declare.
+ * cfghooks.c (split_block, make_forwarder_block): Use
+ dom_info_available_p.
+ * dominance.c (compute_dom_fast_query, calculate_dominance_info,
+ free_dominance_info, verify_dominators): Ditto.
+ (dom_info_available_p): New function.
+ * tree-cfg.c (cleanup_control_expr_graph): Free dominance information.
+ (thread_jumps): Use dom_info_available_p.
+ * tree-complex.c (expand_complex_div_wide): Ditto.
+ * tree-mudflap.c (mf_build_check_statement_for): Ditto.
+
2004-10-16 Zdenek Dvorak <dvorakz@suse.cz>
* tree-ssa-loop-ivopts.c (struct ivopts_data): New field important_candidates.
enum dom_state
{
DOM_NONE, /* Not computed at all. */
- DOM_CONS_OK, /* The data is conservatively OK, i.e. if it says you that A dominates B,
- it indeed does. */
DOM_NO_FAST_QUERY, /* The data is OK, but the fast query data are not usable. */
DOM_OK /* Everything is ok. */
};
extern enum dom_state dom_computed[2];
+extern bool dom_info_available_p (enum cdi_direction);
extern void calculate_dominance_info (enum cdi_direction);
extern void free_dominance_info (enum cdi_direction);
extern basic_block nearest_common_dominator (enum cdi_direction,
new_bb->frequency = bb->frequency;
new_bb->loop_depth = bb->loop_depth;
- if (dom_computed[CDI_DOMINATORS] >= DOM_CONS_OK)
+ if (dom_info_available_p (CDI_DOMINATORS))
{
redirect_immediate_dominators (CDI_DOMINATORS, bb, new_bb);
set_immediate_dominator (CDI_DOMINATORS, new_bb, bb);
new_bb_cbk (jump);
}
- if (dom_computed[CDI_DOMINATORS] >= DOM_CONS_OK)
+ if (dom_info_available_p (CDI_DOMINATORS))
{
basic_block doms_to_fix[2];
int num = 0;
basic_block bb;
- gcc_assert (dom_computed[dir] >= DOM_NO_FAST_QUERY);
+ gcc_assert (dom_info_available_p (dir));
if (dom_computed[dir] == DOM_OK)
return;
if (dom_computed[dir] == DOM_OK)
return;
- if (dom_computed[dir] != DOM_NO_FAST_QUERY)
+ if (!dom_info_available_p (dir))
{
- if (dom_computed[dir] != DOM_NONE)
- free_dominance_info (dir);
-
gcc_assert (!n_bbs_in_dom_tree[dir]);
FOR_ALL_BB (b)
{
basic_block bb;
- if (!dom_computed[dir])
+ if (!dom_info_available_p (dir))
return;
FOR_ALL_BB (bb)
int err = 0;
basic_block bb;
- gcc_assert (dom_computed[dir]);
+ gcc_assert (dom_info_available_p (dir));
FOR_EACH_BB (bb)
{
}
}
- if (dir == CDI_DOMINATORS
- && dom_computed[dir] >= DOM_NO_FAST_QUERY)
+ if (dir == CDI_DOMINATORS)
{
FOR_EACH_BB (bb)
{
return next->father->son == next ? NULL : next->data;
}
+/* Returns true if dominance information for direction DIR is available. */
+
+bool
+dom_info_available_p (enum cdi_direction dir)
+{
+ return dom_computed[dir] != DOM_NONE;
+}
+
void
debug_dominance_info (enum cdi_direction dir)
{
taken_edge->flags = EDGE_FALLTHRU;
/* We removed some paths from the cfg. */
- if (dom_computed[CDI_DOMINATORS] >= DOM_CONS_OK)
- dom_computed[CDI_DOMINATORS] = DOM_CONS_OK;
+ free_dominance_info (CDI_DOMINATORS);
return retval;
}
}
/* Update the dominators. */
- if (dom_computed[CDI_DOMINATORS] >= DOM_CONS_OK)
+ if (dom_info_available_p (CDI_DOMINATORS))
{
/* If the dominator of the destination was in the path, set its
dominator to the start of the redirected edge. */
/* Update dominance info. Note that bb_join's data was
updated by split_block. */
- if (dom_computed[CDI_DOMINATORS] >= DOM_CONS_OK)
+ if (dom_info_available_p (CDI_DOMINATORS))
{
set_immediate_dominator (CDI_DOMINATORS, bb_true, bb_cond);
set_immediate_dominator (CDI_DOMINATORS, bb_false, bb_cond);
/* Update dominance info. Note that bb_join's data was
updated by split_block. */
- if (dom_computed[CDI_DOMINATORS] >= DOM_CONS_OK)
+ if (dom_info_available_p (CDI_DOMINATORS))
{
set_immediate_dominator (CDI_DOMINATORS, then_bb, cond_bb);
set_immediate_dominator (CDI_DOMINATORS, join_bb, cond_bb);