Commit fa6b20f3 by Aldy Hernandez Committed by Aldy Hernandez

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
parent cd1e244a
2018-10-17 Aldy Hernandez <aldyh@redhat.com>
* 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 <kyrylo.tkachov@arm.com> 2018-10-16 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
* config/aarch64/aarch64.md (despeculate_copy<ALLI_TI:mode>): * config/aarch64/aarch64.md (despeculate_copy<ALLI_TI:mode>):
...@@ -1521,7 +1521,8 @@ extract_range_from_binary_expr_1 (value_range *vr, ...@@ -1521,7 +1521,8 @@ extract_range_from_binary_expr_1 (value_range *vr,
|| code == LSHIFT_EXPR) || code == LSHIFT_EXPR)
{ {
if (range_int_cst_p (&vr1) 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.min),
wi::to_wide (vr1.max))) wi::to_wide (vr1.max)))
{ {
......
...@@ -128,10 +128,11 @@ extern bool wide_int_range_div (wide_int &wmin, wide_int &wmax, ...@@ -128,10 +128,11 @@ extern bool wide_int_range_div (wide_int &wmin, wide_int &wmax,
bool &extra_range_p, bool &extra_range_p,
wide_int &extra_min, wide_int &extra_max); 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 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) const wide_int &min, const wide_int &max)
{ {
/* ?? Note: The original comment said this only applied to /* ?? Note: The original comment said this only applied to
...@@ -142,7 +143,7 @@ wide_int_range_shift_undefined_p (unsigned prec, ...@@ -142,7 +143,7 @@ wide_int_range_shift_undefined_p (unsigned prec,
behavior from the shift operation. We cannot even trust behavior from the shift operation. We cannot even trust
SHIFT_COUNT_TRUNCATED at this stage, because that applies to rtl SHIFT_COUNT_TRUNCATED at this stage, because that applies to rtl
shifts, and the operation at the tree level may be widened. */ 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]. */ /* Calculate MIN/MAX_EXPR of two ranges and store the result in [MIN, MAX]. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment