https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116372
--- Comment #2 from Stefan Schulze Frielinghaus <stefansf at gcc dot gnu.org> --- Finally a more manageable reproducer: long x = -0x7fffffff - 1; int main (void) { long y = x % (-0xf - 1); if (-0x7fffffff - 1 + y == x == 0) __builtin_abort (); } If compiled with -O1 -march=z13 and r15-2889 execution is successful and fails with r15-2890 with r15-2903 manually applied on top. I haven't looked much into it but at least they deviate in ce1 where I see if-conversion succeeded through noce_convert_multiple_sets Of course, might be still a latent bug/something else.