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 <rguent...@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