https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66127
Bug ID: 66127 Summary: Division by zero gets folded away Product: gcc Version: 6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end Assignee: unassigned at gcc dot gnu.org Reporter: mpolacek at gcc dot gnu.org Target Milestone: --- In match.pd, we have (simplify (mult @0 integer_zerop@1) @1) so anything * 0 -> 0. That seems to be undesirable in case "anything" contains a division by zero. And a few lines below we have /* Make sure to preserve divisions by zero. This is the reason why we don't simplify x / x to 1 or 0 / x to 0. */ (for op (mult trunc_div ceil_div floor_div round_div exact_div) (simplify (op @0 integer_onep) (non_lvalue @0))) This means that int main (void) { int z = 0; int a = 0 * (1 / z); return a; } $ xgcc f.c; ./a.out is "ok", but e.g. int main (void) { int z = 0; int a = 1 * (1 / z); return a; } naturally results in SIGFPE. Yes, I know that division by zero is UB and there are no guarantees whatsoever, but this folding is causing me a grief in the C FE because while fold doesn't fold away "1 / 0", it folds "0 * (1 / 0)" into 0. That's bad when we find ourselves in a situation where a constant integer expression is required.