From fa6b20f32c28aa34efc3c0ab609303d8371b57dd Mon Sep 17 00:00:00 2001 From: Aldy Hernandez Date: Wed, 17 Oct 2018 12:31:58 +0000 Subject: [PATCH] wide-int-range.h (wide_int_range_shift_undefined_p): Adjust to use sign as argument. * wide-int-range.h (wide_int_range_shift_undefined_p): Adjust to use sign as argument. * tree-vrp.c (extract_range_from_binary_expr_1): Pass sign to wide_int_range_shift_undefined_p. From-SVN: r265237 --- gcc/ChangeLog | 7 +++++++ gcc/tree-vrp.c | 3 ++- gcc/wide-int-range.h | 7 ++++--- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b398d1bef1f..4768b9635f8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-10-17 Aldy Hernandez + + * wide-int-range.h (wide_int_range_shift_undefined_p): Adjust to + use sign as argument. + * tree-vrp.c (extract_range_from_binary_expr_1): Pass sign to + wide_int_range_shift_undefined_p. + 2018-10-16 Kyrylo Tkachov * config/aarch64/aarch64.md (despeculate_copy): diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c index cbc2ea2f26b..c519613bb28 100644 --- a/gcc/tree-vrp.c +++ b/gcc/tree-vrp.c @@ -1521,7 +1521,8 @@ extract_range_from_binary_expr_1 (value_range *vr, || code == LSHIFT_EXPR) { if (range_int_cst_p (&vr1) - && !wide_int_range_shift_undefined_p (prec, + && !wide_int_range_shift_undefined_p (TYPE_SIGN (TREE_TYPE (vr1.min)), + prec, wi::to_wide (vr1.min), wi::to_wide (vr1.max))) { diff --git a/gcc/wide-int-range.h b/gcc/wide-int-range.h index e9ee418e5b2..0b2dd223987 100644 --- a/gcc/wide-int-range.h +++ b/gcc/wide-int-range.h @@ -128,10 +128,11 @@ extern bool wide_int_range_div (wide_int &wmin, wide_int &wmax, bool &extra_range_p, wide_int &extra_min, wide_int &extra_max); -/* Return TRUE if shifting by range [MIN, MAX] is undefined behavior. */ +/* Return TRUE if shifting by range [MIN, MAX] is undefined behavior, + interpreting MIN and MAX according to SIGN. */ inline bool -wide_int_range_shift_undefined_p (unsigned prec, +wide_int_range_shift_undefined_p (signop sign, unsigned prec, const wide_int &min, const wide_int &max) { /* ?? Note: The original comment said this only applied to @@ -142,7 +143,7 @@ wide_int_range_shift_undefined_p (unsigned prec, behavior from the shift operation. We cannot even trust SHIFT_COUNT_TRUNCATED at this stage, because that applies to rtl shifts, and the operation at the tree level may be widened. */ - return wi::sign_mask (min) || wi::ge_p (max, prec, UNSIGNED); + return wi::lt_p (min, 0, sign) || wi::ge_p (max, prec, sign); } /* Calculate MIN/MAX_EXPR of two ranges and store the result in [MIN, MAX]. */ -- 2.30.2