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

Reply via email to