Index: tree-complex.c =================================================================== --- tree-complex.c (revision 174759) +++ tree-complex.c (working copy) @@ -1569,6 +1569,11 @@ tree_lower_complex (void) gimple_stmt_iterator gsi; basic_block bb; + /* With errors, normal optimization passes are not run. If we don't + lower complex operations at all, rtl expansion will abort. */ + if (cfun->curr_properties & PROP_gimple_lcx) + return 0; + if (!init_dont_simulate_again ()) return 0; @@ -1634,9 +1639,7 @@ struct gimple_opt_pass pass_lower_comple static bool gate_no_optimization (void) { - /* With errors, normal optimization passes are not run. If we don't - lower complex operations at all, rtl expansion will abort. */ - return !(cfun->curr_properties & PROP_gimple_lcx); + return true; } struct gimple_opt_pass pass_lower_complex_O0 = Index: tree-stdarg.c =================================================================== --- tree-stdarg.c (revision 174759) +++ tree-stdarg.c (working copy) @@ -627,8 +627,7 @@ check_all_va_list_escapes (struct stdarg static bool gate_optimize_stdarg (void) { - /* This optimization is only for stdarg functions. */ - return cfun->stdarg != 0; + return true; } @@ -645,6 +644,10 @@ execute_optimize_stdarg (void) const char *funcname = NULL; tree cfun_va_list; + /* This optimization is only for stdarg functions. */ + if (cfun->stdarg == 0) + return 0; + cfun->va_list_gpr_size = 0; cfun->va_list_fpr_size = 0; memset (&si, 0, sizeof (si)); Index: tree-eh.c =================================================================== --- tree-eh.c (revision 174759) +++ tree-eh.c (working copy) @@ -3234,6 +3234,9 @@ execute_lower_eh_dispatch (void) bool any_rewritten = false; bool redirected = false; + if (cfun->eh->region_tree == NULL) + return 0; + assign_filter_values (); FOR_EACH_BB (bb) @@ -3254,7 +3257,7 @@ execute_lower_eh_dispatch (void) static bool gate_lower_eh_dispatch (void) { - return cfun->eh->region_tree != NULL; + return true; } struct gimple_opt_pass pass_lower_eh_dispatch = @@ -3983,8 +3986,12 @@ execute_cleanup_eh_1 (void) static unsigned int execute_cleanup_eh (void) { - int ret = execute_cleanup_eh_1 (); + int ret; + if (cfun->eh == NULL || cfun->eh->region_tree == NULL) + return 0; + + ret = execute_cleanup_eh_1 (); /* If the function no longer needs an EH personality routine clear it. This exposes cross-language inlining opportunities and avoids references to a never defined personality routine. */ @@ -3998,7 +4005,7 @@ execute_cleanup_eh (void) static bool gate_cleanup_eh (void) { - return cfun->eh != NULL && cfun->eh->region_tree != NULL; + return true; } struct gimple_opt_pass pass_cleanup_eh = { Index: gcse.c =================================================================== --- gcse.c (revision 174759) +++ gcse.c (working copy) @@ -3713,15 +3713,17 @@ static bool gate_rtl_pre (void) { return optimize > 0 && flag_gcse - && !cfun->calls_setjmp - && optimize_function_for_speed_p (cfun) - && dbg_cnt (pre); + && optimize_function_for_speed_p (cfun); } static unsigned int execute_rtl_pre (void) { int changed; + + if (cfun->calls_setjmp || !dbg_cnt (pre)) + return 0; + delete_unreachable_blocks (); df_analyze (); changed = one_pre_gcse_pass (); @@ -3735,18 +3737,20 @@ static bool gate_rtl_hoist (void) { return optimize > 0 && flag_gcse - && !cfun->calls_setjmp - /* It does not make sense to run code hoisting unless we are optimizing - for code size -- it rarely makes programs faster, and can make then - bigger if we did PRE (when optimizing for space, we don't run PRE). */ - && optimize_function_for_size_p (cfun) - && dbg_cnt (hoist); + /* It does not make sense to run code hoisting unless we are optimizing + for code size -- it rarely makes programs faster, and can make then + bigger if we did PRE (when optimizing for space, we don't run PRE). */ + && optimize_function_for_size_p (cfun); } static unsigned int execute_rtl_hoist (void) { int changed; + + if (cfun->calls_setjmp || !dbg_cnt (hoist)) + return 0; + delete_unreachable_blocks (); df_analyze (); changed = one_code_hoisting_pass (); @@ -3799,4 +3803,3 @@ struct rtl_opt_pass pass_rtl_hoist = }; #include "gt-gcse.h" - Index: except.c =================================================================== --- except.c (revision 174759) +++ except.c (working copy) @@ -1440,14 +1440,17 @@ finish_eh_generation (void) static bool gate_handle_eh (void) { - /* Nothing to do if no regions created. */ - return cfun->eh->region_tree != NULL; + return true; } /* Complete generation of exception handling code. */ static unsigned int rest_of_handle_eh (void) { + /* Nothing to do if no regions created. */ + if (cfun->eh->region_tree == NULL) + return 0; + finish_eh_generation (); cleanup_cfg (CLEANUP_NO_INSN_DEL); return 0; @@ -2392,6 +2395,9 @@ convert_to_eh_region_ranges (void) int min_labelno = 0, max_labelno = 0; int saved_call_site_base = call_site_base; + if (cfun->eh->region_tree == NULL) + return 0; + crtl->eh.action_record_data = VEC_alloc (uchar, gc, 64); ar_hash = htab_create (31, action_record_hash, action_record_eq, free); @@ -2643,8 +2649,6 @@ static bool gate_convert_to_eh_region_ranges (void) { /* Nothing to do for SJLJ exceptions or if no regions created. */ - if (cfun->eh->region_tree == NULL) - return false; if (targetm.except_unwind_info (&global_options) == UI_SJLJ) return false; return true; Index: cprop.c =================================================================== --- cprop.c (revision 174759) +++ cprop.c (working copy) @@ -1843,15 +1843,17 @@ one_cprop_pass (void) static bool gate_rtl_cprop (void) { - return optimize > 0 && flag_gcse - && !cfun->calls_setjmp - && dbg_cnt (cprop); + return optimize > 0 && flag_gcse; } static unsigned int execute_rtl_cprop (void) { int changed; + + if (cfun->calls_setjmp || !dbg_cnt (cprop)) + return 0; + delete_unreachable_blocks (); df_set_flags (DF_LR_RUN_DCE); df_analyze (); @@ -1882,4 +1884,3 @@ struct rtl_opt_pass pass_rtl_cprop = TODO_verify_flow | TODO_ggc_collect /* todo_flags_finish */ } }; -