https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91680
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |easyhack, | |missed-optimization Status|UNCONFIRMED |NEW Last reconfirmed| |2019-09-06 Ever confirmed|0 |1 --- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> --- Confirmed. /* (A / (1 << B)) -> (A >> B). Only for unsigned A. For signed A, this would not preserve rounding toward zero. For example: (-1 / ( 1 << B)) != -1 >> B. */ (simplify (trunc_div @0 (lshift integer_onep@1 @2)) (if ((TYPE_UNSIGNED (type) || tree_expr_nonnegative_p (@0)) && (!VECTOR_TYPE_P (type) || target_supports_op_p (type, RSHIFT_EXPR, optab_vector) || target_supports_op_p (type, RSHIFT_EXPR, optab_scalar))) (rshift @0 @2))) lacks a (convert? ...) on the divisor where at least sign-changes are OK.