From 976f9aa1e8b30112c0932b761e815cafcc69641f Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 2 Sep 2019 10:38:13 +0200 Subject: [PATCH] re PR go/91617 (Many go test case failures after r275026) 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 | 11 +++++++++++ gcc/fold-const.c | 10 ++++------ gcc/match.pd | 2 -- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c5857875896..a6bcdf90939 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2019-09-02 Jakub Jelinek + + 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 * gimple-ssa-strength-reduction.c (valid_mem_ref_cand_p): New function. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 0376cdb73a4..a99dafec589 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -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); diff --git a/gcc/match.pd b/gcc/match.pd index 13e41a933f7..cd75dacd9cd 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -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); -- 2.30.2