re PR go/91617 (Many go test case failures after r275026)
authorJakub Jelinek <jakub@redhat.com>
Mon, 2 Sep 2019 08:38:13 +0000 (10:38 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 2 Sep 2019 08:38:13 +0000 (10:38 +0200)
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.

From-SVN: r275299

gcc/ChangeLog
gcc/fold-const.c
gcc/match.pd

index c5857875896c6d585d53a7cf01ec4b84794dd034..a6bcdf909394d8c7a781ed1b67874dc2a21dbba7 100644 (file)
@@ -1,3 +1,14 @@
+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.
+
 2019-09-02  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gimple-ssa-strength-reduction.c (valid_mem_ref_cand_p): New function.
index 0376cdb73a426caff4b18d71116f02b8537019ba..a99dafec589ade7c49d4596619c4b8e92ff7a69b 100644 (file)
@@ -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 type, tree exp, int in_p,
   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);
index 13e41a933f7430405a47705562fc090cca2368b5..cd75dacd9cd4a3caf66d8c18e09e7edc2a02758d 100644 (file)
@@ -1569,8 +1569,6 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
        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);