diff options
author | Jakub Jelinek <jakub@redhat.com> | 2019-09-02 10:38:13 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2019-09-02 10:38:13 +0200 |
commit | 976f9aa1e8b30112c0932b761e815cafcc69641f (patch) | |
tree | 748ca02a13b7c28c337de39dce894845337d34c7 /gcc/fold-const.c | |
parent | 8756957f013a5fe8095890e0401fbf7dfd86c0c0 (diff) | |
download | gcc-976f9aa1e8b30112c0932b761e815cafcc69641f.zip gcc-976f9aa1e8b30112c0932b761e815cafcc69641f.tar.gz gcc-976f9aa1e8b30112c0932b761e815cafcc69641f.tar.bz2 |
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
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r-- | gcc/fold-const.c | 10 |
1 files changed, 4 insertions, 6 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 0376cdb..a99dafe 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); |