[PATCH][2/n] Make TODO_verify_il handle TODO_verify_stmts and TODO_verify_ssa
Richard Biener
rguenther@suse.de
Tue Apr 29 14:45:00 GMT 2014
This is step two - do GIMPLE stmt and SSA verification when the IL
is in such state. It needs extra conditionals for IPA pass
contexts which may run on inconsistent IL until fixup_cfg had
a chance to run and adjust the IL for noreturn and nothrow
changes (done only by ipa-pure-const).
Bootstrapped on x86_64-unknown-linux-gnu, hopefully testing
succeeds this time ;) (see the bug in tree-eh.c this catched)
Any comments?
Thanks,
Richard.
2014-04-29 Richard Biener <rguenther@suse.de>
* passes.c (execute_function_todo): Move TODO_verify_stmts
and TODO_verify_ssa under the TODO_verify_il umbrella.
* tree-ssa.h (verify_ssa): Adjust prototype.
* tree-ssa.c (verify_ssa): Add parameter to tell whether
we should verify SSA operands.
* tree-cfg.h (verify_gimple_in_cfg): Adjust prototype.
* tree-cfg.c (verify_gimple_in_cfg): Add parameter to tell
whether we should verify whether not throwing stmts have EH info.
* graphite-scop-detection.c (create_sese_edges): Adjust.
* tree-ssa-loop-manip.c (verify_loop_closed_ssa): Likewise.
* tree-eh.c (lower_try_finally_switch): Do not add the
default case label twice.
Index: gcc/passes.c
===================================================================
*** gcc/passes.c (revision 209892)
--- gcc/passes.c (working copy)
*************** pass_manager::dump_profile_report () con
*** 1716,1721 ****
--- 1716,1722 ----
static void
execute_function_todo (function *fn, void *data)
{
+ bool from_ipa_pass = (cfun == NULL);
unsigned int flags = (size_t)data;
flags &= ~fn->last_verified;
if (!flags)
*************** execute_function_todo (function *fn, voi
*** 1767,1792 ****
dom_state pre_verify_state = dom_info_state (fn, CDI_DOMINATORS);
dom_state pre_verify_pstate = dom_info_state (fn, CDI_POST_DOMINATORS);
! if (flags & TODO_verify_ssa)
{
! verify_gimple_in_cfg (cfun);
! verify_ssa (true);
}
- else if (flags & TODO_verify_stmts)
- verify_gimple_in_cfg (cfun);
if (flags & TODO_verify_flow)
verify_flow_info ();
if (flags & TODO_verify_il)
{
if (current_loops
&& loops_state_satisfies_p (LOOP_CLOSED_SSA))
! {
! if (!(flags & (TODO_verify_stmts|TODO_verify_ssa)))
! verify_gimple_in_cfg (cfun);
! if (!(flags & TODO_verify_ssa))
! verify_ssa (true);
! verify_loop_closed_ssa (false);
! }
}
if (flags & TODO_verify_rtl_sharing)
verify_rtl_sharing ();
--- 1768,1796 ----
dom_state pre_verify_state = dom_info_state (fn, CDI_DOMINATORS);
dom_state pre_verify_pstate = dom_info_state (fn, CDI_POST_DOMINATORS);
! if (flags & TODO_verify_il)
{
! if (cfun->curr_properties & PROP_trees)
! {
! if (cfun->curr_properties & PROP_cfg)
! /* IPA passes leave stmts to be fixed up, so make sure to
! not verify stmts really throw. */
! verify_gimple_in_cfg (cfun, !from_ipa_pass);
! else
! verify_gimple_in_seq (gimple_body (cfun->decl));
! }
! if (cfun->curr_properties & PROP_ssa)
! /* IPA passes leave stmts to be fixed up, so make sure to
! not verify SSA operands whose verifier will choke on that. */
! verify_ssa (true, !from_ipa_pass);
}
if (flags & TODO_verify_flow)
verify_flow_info ();
if (flags & TODO_verify_il)
{
if (current_loops
&& loops_state_satisfies_p (LOOP_CLOSED_SSA))
! verify_loop_closed_ssa (false);
}
if (flags & TODO_verify_rtl_sharing)
verify_rtl_sharing ();
*************** execute_function_todo (function *fn, voi
*** 1803,1809 ****
/* For IPA passes make sure to release dominator info, it can be
computed by non-verifying TODOs. */
! if (!cfun)
{
free_dominance_info (fn, CDI_DOMINATORS);
free_dominance_info (fn, CDI_POST_DOMINATORS);
--- 1807,1813 ----
/* For IPA passes make sure to release dominator info, it can be
computed by non-verifying TODOs. */
! if (from_ipa_pass)
{
free_dominance_info (fn, CDI_DOMINATORS);
free_dominance_info (fn, CDI_POST_DOMINATORS);
Index: gcc/tree-ssa.h
===================================================================
*** gcc/tree-ssa.h (revision 209891)
--- gcc/tree-ssa.h (working copy)
*************** extern void insert_debug_temp_for_var_de
*** 45,51 ****
extern void insert_debug_temps_for_defs (gimple_stmt_iterator *);
extern void reset_debug_uses (gimple);
extern void release_defs_bitset (bitmap toremove);
! extern void verify_ssa (bool);
extern void init_tree_ssa (struct function *);
extern void delete_tree_ssa (void);
extern bool tree_ssa_useless_type_conversion (tree);
--- 45,51 ----
extern void insert_debug_temps_for_defs (gimple_stmt_iterator *);
extern void reset_debug_uses (gimple);
extern void release_defs_bitset (bitmap toremove);
! extern void verify_ssa (bool, bool);
extern void init_tree_ssa (struct function *);
extern void delete_tree_ssa (void);
extern bool tree_ssa_useless_type_conversion (tree);
Index: gcc/tree-ssa.c
===================================================================
*** gcc/tree-ssa.c (revision 209891)
--- gcc/tree-ssa.c (working copy)
*************** error:
*** 959,965 ****
TODO: verify the variable annotations. */
DEBUG_FUNCTION void
! verify_ssa (bool check_modified_stmt)
{
size_t i;
basic_block bb;
--- 959,965 ----
TODO: verify the variable annotations. */
DEBUG_FUNCTION void
! verify_ssa (bool check_modified_stmt, bool check_ssa_operands)
{
size_t i;
basic_block bb;
*************** verify_ssa (bool check_modified_stmt)
*** 1042,1048 ****
goto err;
}
! if (verify_ssa_operands (cfun, stmt))
{
print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
goto err;
--- 1042,1048 ----
goto err;
}
! if (check_ssa_operands && verify_ssa_operands (cfun, stmt))
{
print_gimple_stmt (stderr, stmt, 0, TDF_VOPS);
goto err;
Index: gcc/tree-cfg.h
===================================================================
*** gcc/tree-cfg.h (revision 209891)
--- gcc/tree-cfg.h (working copy)
*************** extern gimple first_stmt (basic_block);
*** 58,64 ****
extern gimple last_stmt (basic_block);
extern gimple last_and_only_stmt (basic_block);
extern void verify_gimple_in_seq (gimple_seq);
! extern void verify_gimple_in_cfg (struct function *);
extern tree gimple_block_label (basic_block);
extern void add_phi_args_after_copy_bb (basic_block);
extern void add_phi_args_after_copy (basic_block *, unsigned, edge);
--- 58,64 ----
extern gimple last_stmt (basic_block);
extern gimple last_and_only_stmt (basic_block);
extern void verify_gimple_in_seq (gimple_seq);
! extern void verify_gimple_in_cfg (struct function *, bool);
extern tree gimple_block_label (basic_block);
extern void add_phi_args_after_copy_bb (basic_block);
extern void add_phi_args_after_copy (basic_block *, unsigned, edge);
Index: gcc/tree-cfg.c
===================================================================
*** gcc/tree-cfg.c (revision 209891)
--- gcc/tree-cfg.c (working copy)
*************** collect_subblocks (pointer_set_t *blocks
*** 4785,4791 ****
/* Verify the GIMPLE statements in the CFG of FN. */
DEBUG_FUNCTION void
! verify_gimple_in_cfg (struct function *fn)
{
basic_block bb;
bool err = false;
--- 4785,4791 ----
/* Verify the GIMPLE statements in the CFG of FN. */
DEBUG_FUNCTION void
! verify_gimple_in_cfg (struct function *fn, bool verify_nothrow)
{
basic_block bb;
bool err = false;
*************** verify_gimple_in_cfg (struct function *f
*** 4921,4936 ****
that they cannot throw, that we update other data structures
to match. */
lp_nr = lookup_stmt_eh_lp (stmt);
! if (lp_nr != 0)
{
if (!stmt_could_throw_p (stmt))
{
! error ("statement marked for throw, but doesn%'t");
! err2 |= true;
}
! else if (lp_nr > 0
! && !gsi_one_before_end_p (gsi)
! && stmt_can_throw_internal (stmt))
{
error ("statement marked for throw in middle of block");
err2 |= true;
--- 4921,4937 ----
that they cannot throw, that we update other data structures
to match. */
lp_nr = lookup_stmt_eh_lp (stmt);
! if (lp_nr > 0)
{
if (!stmt_could_throw_p (stmt))
{
! if (verify_nothrow)
! {
! error ("statement marked for throw, but doesn%'t");
! err2 |= true;
! }
}
! else if (!gsi_one_before_end_p (gsi))
{
error ("statement marked for throw in middle of block");
err2 |= true;
Index: gcc/graphite-scop-detection.c
===================================================================
*** gcc/graphite-scop-detection.c (revision 209891)
--- gcc/graphite-scop-detection.c (working copy)
*************** create_sese_edges (vec<sd_region> region
*** 1056,1062 ****
#ifdef ENABLE_CHECKING
verify_loop_structure ();
! verify_ssa (false);
#endif
}
--- 1056,1062 ----
#ifdef ENABLE_CHECKING
verify_loop_structure ();
! verify_ssa (false, true);
#endif
}
Index: gcc/tree-ssa-loop-manip.c
===================================================================
*** gcc/tree-ssa-loop-manip.c (revision 209891)
--- gcc/tree-ssa-loop-manip.c (working copy)
*************** verify_loop_closed_ssa (bool verify_ssa_
*** 598,604 ****
return;
if (verify_ssa_p)
! verify_ssa (false);
timevar_push (TV_VERIFY_LOOP_CLOSED);
--- 598,604 ----
return;
if (verify_ssa_p)
! verify_ssa (false, true);
timevar_push (TV_VERIFY_LOOP_CLOSED);
Index: gcc/tree-eh.c
===================================================================
*** gcc/tree-eh.c (revision 209891)
--- gcc/tree-eh.c (working copy)
*************** lower_try_finally_switch (struct leh_sta
*** 1550,1555 ****
--- 1550,1557 ----
/* Make sure that the last case is the default label, as one is required.
Then sort the labels, which is also required in GIMPLE. */
CASE_LOW (last_case) = NULL;
+ tree tem = case_label_vec.pop ();
+ gcc_assert (tem == last_case);
sort_case_labels (case_label_vec);
/* Build the switch statement, setting last_case to be the default
More information about the Gcc-patches
mailing list