https://gcc.gnu.org/g:e8add4e4e24a9cb4ee05fb0889b7eaaed3a218ee
commit r17-4641-ge8add4e4e24a9cb4ee05fb0889b7eaaed3a218ee Author: Georg-Johann Lay <[email protected]> Date: Fri Sep 25 10:52:52 2026 +0200 AVR: Add new option -moptimize for avr-specific passes. This is a collection option that can be used to disable / enable the avr-specific optimization passes -- currently 8 of them. 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: --- gcc/common/config/avr/avr-common.cc | 19 +++++++++++++++++++ gcc/config/avr/avr.opt | 4 ++++ gcc/config/avr/avr.opt.urls | 3 +++ gcc/doc/invoke.texi | 12 +++++++++++- 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/gcc/common/config/avr/avr-common.cc b/gcc/common/config/avr/avr-common.cc index 875efde66814..aa2a22e83d02 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 625c6b2440d7..c94385f53700 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 a04394894e78..a7d2d295f89e 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 20d82c620f67..feec1561850d 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 @@ -24660,6 +24660,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 activated 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
