Commit bf7a7185 by Richard Guenther Committed by Richard Biener

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
parent f20132e7
2012-09-19 Richard Guenther <rguenther@suse.de> 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 PR tree-optimization/54132
* tree-loop-distribution.c (classify_partition): Properly * tree-loop-distribution.c (classify_partition): Properly
check dependences for memmove. check dependences for memmove.
......
...@@ -32,6 +32,9 @@ int optimize ...@@ -32,6 +32,9 @@ int optimize
Variable Variable
int optimize_size int optimize_size
Variable
int optimize_debug
; Not used directly to control optimizations, only to save -Ofast ; Not used directly to control optimizations, only to save -Ofast
; setting for "optimize" attributes. ; setting for "optimize" attributes.
Variable Variable
...@@ -449,6 +452,10 @@ Ofast ...@@ -449,6 +452,10 @@ Ofast
Common Optimization Common Optimization
Optimize for speed disregarding exact standards compliance Optimize for speed disregarding exact standards compliance
Og
Common Optimization
Optimize for debugging experience rather than speed or size
Q Q
Driver Driver
......
...@@ -422,7 +422,7 @@ Objective-C and Objective-C++ Dialects}. ...@@ -422,7 +422,7 @@ Objective-C and Objective-C++ Dialects}.
-fvariable-expansion-in-unroller -fvect-cost-model -fvpt -fweb @gol -fvariable-expansion-in-unroller -fvect-cost-model -fvpt -fweb @gol
-fwhole-program -fwpa -fuse-linker-plugin @gol -fwhole-program -fwpa -fuse-linker-plugin @gol
--param @var{name}=@var{value} --param @var{name}=@var{value}
-O -O0 -O1 -O2 -O3 -Os -Ofast} -O -O0 -O1 -O2 -O3 -Os -Ofast -Og}
@item Preprocessor Options @item Preprocessor Options
@xref{Preprocessor Options,,Options Controlling the Preprocessor}. @xref{Preprocessor Options,,Options Controlling the Preprocessor}.
...@@ -6364,6 +6364,14 @@ valid for all standard-compliant programs. ...@@ -6364,6 +6364,14 @@ valid for all standard-compliant programs.
It turns on @option{-ffast-math} and the Fortran-specific It turns on @option{-ffast-math} and the Fortran-specific
@option{-fno-protect-parens} and @option{-fstack-arrays}. @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, If you use multiple @option{-O} options, with or without level numbers,
the last such option is the one that is effective. the last such option is the one that is effective.
@end table @end table
......
...@@ -314,15 +314,15 @@ init_options_struct (struct gcc_options *opts, struct gcc_options *opts_set) ...@@ -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, /* 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 -Ofast if FAST is set, -Og if DEBUG is set), apply the option DEFAULT_OPT
OPTS_SET, diagnostic context DC, location LOC, with language mask to OPTS and OPTS_SET, diagnostic context DC, location LOC, with language
LANG_MASK and option handlers HANDLERS. */ mask LANG_MASK and option handlers HANDLERS. */
static void static void
maybe_default_option (struct gcc_options *opts, maybe_default_option (struct gcc_options *opts,
struct gcc_options *opts_set, struct gcc_options *opts_set,
const struct default_options *default_opt, const struct default_options *default_opt,
int level, bool size, bool fast, int level, bool size, bool fast, bool debug,
unsigned int lang_mask, unsigned int lang_mask,
const struct cl_option_handlers *handlers, const struct cl_option_handlers *handlers,
location_t loc, location_t loc,
...@@ -335,6 +335,8 @@ maybe_default_option (struct gcc_options *opts, ...@@ -335,6 +335,8 @@ maybe_default_option (struct gcc_options *opts,
gcc_assert (level == 2); gcc_assert (level == 2);
if (fast) if (fast)
gcc_assert (level == 3); gcc_assert (level == 3);
if (debug)
gcc_assert (level == 1);
switch (default_opt->levels) switch (default_opt->levels)
{ {
...@@ -351,7 +353,11 @@ maybe_default_option (struct gcc_options *opts, ...@@ -351,7 +353,11 @@ maybe_default_option (struct gcc_options *opts,
break; break;
case OPT_LEVELS_1_PLUS_SPEED_ONLY: 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; break;
case OPT_LEVELS_2_PLUS: case OPT_LEVELS_2_PLUS:
...@@ -359,7 +365,7 @@ maybe_default_option (struct gcc_options *opts, ...@@ -359,7 +365,7 @@ maybe_default_option (struct gcc_options *opts,
break; break;
case OPT_LEVELS_2_PLUS_SPEED_ONLY: case OPT_LEVELS_2_PLUS_SPEED_ONLY:
enabled = (level >= 2 && !size); enabled = (level >= 2 && !size && !debug);
break; break;
case OPT_LEVELS_3_PLUS: case OPT_LEVELS_3_PLUS:
...@@ -405,7 +411,7 @@ static void ...@@ -405,7 +411,7 @@ static void
maybe_default_options (struct gcc_options *opts, maybe_default_options (struct gcc_options *opts,
struct gcc_options *opts_set, struct gcc_options *opts_set,
const struct default_options *default_opts, const struct default_options *default_opts,
int level, bool size, bool fast, int level, bool size, bool fast, bool debug,
unsigned int lang_mask, unsigned int lang_mask,
const struct cl_option_handlers *handlers, const struct cl_option_handlers *handlers,
location_t loc, location_t loc,
...@@ -415,7 +421,8 @@ maybe_default_options (struct gcc_options *opts, ...@@ -415,7 +421,8 @@ maybe_default_options (struct gcc_options *opts,
for (i = 0; default_opts[i].levels != OPT_LEVELS_NONE; i++) for (i = 0; default_opts[i].levels != OPT_LEVELS_NONE; i++)
maybe_default_option (opts, opts_set, &default_opts[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. */ /* Table of options enabled by default at different levels. */
...@@ -444,7 +451,7 @@ static const struct default_options default_options_table[] = ...@@ -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_dominator_opts, NULL, 1 },
{ OPT_LEVELS_1_PLUS, OPT_ftree_dse, 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_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_copyrename, NULL, 1 },
{ OPT_LEVELS_1_PLUS, OPT_ftree_fre, NULL, 1 }, { OPT_LEVELS_1_PLUS, OPT_ftree_fre, NULL, 1 },
{ OPT_LEVELS_1_PLUS, OPT_ftree_copy_prop, NULL, 1 }, { OPT_LEVELS_1_PLUS, OPT_ftree_copy_prop, NULL, 1 },
...@@ -498,7 +505,7 @@ static const struct default_options default_options_table[] = ...@@ -498,7 +505,7 @@ static const struct default_options default_options_table[] =
/* Inlining of functions reducing size is a good idea with -Os /* Inlining of functions reducing size is a good idea with -Os
regardless of them being declared inline. */ regardless of them being declared inline. */
{ OPT_LEVELS_3_PLUS_AND_SIZE, OPT_finline_functions, NULL, 1 }, { 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_funswitch_loops, NULL, 1 },
{ OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 }, { OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 },
{ OPT_LEVELS_3_PLUS, OPT_ftree_vectorize, NULL, 1 }, { OPT_LEVELS_3_PLUS, OPT_ftree_vectorize, NULL, 1 },
...@@ -540,6 +547,7 @@ default_options_optimization (struct gcc_options *opts, ...@@ -540,6 +547,7 @@ default_options_optimization (struct gcc_options *opts,
opts->x_optimize = 1; opts->x_optimize = 1;
opts->x_optimize_size = 0; opts->x_optimize_size = 0;
opts->x_optimize_fast = 0; opts->x_optimize_fast = 0;
opts->x_optimize_debug = 0;
} }
else else
{ {
...@@ -555,6 +563,7 @@ default_options_optimization (struct gcc_options *opts, ...@@ -555,6 +563,7 @@ default_options_optimization (struct gcc_options *opts,
opts->x_optimize = 255; opts->x_optimize = 255;
opts->x_optimize_size = 0; opts->x_optimize_size = 0;
opts->x_optimize_fast = 0; opts->x_optimize_fast = 0;
opts->x_optimize_debug = 0;
} }
} }
break; break;
...@@ -565,6 +574,7 @@ default_options_optimization (struct gcc_options *opts, ...@@ -565,6 +574,7 @@ default_options_optimization (struct gcc_options *opts,
/* Optimizing for size forces optimize to be 2. */ /* Optimizing for size forces optimize to be 2. */
opts->x_optimize = 2; opts->x_optimize = 2;
opts->x_optimize_fast = 0; opts->x_optimize_fast = 0;
opts->x_optimize_debug = 0;
break; break;
case OPT_Ofast: case OPT_Ofast:
...@@ -572,6 +582,15 @@ default_options_optimization (struct gcc_options *opts, ...@@ -572,6 +582,15 @@ default_options_optimization (struct gcc_options *opts,
opts->x_optimize_size = 0; opts->x_optimize_size = 0;
opts->x_optimize = 3; opts->x_optimize = 3;
opts->x_optimize_fast = 1; 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; break;
default: default:
...@@ -582,7 +601,8 @@ default_options_optimization (struct gcc_options *opts, ...@@ -582,7 +601,8 @@ default_options_optimization (struct gcc_options *opts,
maybe_default_options (opts, opts_set, default_options_table, maybe_default_options (opts, opts_set, default_options_table,
opts->x_optimize, opts->x_optimize_size, 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. */ /* -O2 param settings. */
opt2 = (opts->x_optimize >= 2); opt2 = (opts->x_optimize >= 2);
...@@ -612,7 +632,8 @@ default_options_optimization (struct gcc_options *opts, ...@@ -612,7 +632,8 @@ default_options_optimization (struct gcc_options *opts,
maybe_default_options (opts, opts_set, maybe_default_options (opts, opts_set,
targetm_common.option_optimization_table, targetm_common.option_optimization_table,
opts->x_optimize, opts->x_optimize_size, 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, /* After all options at LOC have been read into OPTS and OPTS_SET,
...@@ -1408,6 +1429,7 @@ common_handle_option (struct gcc_options *opts, ...@@ -1408,6 +1429,7 @@ common_handle_option (struct gcc_options *opts,
case OPT_O: case OPT_O:
case OPT_Os: case OPT_Os:
case OPT_Ofast: case OPT_Ofast:
case OPT_Og:
/* Currently handled in a prescan. */ /* Currently handled in a prescan. */
break; break;
......
...@@ -337,10 +337,7 @@ static struct gimple_opt_pass pass_all_early_optimizations = ...@@ -337,10 +337,7 @@ static struct gimple_opt_pass pass_all_early_optimizations =
static bool static bool
gate_all_optimizations (void) gate_all_optimizations (void)
{ {
return (optimize >= 1 return optimize >= 1 && !optimize_debug;
/* 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)));
} }
static struct gimple_opt_pass pass_all_optimizations = static struct gimple_opt_pass pass_all_optimizations =
...@@ -362,6 +359,33 @@ 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 static bool
gate_rest_of_compilation (void) gate_rest_of_compilation (void)
{ {
...@@ -1494,6 +1518,29 @@ init_optimization_passes (void) ...@@ -1494,6 +1518,29 @@ init_optimization_passes (void)
NEXT_PASS (pass_uncprop); NEXT_PASS (pass_uncprop);
NEXT_PASS (pass_local_pure_const); 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); NEXT_PASS (pass_tm_init);
{ {
struct opt_pass **p = &pass_tm_init.pass.sub; struct opt_pass **p = &pass_tm_init.pass.sub;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment