From: Andre Vieira Date: Fri, 25 Apr 2025 13:02:43 +0000 (+0100) Subject: modulo-sched: reject loop conditions when not decrementing with one [PR 116479] X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8073fa147248aa67c11227f922d91d784659077e;p=thirdparty%2Fgcc.git 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 --git a/gcc/modulo-sched.cc b/gcc/modulo-sched.cc index 08af5a929e1..002346778f4 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 00000000000..dbbcb9aaf57 --- /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 +}