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

--- Comment #17 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The master branch has been updated by Jakub Jelinek <ja...@gcc.gnu.org>:

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

commit r14-7030-gb1d4e5b51375efd285378173375d634ad6ba8462
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Tue Jan 9 10:31:51 2024 +0100

    vect: Ensure both NITERSM1 and NITERS are INTEGER_CSTs or neither of them
[PR113210]

    On the following testcase e.g. on riscv64 or aarch64 (latter with
    -O3 -march=armv8-a+sve ) we ICE, because while NITERS is INTEGER_CST,
    NITERSM1 is a complex expression like
    (short unsigned int) (a.0_1 + 255) + 1 > 256 ? ~(short unsigned int) (a.0_1
+ 255) : 0
    where a.0_1 is unsigned char.  The condition is never true, so the above
    is equivalent to just 0, but only when trying to fold the above with
    PLUS_EXPR 1 we manage to simplify it (first
    ~(short unsigned int) (a.0_1 + 255)
    to
    -(short unsigned int) (a.0_1 + 255)
    and then
    (short unsigned int) (a.0_1 + 255) + 1 > 256 ? -(short unsigned int) (a.0_1
+ 255) : 1
    to
    (short unsigned int) (a.0_1 + 255) >= 256 ? -(short unsigned int) (a.0_1 +
255) : 1
    and only at this point we fold the condition to be false.

    But the vectorizer seems to assume that if NITERS is known (i.e. suitable
    INTEGER_CST) then NITERSM1 also is, so the following hack ensures that if
    NITERS folds into INTEGER_CST NITERSM1 will be one as well.

    2024-01-09  Jakub Jelinek  <ja...@redhat.com>

            PR tree-optimization/113210
            * tree-vect-loop.cc (vect_get_loop_niters): If non-INTEGER_CST
            value in *number_of_iterationsm1 PLUS_EXPR 1 is folded into
            INTEGER_CST, recompute *number_of_iterationsm1 as the INTEGER_CST
            minus 1.

            * gcc.c-torture/compile/pr113210.c: New test.

Reply via email to