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

Reply via email to