This patch adds a new command line option -mdemote-switch as
a means to control the avr-casesi pass.

The switch is on provided optimization is active, which matches
the previous behavior of avr_pass_casesi::gate().

Ok for trunk?

Johann

--

gcc/
        * common/config/avr/avr-common.cc
        (avr_option_optimization_table) [OPT_LEVELS_1_PLUS]: Set
        -mdemote-switch.
        * config/avr/avr-passes.cc (avr_pass_casesi::gate):
        Require avropt_demote_switch to be on.
        * config/avr/avr.opt (mdemote-switch): New option.
        * config/avr/avr.opt.urls (mdemote-switch): Add UrlSuffix.
        * doc/invoke.texi (AVR Options): Document -mdemote-switch.
diff --git a/gcc/common/config/avr/avr-common.cc b/gcc/common/config/avr/avr-common.cc
index fb4f05553d7..875efde6681 100644
--- a/gcc/common/config/avr/avr-common.cc
+++ b/gcc/common/config/avr/avr-common.cc
@@ -42,6 +42,7 @@ static const struct default_options avr_option_optimization_table[] =
     { OPT_LEVELS_ALL, OPT_foptimize_crc, NULL, 0 },
     { OPT_LEVELS_1_PLUS_NOT_DEBUG, OPT_mgas_isr_prologues, NULL, 1 },
     { OPT_LEVELS_1_PLUS, OPT_mmain_is_OS_task, NULL, 1 },
+    { OPT_LEVELS_1_PLUS, OPT_mdemote_switch, NULL, 1 },
     { OPT_LEVELS_1_PLUS, OPT_mfuse_add_, NULL, 1 },
     { OPT_LEVELS_2_PLUS, OPT_mfuse_add_, NULL, 2 },
     { OPT_LEVELS_1_PLUS, OPT_mfuse_ifelse, NULL, 1 },
diff --git a/gcc/config/avr/avr-passes.cc b/gcc/config/avr/avr-passes.cc
index 42ddbb39064..d2b2d8421e0 100644
--- a/gcc/config/avr/avr-passes.cc
+++ b/gcc/config/avr/avr-passes.cc
@@ -3951,7 +3951,7 @@ public:
 
   bool gate (function *) final override
   {
-    return optimize > 0;
+    return optimize > 0 && avropt_demote_switch;
   }
 
   unsigned int execute (function *) final override;
diff --git a/gcc/config/avr/avr.opt b/gcc/config/avr/avr.opt
index 9c4be3ba93e..625c6b2440d 100644
--- a/gcc/config/avr/avr.opt
+++ b/gcc/config/avr/avr.opt
@@ -136,6 +136,10 @@ msp8
 Target RejectNegative Var(avropt_sp8) Init(0)
 This option is used internally for multilib generation and selection. The device has no SPH special function register.
 
+mdemote-switch
+Target Var(avropt_demote_switch) Init(0) Optimization
+Optimization. Demote switch values to the size as used in the program.
+
 mfuse-add
 Target Alias(mfuse-add=, 2, 0) Optimization
 Optimization. Split register additions from load/store instructions. Most useful on Reduced Tiny.
diff --git a/gcc/config/avr/avr.opt.urls b/gcc/config/avr/avr.opt.urls
index 197c706fff3..a04394894e7 100644
--- a/gcc/config/avr/avr.opt.urls
+++ b/gcc/config/avr/avr.opt.urls
@@ -75,6 +75,9 @@ UrlSuffix(gcc/AVR-Options.html#index-mrodata-in-ram)
 msp8
 UrlSuffix(gcc/AVR-Options.html#index-msp8)
 
+mdemote-switch
+UrlSuffix(gcc/AVR-Options.html#index-mdemote-switch)
+
 mfuse-add
 UrlSuffix(gcc/AVR-Options.html#index-mfuse-add)
 
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index a74e99081d3..3311ff94619 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -985,8 +985,8 @@ Objective-C and Objective-C++ Dialects}.
 
 @emph{AVR Options} (@ref{AVR Options})
 @gccoptlist{-mmcu=@var{mcu}  -mabsdata  -maccumulate-args -masm-len-notes
--mcvt  -mbranch-cost=@var{cost}  -mfuse-add=@var{level}  -mfuse-ifelse
--mfuse-move=@var{level}  -mfuse-move2
+-mbranch-cost=@var{cost}  -mcvt  -mdemote-switch  -mfuse-add=@var{level}
+-mfuse-ifelse  -mfuse-move=@var{level}  -mfuse-move2
 -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
@@ -24609,6 +24609,14 @@ integers. The default branch cost is 0.
 Functions prologues/epilogues are expanded as calls to appropriate
 subroutines.  Code size is smaller.
 
+@opindex mdemote-switch
+@item -mdemote-switch
+Without this option, the compiler will treat @code{switch} variables
+as 32-bit values at least.  When this option is on, an AVR-specific
+pass will try to demote such @code{switch} variables to the widths
+as actually used in the program.  This option is on per default when
+optimization is on.
+
 @opindex mfuse-add
 @item -mfuse-add
 @itemx -mno-fuse-add

Reply via email to