https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117726

--- Comment #1 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Georg-Johann Lay <g...@gcc.gnu.org>:

https://gcc.gnu.org/g:873cffc79209119a65aa657b0d427345e52b75c3

commit r15-5569-g873cffc79209119a65aa657b0d427345e52b75c3
Author: Georg-Johann Lay <a...@gjlay.de>
Date:   Wed Nov 20 12:25:18 2024 +0100

    AVR: target/117726 - Better optimizations of ASHIFT:SI insns.

    This patch improves the 4-byte ASHIFT insns.
    1) It adds a "r,r,C15" alternative for improved long << 15.
    2) It adds 3-operand alternatives (depending on options) and
       splits them after peephole2 / before avr-fuse-move into
       a 3-operand byte shift and a 2-operand residual bit shift.
    For better control, it introduces new option -msplit-bit-shift
    that's activated at -O2 and higher per default.  2) is even
    performed with -Os, but not with -Oz.

            PR target/117726
    gcc/
            * config/avr/avr.opt (-msplit-bit-shift): Add new optimization
option.
            * common/config/avr/avr-common.cc (avr_option_optimization_table)
            [OPT_LEVELS_2_PLUS]: Turn on -msplit-bit-shift.
            * config/avr/avr.h (machine_function.n_avr_fuse_add_executed):
            New bool component.
            * config/avr/avr.md (attr "isa") <2op, 3op>: Add new values.
            (attr "enabled"): Handle them.
            (ashlsi3, *ashlsi3, *ashlsi3_const): Add "r,r,C15" alternative.
            Add "r,0,C4l" and "r,r,C4l" alternatives (depending on 2op / 3op).
            (define_split) [avr_split_bit_shift]: Add 2 new ashift:ALL4
splitters.
            (define_peephole2) [ashift:ALL4]: Add (match_dup 3) so that the
scratch
            won't overlap with the output operand of the matched insn.
            (*ashl<mode>3_const_split): Remove unused ashift:ALL4 splitter.
            * config/avr/avr-passes.cc (emit_valid_insn)
            (emit_valid_move_clobbercc): Move out of anonymous namespace.
            (make_avr_pass_fuse_add) <gate>: Don't override.
            <execute>: Set n_avr_fuse_add_executed according to
            func->machine->n_avr_fuse_add_executed.
            (pass_data avr_pass_data_split_after_peephole2): New object.
            (avr_pass_split_after_peephole2): New rtl_opt_pass.
            (avr_emit_shift): New static function.
            (avr_shift_is_3op, avr_split_shift_p, avr_split_shift)
            (make_avr_pass_split_after_peephole2): New functions.
            * config/avr/avr-passes.def (avr_pass_split_after_peephole2):
            Insert new pass after pass_peephole2.
            * config/avr/avr-protos.h
            (n_avr_fuse_add_executed, avr_shift_is_3op, avr_split_shift_p)
            (avr_split_shift, avr_optimize_size_level)
            (make_avr_pass_split_after_peephole2): New prototypes.
            * config/avr/avr.cc (n_avr_fuse_add_executed): New global variable.
            (avr_optimize_size_level): New function.
            (avr_set_current_function): Set n_avr_fuse_add_executed
            according to cfun->machine->n_avr_fuse_add_executed.
            (ashlsi3_out) [case 15]: Output optimized code for this offset.
            (avr_rtx_costs_1) [ASHIFT, SImode]: Adjust costs of oggsets 15, 16.
            * config/avr/constraints.md (C4a, C4r, C4r): New constraints.
            * pass_manager.h (pass_manager): Adjust comments.

Reply via email to