On Sun, Sep 01, 2019 at 06:44:15PM +0200, Richard Biener wrote: > On September 1, 2019 6:34:25 PM GMT+02:00, Jakub Jelinek <ja...@redhat.com> > wrote: > >On Sat, Aug 31, 2019 at 08:25:49PM +0200, Richard Biener wrote: > >> So why not always return an unsigned type then by telling > >type_for_size? > > > >So like this (if it passes bootstrap/regtest)? > > Yes.
Unfortunately that didn't work, because TYPE_MAX_VALUE/TYPE_MIN_VALUE are not present on POINTER_TYPEs. Here is an updated version that passed bootstrap/regtest on both x86_64-linux and i686-linux, ok for trunk? 2019-09-02 Jakub Jelinek <ja...@redhat.com> PR go/91617 * fold-const.c (range_check_type): For enumeral and boolean type, pass 1 to type_for_size langhook instead of TYPE_UNSIGNED (etype). Return unsigned_type_for result whenever etype isn't TYPE_UNSIGNED INTEGER_TYPE. (build_range_check): Don't call unsigned_type_for for pointer types. * match.pd (X / C1 op C2): Don't call unsigned_type_for on range_check_type result. --- gcc/fold-const.c.jj 2019-08-27 22:52:24.207334541 +0200 +++ gcc/fold-const.c 2019-09-01 22:46:17.091058145 +0200 @@ -4938,10 +4938,9 @@ range_check_type (tree etype) /* First make sure that arithmetics in this type is valid, then make sure that it wraps around. */ if (TREE_CODE (etype) == ENUMERAL_TYPE || TREE_CODE (etype) == BOOLEAN_TYPE) - etype = lang_hooks.types.type_for_size (TYPE_PRECISION (etype), - TYPE_UNSIGNED (etype)); + etype = lang_hooks.types.type_for_size (TYPE_PRECISION (etype), 1); - if (TREE_CODE (etype) == INTEGER_TYPE && !TYPE_OVERFLOW_WRAPS (etype)) + if (TREE_CODE (etype) == INTEGER_TYPE && !TYPE_UNSIGNED (etype)) { tree utype, minv, maxv; @@ -4959,6 +4958,8 @@ range_check_type (tree etype) else return NULL_TREE; } + else if (POINTER_TYPE_P (etype)) + etype = unsigned_type_for (etype); return etype; } @@ -5049,9 +5050,6 @@ build_range_check (location_t loc, tree if (etype == NULL_TREE) return NULL_TREE; - if (POINTER_TYPE_P (etype)) - etype = unsigned_type_for (etype); - high = fold_convert_loc (loc, etype, high); low = fold_convert_loc (loc, etype, low); exp = fold_convert_loc (loc, etype, exp); --- gcc/match.pd.jj 2019-08-27 12:26:40.745863588 +0200 +++ gcc/match.pd 2019-09-01 18:23:02.098729356 +0200 @@ -1569,8 +1569,6 @@ (define_operator_list COND_TERNARY tree etype = range_check_type (TREE_TYPE (@0)); if (etype) { - if (! TYPE_UNSIGNED (etype)) - etype = unsigned_type_for (etype); hi = fold_convert (etype, hi); lo = fold_convert (etype, lo); hi = const_binop (MINUS_EXPR, etype, hi, lo); Jakub