This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix up go regressions caused by my recent switchconv changes (PR go/91617)
- From: Richard Biener <rguenther at suse dot de>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Mon, 2 Sep 2019 10:31:08 +0200 (CEST)
- Subject: Re: [PATCH] Fix up go regressions caused by my recent switchconv changes (PR go/91617)
- References: <20190831131207.GF2120@tucnak> <E2E51816-8914-4806-B37B-31C010907DAC@suse.de> <20190831174117.GG2120@tucnak> <B2AB5F90-01CB-4AE1-AA44-6ED97A349719@suse.de> <20190901163425.GK2120@tucnak> <D9B22C84-0211-4A83-A518-EF00CF644479@suse.de> <20190902081421.GL2120@tucnak>
On Mon, 2 Sep 2019, Jakub Jelinek wrote:
> 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 <jakub@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?
OK.
Richard.
> 2019-09-02 Jakub Jelinek <jakub@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
>
--
Richard Biener <rguenther@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 247165 (AG München)