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.
