This is a collection option that can be used to disable / enable
the avr-specific optimization passes -- currently 8 of them.
Ok for trunk?
Johan
--
gcc/
* config/avr/avr.opt (-moptimize): New target option.
* config/avr/avr.opt.urls: Add resprective URL.
* common/config/avr/avr-common.cc (avr_enable_optimizations): New
static function.
(avr_handle_option) [OPT_moptimize]: Call it.
* doc/invoke.texi (AVR Options) <-moptimize>: Document it.diff --git a/gcc/common/config/avr/avr-common.cc b/gcc/common/config/avr/avr-common.cc
index 875efde6681..aa2a22e83d0 100644
--- a/gcc/common/config/avr/avr-common.cc
+++ b/gcc/common/config/avr/avr-common.cc
@@ -80,6 +80,22 @@ static const struct default_options avr_option_optimization_table[] =
};
+/* Let -m[no-]optimize [de-]activate avr-specific optimization (passes). */
+
+static void
+avr_enable_optimizations (gcc_options *opts, bool on)
+{
+ opts->x_avropt_demote_switch = on;
+ opts->x_avropt_fuse_add = on ? 2 : 0;
+ opts->x_avropt_fuse_ifelse = on;
+ opts->x_avropt_fuse_move = on ? 23 : 0;
+ opts->x_avropt_fuse_move2 = on;
+ opts->x_avropt_split_ldst = on;
+ opts->x_avropt_split_bit_shift = on;
+ opts->x_avropt_use_nonzero_bits = on;
+}
+
+
/* Implement `TARGET_HANDLE_OPTION'. */
/* This is the same logic that driver-avr.cc:avr_double_lib() applies
@@ -94,6 +110,9 @@ avr_handle_option (struct gcc_options *opts, struct gcc_options*,
{
int value = decoded->value;
+ if (decoded->opt_index == OPT_moptimize)
+ avr_enable_optimizations (opts, value);
+
switch (decoded->opt_index)
{
case OPT_mdouble_:
diff --git a/gcc/config/avr/avr.opt b/gcc/config/avr/avr.opt
index 625c6b2440d..c94385f5370 100644
--- a/gcc/config/avr/avr.opt
+++ b/gcc/config/avr/avr.opt
@@ -184,6 +184,10 @@ mfuse-move2
Target Var(avropt_fuse_move2) Init(0) Optimization
Optimization. Fuse some move insns after insn combine.
+moptimize
+Target Var(avropt_optimize) Init(0) Optimization
+Optimization. Enable avr-specific optimizations.
+
mabsdata
Target Mask(ABSDATA)
Assume that all data in static storage can be accessed by LDS / STS instructions. This option is only useful for reduced Tiny devices like ATtiny40.
diff --git a/gcc/config/avr/avr.opt.urls b/gcc/config/avr/avr.opt.urls
index a04394894e7..a7d2d295f89 100644
--- a/gcc/config/avr/avr.opt.urls
+++ b/gcc/config/avr/avr.opt.urls
@@ -111,6 +111,9 @@ UrlSuffix(gcc/AVR-Options.html#index-mfuse-move)
mfuse-move2
UrlSuffix(gcc/AVR-Options.html#index-mfuse-move2)
+moptimize
+UrlSuffix(gcc/AVR-Options.html#index-moptimize)
+
mabsdata
UrlSuffix(gcc/AVR-Options.html#index-mabsdata)
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 3311ff94619..d118ff35b50 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -990,7 +990,7 @@ Objective-C and Objective-C++ Dialects}.
-mcall-prologues -mgas-isr-prologues -mint8 -mflmap
-mdouble=@var{bits} -mlong-double=@var{bits} -mno-call-main
-mn_flash=@var{size} -mfract-convert-truncate -mno-interrupts
--mmain-is-OS_task -mrelax -mpmem-wrap-around
+-mmain-is-OS_task -moptimize -mrelax -mpmem-wrap-around
-mrmw -mstrict-addr-space-subsets -mstrict-X -mtiny-stack
-mrodata-in-ram -msplit-bit-shift -msplit-ldst -mshort-calls
-mskip-bug -muse-nonzero-bits -nodevicelib -nodevicespecs
@@ -24648,6 +24648,16 @@ aspect of the optimization.
@item -mfuse-move2
Run a post combine optimization pass that tries to fuse move instructions.
+@opindex moptimize
+@item -mno-optimize
+@itemx -moptimize
+Disable / enable AVR-specific optimization passes, all documented in this
+paragraph: @option{-mdemote-switch}, @option{-mfuse-add},
+@option{-mfuse-ifelse}, @option{-mfuse-move}, @option{-mfuse-move2},
+@option{-msplit-ldst}, @option{-msplit-bit-shift}, @option{-muse-nonzero-bits}.
+Usually, you don't need to specify this option because the respective passes
+are acivated by default when optimization is on.
+
@opindex mstrict-X
@item -mstrict-X
Use address register @code{X} in a way proposed by the hardware. This means