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

--- Comment #62 from CVS 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:30a8771c0f5ddcbc329408c3bbf4f100b01acca9

commit r14-1688-g30a8771c0f5ddcbc329408c3bbf4f100b01acca9
Author: Georg-Johann Lay <a...@gjlay.de>
Date:   Sat Jun 10 21:47:53 2023 +0200

    target/109650: Fix wrong code after cc0 -> CCmode transition.

    This patch fixes a wrong-code bug in the wake of PR92729, the transition
that
    turned the AVR backend from cc0 to CCmode.  In cc0, the insn that uses cc0
like
    a conditional branch always follows the cc0 setter, which is no more the
case
    with CCmode where set and use of REG_CC might be in different basic blocks.

    This patch removes the machine-dependent reorg pass in avr_reorg entirely.

    It is replaced by a new, AVR specific mini-pass that runs prior to split2.
    Canonicalization of comparisons away from the "difficult" codes GT[U] and
LE[U]
    is now mostly performed by implementing TARGET_CANONICALIZE_COMPARISON.

    Moreover:

    * Text peephole conditions get "dead_or_set_regno_p (*, REG_CC)" as needed.

    * RTL peephole conditions get "peep2_regno_dead_p (*, REG_CC)" as needed.

    * Conditional branches no more clobber REG_CC.

    * insn output for compares looks ahead to determine the branch mode in use.
      This needs also "dead_or_set_regno_p (*, REG_CC)".

    * Add RTL peepholes for decrement-and-branch detection.

    * Some of the patterns like "*cmphi.zero-extend.0" lost their
      combine-ational part wit PR92729.  Restore them.

    Finally, it fixes some of the many indentation glitches left over from
PR92729.

    gcc/
            PR target/109650
            PR target/92729
            * config/avr/avr-passes.def (avr_pass_ifelse): Insert new pass.
            * config/avr/avr.cc (avr_pass_ifelse): New RTL pass.
            (avr_pass_data_ifelse): New pass_data for it.
            (make_avr_pass_ifelse, avr_redundant_compare, avr_cbranch_cost)
            (avr_canonicalize_comparison, avr_out_plus_set_ZN)
            (avr_out_cmp_ext): New functions.
            (compare_condtition): Make sure REG_CC dies in the branch insn.
            (avr_rtx_costs_1): Add computation of cbranch costs.
            (avr_adjust_insn_length) [ADJUST_LEN_ADD_SET_ZN,
ADJUST_LEN_CMP_ZEXT]:
            [ADJUST_LEN_CMP_SEXT]Handle them.
            (TARGET_CANONICALIZE_COMPARISON): New define.
            (avr_simplify_comparison_p, compare_diff_p, avr_compare_pattern)
            (avr_reorg_remove_redundant_compare, avr_reorg): Remove functions.
            (TARGET_MACHINE_DEPENDENT_REORG): Remove define.
            * config/avr/avr-protos.h (avr_simplify_comparison_p): Remove
proto.
            (make_avr_pass_ifelse, avr_out_plus_set_ZN, cc_reg_rtx)
            (avr_out_cmp_zext): New Protos
            * config/avr/avr.md (branch, difficult_branch): Don't split insns.
            (*cbranchhi.zero-extend.0", *cbranchhi.zero-extend.1")
            (*swapped_tst<mode>, *add.for.eqne.<mode>): New insns.
            (*cbranch<mode>4): Rename to cbranch<mode>4_insn.
            (define_peephole): Add dead_or_set_regno_p(insn,REG_CC) as needed.
            (define_deephole2): Add peep2_regno_dead_p(*,REG_CC) as needed.
            Add new RTL peepholes for decrement-and-branch and
*swapped_tst<mode>.
            Rework signtest-and-branch peepholes for *sbrx_branch<mode>.
            (adjust_len) [add_set_ZN, cmp_zext]: New.
            (QIPSI): New mode iterator.
            (ALLs1, ALLs2, ALLs4, ALLs234): New mode iterators.
            (gelt): New code iterator.
            (gelt_eqne): New code attribute.
            (rvbranch, *rvbranch, difficult_rvbranch, *difficult_rvbranch)
            (branch_unspec, *negated_tst<mode>, *reversed_tst<mode>)
            (*cmpqi_sign_extend): Remove insns.
            (define_c_enum "unspec") [UNSPEC_IDENTITY]: Remove.
            * config/avr/avr-dimode.md (cbranch<mode>4): Canonicalize
comparisons.
            * config/avr/predicates.md (scratch_or_d_register_operand): New.
            * config/avr/constraints.md (Yxx): New constraint.

    gcc/testsuite/
            PR target/109650
            * gcc.target/avr/torture/pr109650-1.c: New test.
            * gcc.target/avr/torture/pr109650-2.c: New test.

Reply via email to