https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85588
--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> --- Or rather Index: gcc/fold-const.c =================================================================== --- gcc/fold-const.c (revision 259879) +++ gcc/fold-const.c (working copy) @@ -474,12 +474,15 @@ negate_expr_p (tree t) case EXACT_DIV_EXPR: if (TYPE_UNSIGNED (type)) break; - if (negate_expr_p (TREE_OPERAND (t, 0))) + /* In general we can't negate A in A / B, because if A is INT_MIN and + B is not 1 we change the sign of the result. */ + if (TREE_CODE (TREE_OPERAND (t, 0)) == INTEGER_CST + && negate_expr_p (TREE_OPERAND (t, 0))) return true; /* In general we can't negate B in A / B, because if A is INT_MIN and B is 1, we may turn this into INT_MIN / -1 which is undefined