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. Thanks, Richard. >2019-09-01 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 12:26:39.303884758 +0200 >+++ gcc/fold-const.c 2019-09-01 18:22:41.866023675 +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; > >@@ -5049,9 +5048,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