On Wed, Jan 05, 2022 at 10:38:53AM +0100, Richard Biener via Gcc-patches wrote: > On Wed, Jan 5, 2022 at 10:18 AM Zhao Wei Liew <zhaoweil...@gmail.com> wrote: > > > > > X >= -1 && X <= 1 is (hopefully?) going to be simplified > > > as (unsigned)X + 1 <= 2, it might be good to simplify it this way > > > here as well? > > > > Yup, GCC does simplify it that way in the end, so I didn't really bother to > > simplify it here. That said, I'm open to simplifying it here as well, but > > I'm not sure how to do the unsigned cast. > > You'd do sth like > (with > { tree utype = unsigned_type_for (type); } > (cond (le (plus (convert:utype @0) { build_one_cst (utype); }) { > build_int_cst (utype, 2); }) ...) > > extra tricky will be 1 bit integer types, I guess it might be easiest > to exclude them > and special case them separately - X / Y is always X for them I think,
Note, we already have: /* X / bool_range_Y is X. */ (simplify (div @0 SSA_NAME@1) (if (INTEGRAL_TYPE_P (type) && ssa_name_has_boolean_range (@1)) @0)) for those. Jakub