https://gcc.gnu.org/g:8073fa147248aa67c11227f922d91d784659077e
commit r16-140-g8073fa147248aa67c11227f922d91d784659077e Author: Andre Vieira <andre.simoesdiasvie...@arm.com> Date: Fri Apr 25 14:02:43 2025 +0100 modulo-sched: reject loop conditions when not decrementing with one [PR 116479] In the commit titled 'doloop: Add support for predicated vectorized loops' the doloop_condition_get function was changed to accept loops with decrements larger than 1. This patch rejects such loops for modulo-sched. gcc/ChangeLog: PR rtl-optimization/116479 * modulo-sched.cc (doloop_register_get): Reject conditions with decrements that are not 1. gcc/testsuite/ChangeLog: * gcc.dg/pr116479.c: New test. Diff: --- gcc/modulo-sched.cc | 8 +++++++- gcc/testsuite/gcc.dg/pr116479.c | 26 ++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/gcc/modulo-sched.cc b/gcc/modulo-sched.cc index 08af5a929e14..002346778f44 100644 --- a/gcc/modulo-sched.cc +++ b/gcc/modulo-sched.cc @@ -356,7 +356,13 @@ doloop_register_get (rtx_insn *head, rtx_insn *tail) reg = XEXP (condition, 0); else if (GET_CODE (XEXP (condition, 0)) == PLUS && REG_P (XEXP (XEXP (condition, 0), 0))) - reg = XEXP (XEXP (condition, 0), 0); + { + if (CONST_INT_P (XEXP (condition, 1)) + && INTVAL (XEXP (condition, 1)) == -1) + reg = XEXP (XEXP (condition, 0), 0); + else + return NULL_RTX; + } else gcc_unreachable (); diff --git a/gcc/testsuite/gcc.dg/pr116479.c b/gcc/testsuite/gcc.dg/pr116479.c new file mode 100644 index 000000000000..dbbcb9aaf575 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr116479.c @@ -0,0 +1,26 @@ +/* PR 116479 */ +/* { dg-do run { target { bitint } } } */ +/* { dg-additional-options "-O -funroll-loops -finline-stringops -fmodulo-sched --param=max-iterations-computation-cost=637924687 -std=c23" } */ + +#if __BITINT_MAXWIDTH__ >= 13577 +_BitInt (13577) b; + +void +foo (char *ret) +{ + __builtin_memset (&b, 4, 697); + *ret = 0; +} +#endif + +int +main () +{ +#if __BITINT_MAXWIDTH__ >= 13577 + char x; + foo (&x); + for (unsigned i = 0; i < sizeof (x); i++) + if (x != 0) + __builtin_abort (); +#endif +}