diff options
author | Richard Guenther <rguenther@suse.de> | 2012-09-19 09:29:57 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2012-09-19 09:29:57 +0000 |
commit | bf7a718571e1722ec2aad8e0bfc337dc597ac2d2 (patch) | |
tree | 4dffe7fee5a1a31e84a3c34642c6d71e05ef8e5c | |
parent | f20132e7aefa8b3615154925559dd19f204c8eca (diff) | |
download | gcc-bf7a718571e1722ec2aad8e0bfc337dc597ac2d2.zip gcc-bf7a718571e1722ec2aad8e0bfc337dc597ac2d2.tar.gz gcc-bf7a718571e1722ec2aad8e0bfc337dc597ac2d2.tar.bz2 |
re PR other/53316 (Introduce -Og)
2012-09-19 Richard Guenther <rguenther@suse.de>
PR other/53316
* common.opt (optimize_debug): New variable.
(Og): New optimization level.
* doc/invoke.texi (Og): Document.
* opts.c (maybe_default_option): Add debug parameter.
(maybe_default_options): Likewise.
(default_options_optimization): Handle -Og.
(common_handle_option): Likewise.
* passes.c (gate_all_optimizations): Do not run with -Og.
(gate_all_optimizations_g): New gate, run with -Og.
(pass_all_optimizations_g): New container pass, run with -Og.
(init_optimization_passes): Schedule pass_all_optimizations_g
alongside pass_all_optimizations.
From-SVN: r191464
-rw-r--r-- | gcc/ChangeLog | 16 | ||||
-rw-r--r-- | gcc/common.opt | 7 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 10 | ||||
-rw-r--r-- | gcc/opts.c | 46 | ||||
-rw-r--r-- | gcc/passes.c | 55 |
5 files changed, 117 insertions, 17 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fc19389..e066b14 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,21 @@ 2012-09-19 Richard Guenther <rguenther@suse.de> + PR other/53316 + * common.opt (optimize_debug): New variable. + (Og): New optimization level. + * doc/invoke.texi (Og): Document. + * opts.c (maybe_default_option): Add debug parameter. + (maybe_default_options): Likewise. + (default_options_optimization): Handle -Og. + (common_handle_option): Likewise. + * passes.c (gate_all_optimizations): Do not run with -Og. + (gate_all_optimizations_g): New gate, run with -Og. + (pass_all_optimizations_g): New container pass, run with -Og. + (init_optimization_passes): Schedule pass_all_optimizations_g + alongside pass_all_optimizations. + +2012-09-19 Richard Guenther <rguenther@suse.de> + PR tree-optimization/54132 * tree-loop-distribution.c (classify_partition): Properly check dependences for memmove. diff --git a/gcc/common.opt b/gcc/common.opt index aa893ac..31b6210 100644 --- a/gcc/common.opt +++ b/gcc/common.opt @@ -32,6 +32,9 @@ int optimize Variable int optimize_size +Variable +int optimize_debug + ; Not used directly to control optimizations, only to save -Ofast ; setting for "optimize" attributes. Variable @@ -449,6 +452,10 @@ Ofast Common Optimization Optimize for speed disregarding exact standards compliance +Og +Common Optimization +Optimize for debugging experience rather than speed or size + Q Driver diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 748e792..e5ffdc9 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -422,7 +422,7 @@ Objective-C and Objective-C++ Dialects}. -fvariable-expansion-in-unroller -fvect-cost-model -fvpt -fweb @gol -fwhole-program -fwpa -fuse-linker-plugin @gol --param @var{name}=@var{value} --O -O0 -O1 -O2 -O3 -Os -Ofast} +-O -O0 -O1 -O2 -O3 -Os -Ofast -Og} @item Preprocessor Options @xref{Preprocessor Options,,Options Controlling the Preprocessor}. @@ -6364,6 +6364,14 @@ valid for all standard-compliant programs. It turns on @option{-ffast-math} and the Fortran-specific @option{-fno-protect-parens} and @option{-fstack-arrays}. +@item -Og +@opindex Og +Optimize debugging experience. @option{-Og} enables optimizations +that do not interfere with debugging. It should be the optimization +level of choice for the standard edit-compile-debug cycle, offering +a reasonable level of optimization while maintaining fast compilation +and a good debugging experience. + If you use multiple @option{-O} options, with or without level numbers, the last such option is the one that is effective. @end table @@ -314,15 +314,15 @@ init_options_struct (struct gcc_options *opts, struct gcc_options *opts_set) } /* If indicated by the optimization level LEVEL (-Os if SIZE is set, - -Ofast if FAST is set), apply the option DEFAULT_OPT to OPTS and - OPTS_SET, diagnostic context DC, location LOC, with language mask - LANG_MASK and option handlers HANDLERS. */ + -Ofast if FAST is set, -Og if DEBUG is set), apply the option DEFAULT_OPT + to OPTS and OPTS_SET, diagnostic context DC, location LOC, with language + mask LANG_MASK and option handlers HANDLERS. */ static void maybe_default_option (struct gcc_options *opts, struct gcc_options *opts_set, const struct default_options *default_opt, - int level, bool size, bool fast, + int level, bool size, bool fast, bool debug, unsigned int lang_mask, const struct cl_option_handlers *handlers, location_t loc, @@ -335,6 +335,8 @@ maybe_default_option (struct gcc_options *opts, gcc_assert (level == 2); if (fast) gcc_assert (level == 3); + if (debug) + gcc_assert (level == 1); switch (default_opt->levels) { @@ -351,7 +353,11 @@ maybe_default_option (struct gcc_options *opts, break; case OPT_LEVELS_1_PLUS_SPEED_ONLY: - enabled = (level >= 1 && !size); + enabled = (level >= 1 && !size && !debug); + break; + + case OPT_LEVELS_1_PLUS_NOT_DEBUG: + enabled = (level >= 1 && !debug); break; case OPT_LEVELS_2_PLUS: @@ -359,7 +365,7 @@ maybe_default_option (struct gcc_options *opts, break; case OPT_LEVELS_2_PLUS_SPEED_ONLY: - enabled = (level >= 2 && !size); + enabled = (level >= 2 && !size && !debug); break; case OPT_LEVELS_3_PLUS: @@ -405,7 +411,7 @@ static void maybe_default_options (struct gcc_options *opts, struct gcc_options *opts_set, const struct default_options *default_opts, - int level, bool size, bool fast, + int level, bool size, bool fast, bool debug, unsigned int lang_mask, const struct cl_option_handlers *handlers, location_t loc, @@ -415,7 +421,8 @@ maybe_default_options (struct gcc_options *opts, for (i = 0; default_opts[i].levels != OPT_LEVELS_NONE; i++) maybe_default_option (opts, opts_set, &default_opts[i], - level, size, fast, lang_mask, handlers, loc, dc); + level, size, fast, debug, + lang_mask, handlers, loc, dc); } /* Table of options enabled by default at different levels. */ @@ -444,7 +451,7 @@ static const struct default_options default_options_table[] = { OPT_LEVELS_1_PLUS, OPT_ftree_dominator_opts, NULL, 1 }, { OPT_LEVELS_1_PLUS, OPT_ftree_dse, NULL, 1 }, { OPT_LEVELS_1_PLUS, OPT_ftree_ter, NULL, 1 }, - { OPT_LEVELS_1_PLUS, OPT_ftree_sra, NULL, 1 }, + { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_ftree_sra, NULL, 1 }, { OPT_LEVELS_1_PLUS, OPT_ftree_copyrename, NULL, 1 }, { OPT_LEVELS_1_PLUS, OPT_ftree_fre, NULL, 1 }, { OPT_LEVELS_1_PLUS, OPT_ftree_copy_prop, NULL, 1 }, @@ -498,7 +505,7 @@ static const struct default_options default_options_table[] = /* Inlining of functions reducing size is a good idea with -Os regardless of them being declared inline. */ { OPT_LEVELS_3_PLUS_AND_SIZE, OPT_finline_functions, NULL, 1 }, - { OPT_LEVELS_1_PLUS, OPT_finline_functions_called_once, NULL, 1 }, + { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_finline_functions_called_once, NULL, 1 }, { OPT_LEVELS_3_PLUS, OPT_funswitch_loops, NULL, 1 }, { OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 }, { OPT_LEVELS_3_PLUS, OPT_ftree_vectorize, NULL, 1 }, @@ -540,6 +547,7 @@ default_options_optimization (struct gcc_options *opts, opts->x_optimize = 1; opts->x_optimize_size = 0; opts->x_optimize_fast = 0; + opts->x_optimize_debug = 0; } else { @@ -555,6 +563,7 @@ default_options_optimization (struct gcc_options *opts, opts->x_optimize = 255; opts->x_optimize_size = 0; opts->x_optimize_fast = 0; + opts->x_optimize_debug = 0; } } break; @@ -565,6 +574,7 @@ default_options_optimization (struct gcc_options *opts, /* Optimizing for size forces optimize to be 2. */ opts->x_optimize = 2; opts->x_optimize_fast = 0; + opts->x_optimize_debug = 0; break; case OPT_Ofast: @@ -572,6 +582,15 @@ default_options_optimization (struct gcc_options *opts, opts->x_optimize_size = 0; opts->x_optimize = 3; opts->x_optimize_fast = 1; + opts->x_optimize_debug = 0; + break; + + case OPT_Og: + /* -Og selects optimization level 1. */ + opts->x_optimize_size = 0; + opts->x_optimize = 1; + opts->x_optimize_fast = 0; + opts->x_optimize_debug = 1; break; default: @@ -582,7 +601,8 @@ default_options_optimization (struct gcc_options *opts, maybe_default_options (opts, opts_set, default_options_table, opts->x_optimize, opts->x_optimize_size, - opts->x_optimize_fast, lang_mask, handlers, loc, dc); + opts->x_optimize_fast, opts->x_optimize_debug, + lang_mask, handlers, loc, dc); /* -O2 param settings. */ opt2 = (opts->x_optimize >= 2); @@ -612,7 +632,8 @@ default_options_optimization (struct gcc_options *opts, maybe_default_options (opts, opts_set, targetm_common.option_optimization_table, opts->x_optimize, opts->x_optimize_size, - opts->x_optimize_fast, lang_mask, handlers, loc, dc); + opts->x_optimize_fast, opts->x_optimize_debug, + lang_mask, handlers, loc, dc); } /* After all options at LOC have been read into OPTS and OPTS_SET, @@ -1408,6 +1429,7 @@ common_handle_option (struct gcc_options *opts, case OPT_O: case OPT_Os: case OPT_Ofast: + case OPT_Og: /* Currently handled in a prescan. */ break; diff --git a/gcc/passes.c b/gcc/passes.c index a47068d..c96d533 100644 --- a/gcc/passes.c +++ b/gcc/passes.c @@ -337,10 +337,7 @@ static struct gimple_opt_pass pass_all_early_optimizations = static bool gate_all_optimizations (void) { - return (optimize >= 1 - /* Don't bother doing anything if the program has errors. - We have to pass down the queue if we already went into SSA */ - && (!seen_error () || gimple_in_ssa_p (cfun))); + return optimize >= 1 && !optimize_debug; } static struct gimple_opt_pass pass_all_optimizations = @@ -362,6 +359,33 @@ static struct gimple_opt_pass pass_all_optimizations = } }; +/* Gate: execute, or not, all of the non-trivial optimizations. */ + +static bool +gate_all_optimizations_g (void) +{ + return optimize >= 1 && optimize_debug; +} + +static struct gimple_opt_pass pass_all_optimizations_g = +{ + { + GIMPLE_PASS, + "*all_optimizations_g", /* name */ + gate_all_optimizations_g, /* gate */ + NULL, /* execute */ + NULL, /* sub */ + NULL, /* next */ + 0, /* static_pass_number */ + TV_OPTIMIZE, /* tv_id */ + 0, /* properties_required */ + 0, /* properties_provided */ + 0, /* properties_destroyed */ + 0, /* todo_flags_start */ + 0 /* todo_flags_finish */ + } +}; + static bool gate_rest_of_compilation (void) { @@ -1494,6 +1518,29 @@ init_optimization_passes (void) NEXT_PASS (pass_uncprop); NEXT_PASS (pass_local_pure_const); } + NEXT_PASS (pass_all_optimizations_g); + { + struct opt_pass **p = &pass_all_optimizations_g.pass.sub; + NEXT_PASS (pass_remove_cgraph_callee_edges); + NEXT_PASS (pass_strip_predict_hints); + /* Lower remaining pieces of GIMPLE. */ + NEXT_PASS (pass_lower_complex); + NEXT_PASS (pass_lower_vector_ssa); + /* Perform simple scalar cleanup which is constant/copy propagation. */ + NEXT_PASS (pass_ccp); + NEXT_PASS (pass_copy_prop); + NEXT_PASS (pass_rename_ssa_copies); + NEXT_PASS (pass_dce); + /* Fold remaining builtins. */ + NEXT_PASS (pass_object_sizes); + NEXT_PASS (pass_fold_builtins); + /* ??? We do want some kind of loop invariant motion, but we possibly + need to adjust LIM to be more friendly towards preserving accurate + debug information here. */ + NEXT_PASS (pass_late_warn_uninitialized); + NEXT_PASS (pass_uncprop); + NEXT_PASS (pass_local_pure_const); + } NEXT_PASS (pass_tm_init); { struct opt_pass **p = &pass_tm_init.pass.sub; |