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

--- Comment #3 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-14 branch has been updated by Richard Sandiford
<rsand...@gcc.gnu.org>:

https://gcc.gnu.org/g:e49c265c59d7ba73e50fb7fe2784eb2874037642

commit r14-10905-ge49c265c59d7ba73e50fb7fe2784eb2874037642
Author: Richard Sandiford <richard.sandif...@arm.com>
Date:   Fri Nov 8 14:07:46 2024 +0000

    aarch64: Fix folding of degenerate svwhilele case [PR117045]

    The svwhilele folder mishandled the degenerate case in which
    the second argument is the maximum integer.  In that case,
    the result is all-true regardless of the first parameter:

      If the second scalar operand is equal to the maximum signed integer
      value then a condition which includes an equality test can never fail
      and the result will be an all-true predicate.

    This is because the conceptual "increment the first operand
    by 1 after each element" is done modulo the range of the operand.
    The GCC code was instead treating it as infinite precision.
    whilele_5.c even had a test for the incorrect behaviour.

    The easiest fix seemed to be to handle that case specially before
    doing constant folding.  This also copes with variable first operands.

    gcc/
            PR target/116999
            PR target/117045
            * config/aarch64/aarch64-sve-builtins-base.cc
            (svwhilelx_impl::fold): Check for WHILELTs of the minimum value
            and WHILELEs of the maximum value.  Fold them to all-false and
            all-true respectively.

    gcc/testsuite/
            PR target/116999
            PR target/117045
            * gcc.target/aarch64/sve/acle/general/whilele_5.c: Fix bogus
            expected result.
            * gcc.target/aarch64/sve/acle/general/whilele_11.c: New test.
            * gcc.target/aarch64/sve/acle/general/whilele_12.c: Likewise.

    (cherry picked from commit 50e7c51b0a0e9dc1d93f829016ae743b4f2e5070)

Reply via email to