On Wed, 9 Dec 2020, Jakub Jelinek wrote: > On Wed, Dec 09, 2020 at 09:03:36AM +0100, Richard Biener wrote: > > So maybe do > > > > > if (TREE_CODE (TREE_TYPE (lhs)) == BOOLEAN_TYPE > > && TYPE_PRECISION (TREE_TYPE (lhs)) == 1) > > > > and thus rely on get_range_info for Ada? > > So, like this instead (if it passes bootstrap/regtest)? > Basically, for non-VR_RANGE just use VARYING min/max manually. > The min + 1 != max check will then do the rest.
Yep, that looks safest. OK. Richard. > 2020-12-09 Jakub Jelinek <ja...@redhat.com> > > PR bootstrap/98188 > * tree-ssa-phiopt.c (two_value_replacement): Don't special case > BOOLEAN_TYPEs for ranges, instead if get_range_info doesn't return > VR_RANGE, set min/max to wi::min/max_value. > > --- gcc/tree-ssa-phiopt.c.jj 2020-12-08 15:43:17.399463613 +0100 > +++ gcc/tree-ssa-phiopt.c 2020-12-09 09:39:18.713046374 +0100 > @@ -658,13 +658,13 @@ two_value_replacement (basic_block cond_ > return false; > > wide_int min, max; > - if (TREE_CODE (TREE_TYPE (lhs)) == BOOLEAN_TYPE) > + if (get_range_info (lhs, &min, &max) != VR_RANGE) > { > - min = wi::to_wide (boolean_false_node); > - max = wi::to_wide (boolean_true_node); > + int prec = TYPE_PRECISION (TREE_TYPE (lhs)); > + signop sgn = TYPE_SIGN (TREE_TYPE (lhs)); > + min = wi::min_value (prec, sgn); > + max = wi::max_value (prec, sgn); > } > - else if (get_range_info (lhs, &min, &max) != VR_RANGE) > - return false; > if (min + 1 != max > || (wi::to_wide (rhs) != min > && wi::to_wide (rhs) != max)) > > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)