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

--- Comment #4 from CVS Commits <cvs-commit at gcc dot gnu.org> ---
The trunk branch has been updated by Richard Sandiford <rsand...@gcc.gnu.org>:

https://gcc.gnu.org/g:8e84b2b37a541b27feea69769fc314d534464ebd

commit r12-7249-g8e84b2b37a541b27feea69769fc314d534464ebd
Author: Richard Sandiford <richard.sandif...@arm.com>
Date:   Tue Feb 15 18:09:35 2022 +0000

    aarch64: Fix subs_compare_2.c regression [PR100874]

    subs_compare_2.c tests that we can use a SUBS+CSEL sequence for:

    unsigned int
    foo (unsigned int a, unsigned int b)
    {
      unsigned int x = a - 4;
      if (a < 4)
        return x;
      else
        return 0;
    }

    As Andrew notes in the PR, this is effectively MIN (x, 4) - 4,
    and it is now recognised as such by phiopt.  Previously it was
    if-converted in RTL instead.

    I tried to look for ways to generalise this to other situations
    and to other ?:-style operations, not just max and min.  However,
    for general ?: we tend to push an outer â- CSTâ into the arms of
    the ?: -- at least if one of them simplifies -- so I didn't find
    any useful abstraction.

    This patch therefore adds a pattern specifically for
    max/min(a,cst)-cst.  I'm not thrilled at having to do this,
    but it seems like the least worst fix in the circumstances.
    Also, max(a,cst)-cst for unsigned a is a useful saturating
    subtraction idiom and so is arguably worth its own code
    for that reason.

    gcc/
            PR target/100874
            * config/aarch64/aarch64-protos.h (aarch64_maxmin_plus_const):
            Declare.
            * config/aarch64/aarch64.cc (aarch64_maxmin_plus_const): New
function.
            * config/aarch64/aarch64.md (*aarch64_minmax_plus): New pattern.

    gcc/testsuite/
            * gcc.target/aarch64/max_plus_1.c: New test.
            * gcc.target/aarch64/max_plus_2.c: Likewise.
            * gcc.target/aarch64/max_plus_3.c: Likewise.
            * gcc.target/aarch64/max_plus_4.c: Likewise.
            * gcc.target/aarch64/max_plus_5.c: Likewise.
            * gcc.target/aarch64/max_plus_6.c: Likewise.
            * gcc.target/aarch64/max_plus_7.c: Likewise.
            * gcc.target/aarch64/min_plus_1.c: Likewise.
            * gcc.target/aarch64/min_plus_2.c: Likewise.
            * gcc.target/aarch64/min_plus_3.c: Likewise.
            * gcc.target/aarch64/min_plus_4.c: Likewise.
            * gcc.target/aarch64/min_plus_5.c: Likewise.
            * gcc.target/aarch64/min_plus_6.c: Likewise.
            * gcc.target/aarch64/min_plus_7.c: Likewise.
  • [Bug target/100874] [12 Regress... cvs-commit at gcc dot gnu.org via Gcc-bugs

Reply via email to