https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79721
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |wrong-code Status|UNCONFIRMED |NEW Last reconfirmed| |2017-02-27 CC| |rguenth at gcc dot gnu.org Ever confirmed|0 |1 --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- SCCP currently guards doing everything in unsigned arithmetic with /* If def's type has undefined overflow and there were folded casts, rewrite all stmts added for def into arithmetics with defined overflow behavior. */ if (folded_casts && ANY_INTEGRAL_TYPE_P (TREE_TYPE (def)) && TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (def))) { but here folded_casts is false. Clearly the above is bogus as it doesn't take into account that computing the final value replacement involves association. So the "fix" would be to unconditionally rewrite the expression to use unsigned arithmetic (even for ! TYPE_OVERFLOW_UNDEFINED, which should have been TYPE_OVERFLOW_WRAPS anyway).