https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116799
--- Comment #7 from Jakub Jelinek <jakub at gcc dot gnu.org> --- Slightly reduced testcase: const char *l; __attribute__((noipa)) void foo (const char *x, const char *y, int z) { if (x != l + 1 || y != x || z) __builtin_abort (); } __attribute__((noipa)) void bar (const char *x, char *v) { const char *w = x + __builtin_strlen (x); while (x[0] == '*' && x < w - 1) x++; const char *y = w - 1; int z = 1; if (y >= x) { while (y - x > 0 && *y == '*') y--; z = 0; } int i = 0; if (z) v[i++] = 'a'; v[i] = 'b'; foo (x, y, z); } int main () { char v[2] = { 0 }; l = "**"; bar (l, v); }