mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-23 21:31:54 +08:00
range_int_cst_p handling in extract_range_from_binary_expr_1
extract_range_from_binary_expr_1 had: if (range_int_cst_p (&vr0) && range_int_cst_p (&vr1) && TYPE_OVERFLOW_WRAPS (expr_type)) ... ... extract_range_from_multiplicative_op_1 (vr, code, &vr0, &vr1); but extract_range_from_multiplicative_op_1 also requires range_int_cst_p. I think we should bail out if either range isn't a constant. This might only be theoretical with current sources, but it's needed once polynomial constants are added. 2017-09-22 Richard Sandiford <richard.sandiford@linaro.org> Alan Hayward <alan.hayward@arm.com> David Sherwood <david.sherwood@arm.com> gcc/ * tree-vrp.c (extract_range_from_multiplicative_op_1): Assert for VR_RANGE only; don't allow VR_ANTI_RANGE. (extract_range_from_binary_expr_1): Don't call extract_range_from_multiplicative_op_1 if !range_int_cst_p. Co-Authored-By: Alan Hayward <alan.hayward@arm.com> Co-Authored-By: David Sherwood <david.sherwood@arm.com> From-SVN: r253102
This commit is contained in:
parent
f702e7d43f
commit
597fdf45ed
@ -1,3 +1,12 @@
|
||||
2017-09-22 Richard Sandiford <richard.sandiford@linaro.org>
|
||||
Alan Hayward <alan.hayward@arm.com>
|
||||
David Sherwood <david.sherwood@arm.com>
|
||||
|
||||
* tree-vrp.c (extract_range_from_multiplicative_op_1): Assert
|
||||
for VR_RANGE only; don't allow VR_ANTI_RANGE.
|
||||
(extract_range_from_binary_expr_1): Don't call
|
||||
extract_range_from_multiplicative_op_1 if !range_int_cst_p.
|
||||
|
||||
2017-09-22 Richard Sandiford <richard.sandiford@linaro.org>
|
||||
Alan Hayward <alan.hayward@arm.com>
|
||||
David Sherwood <david.sherwood@arm.com>
|
||||
|
@ -1851,8 +1851,7 @@ extract_range_from_multiplicative_op_1 (value_range *vr,
|
||||
|| code == ROUND_DIV_EXPR
|
||||
|| code == RSHIFT_EXPR
|
||||
|| code == LSHIFT_EXPR);
|
||||
gcc_assert ((vr0->type == VR_RANGE
|
||||
|| (code == MULT_EXPR && vr0->type == VR_ANTI_RANGE))
|
||||
gcc_assert (vr0->type == VR_RANGE
|
||||
&& vr0->type == vr1->type);
|
||||
|
||||
rtype = vr0->type;
|
||||
@ -2462,9 +2461,14 @@ extract_range_from_binary_expr_1 (value_range *vr,
|
||||
signop sign = TYPE_SIGN (expr_type);
|
||||
unsigned int prec = TYPE_PRECISION (expr_type);
|
||||
|
||||
if (range_int_cst_p (&vr0)
|
||||
&& range_int_cst_p (&vr1)
|
||||
&& TYPE_OVERFLOW_WRAPS (expr_type))
|
||||
if (!range_int_cst_p (&vr0)
|
||||
|| !range_int_cst_p (&vr1))
|
||||
{
|
||||
set_value_range_to_varying (vr);
|
||||
return;
|
||||
}
|
||||
|
||||
if (TYPE_OVERFLOW_WRAPS (expr_type))
|
||||
{
|
||||
typedef FIXED_WIDE_INT (WIDE_INT_MAX_PRECISION * 2) vrp_int;
|
||||
typedef generic_wide_int
|
||||
|
Loading…
x
Reference in New Issue
Block a user