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

--- Comment #7 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The trunk branch has been updated by Avinash Jayakar <[email protected]>:

https://gcc.gnu.org/g:6883d51304f1aa852da3f2b4eb26bdf2e12bbcb9

commit r16-4464-g6883d51304f1aa852da3f2b4eb26bdf2e12bbcb9
Author: Avinash Jayakar <[email protected]>
Date:   Fri Oct 17 12:38:59 2025 +0530

    vect: Add pattern recognition for vectorizing {FLOOR,CEIL,ROUND}_{MOD,
DIV}_EXPR

    Added a new helper function "add_code_for_floorceilround_divmod" in
    tree-vect-patterns.cc for adding compensating code for each of the op
    {FLOOR,ROUND,CEIL}_{DIV,MOD}_EXPR. This function checks if target supports
all
    required operations required to implement these operation and generates
    vectorized code for the respective operations. Based on the following logic
    FLOOR_{DIV,MOD}
            r = x %[fl] y;
            r = x % y; if (r && (x ^ y) < 0) r += y;
            r = x/[fl] y;
            r = x % y; d = x/y; if (r && (x ^ y) < 0) d--;
    CEIL_{DIV,MOD} (unsigned)
            r = x %[cl] y;
            r = x % y; if (r) r -= y;
            r = x/[cl] y;
            r = x % y; d = x/y; if (r) d++;
    CEIL_{DIV,MOD} (signed)
            r = x %[cl] y;
            r = x % y; if (r && (x ^ y) >= 0) r -= y;
            r = x/[cl] y;
            r = x % y; d = x/y; if (r && (x ^ y) >= 0) d++;
    ROUND_{DIV,MOD} (unsigned)
            r = x %[rd] y;
            r = x % y; if (r > ((y-1)/2)) r -= y;
            r = x/[rd] y;
            r = x % y; d = x/y; if (r > ((y-1)/2)) d++;
    ROUND_{DIV,MOD} (signed)
            r = x %[rd] y;
            r = x % y; if (r > ((y-1)/2))
                    {if ((x ^ y) >= 0) r -= y; else r += y;}
            r = x/[rd] y;
            r = x % y; d = x/y; if ((r > ((y-1)/2)) && (x ^ y) >= 0)
                    {if ((x ^ y) >= 0) d++; else d--;}
    each of the case is implemented in a vectorized form.
    This function is then called in each of the path in
vect_recog_divmod_pattern,
    which there are 3, based on value of constant operand1,
    1. == 2
    2. == power of 2
    3. otherwise

    2025-10-17  Avinash Jayakar  <[email protected]>

    gcc/ChangeLog:
            PR tree-optimization/104116
            * tree-vect-patterns.cc (add_code_for_floorceilround_divmod): patt
recog
            for {FLOOR,ROUND,CEIL}_{DIV,MOD}_EXPR.
            (vect_recog_divmod_pattern): Call
add_code_for_floorceilround_divmod
            after computing div/mod for each control path.

    gcc/testsuite/ChangeLog:
            PR tree-optimization/104116
            * gcc.dg/vect/pr104116-ceil-div-2.c: New test.
            * gcc.dg/vect/pr104116-ceil-div-pow2.c: New test.
            * gcc.dg/vect/pr104116-ceil-div.c: New test.
            * gcc.dg/vect/pr104116-ceil-mod-2.c: New test.
            * gcc.dg/vect/pr104116-ceil-mod-pow2.c: New test.
            * gcc.dg/vect/pr104116-ceil-mod.c: New test.
            * gcc.dg/vect/pr104116-ceil-udiv-2.c: New test.
            * gcc.dg/vect/pr104116-ceil-udiv-pow2.c: New test.
            * gcc.dg/vect/pr104116-ceil-udiv.c: New test.
            * gcc.dg/vect/pr104116-ceil-umod-2.c: New test.
            * gcc.dg/vect/pr104116-ceil-umod-pow2.c: New test.
            * gcc.dg/vect/pr104116-ceil-umod.c: New test.
            * gcc.dg/vect/pr104116-floor-div-2.c: New test.
            * gcc.dg/vect/pr104116-floor-div-pow2.c: New test.
            * gcc.dg/vect/pr104116-floor-div.c: New test.
            * gcc.dg/vect/pr104116-floor-mod-2.c: New test.
            * gcc.dg/vect/pr104116-floor-mod-pow2.c: New test.
            * gcc.dg/vect/pr104116-floor-mod.c: New test.
            * gcc.dg/vect/pr104116-round-div-2.c: New test.
            * gcc.dg/vect/pr104116-round-div-pow2.c: New test.
            * gcc.dg/vect/pr104116-round-div.c: New test.
            * gcc.dg/vect/pr104116-round-mod-2.c: New test.
            * gcc.dg/vect/pr104116-round-mod-pow2.c: New test.
            * gcc.dg/vect/pr104116-round-mod.c: New test.
            * gcc.dg/vect/pr104116-round-udiv-2.c: New test.
            * gcc.dg/vect/pr104116-round-udiv-pow2.c: New test.
            * gcc.dg/vect/pr104116-round-udiv.c: New test.
            * gcc.dg/vect/pr104116-round-umod-2.c: New test.
            * gcc.dg/vect/pr104116-round-umod-pow2.c: New test.
            * gcc.dg/vect/pr104116-round-umod.c: New test.
            * gcc.dg/vect/pr104116.h: New test.

Reply via email to