http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60962
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |missed-optimization Status|UNCONFIRMED |NEW Last reconfirmed| |2014-04-25 CC| |rguenth at gcc dot gnu.org Component|c++ |middle-end Ever confirmed|0 |1 --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- We retain + -2.f*point[] until RTL expansion where then somewhere following we have special code expanding 2.f * point[] but not -2.f * point[]. Confirmed. We should optimize A + -2.*B to A - 2. * B. I believe we did so at some point in the past. Looks like we do case PLUS_EXPR: /* A + (-B) -> A - B */ if (TREE_CODE (arg1) == NEGATE_EXPR && (flag_sanitize & SANITIZE_SI_OVERFLOW) == 0) return fold_build2_loc (loc, MINUS_EXPR, type, Which matches NEGATE_EXPR and doesn't use negate_expr_p for some reason (and sanitize check w/o checking we are processing integer types ...) But negate_expr_p has case REAL_CST: /* We want to canonicalize to positive real constants. Pretend that only negative ones can be easily negated. */ return REAL_VALUE_NEGATIVE (TREE_REAL_CST (t));