Commit 25722436 by Tom de Vries Committed by Tom de Vries

re PR tree-optimization/53986 (missing vrp on bit-mask test, LSHIFT_EXPR not handled)

2012-09-07  Tom de Vries  <tom@codesourcery.com>

	PR tree-optimization/53986
	* tree-vrp.c (extract_range_from_multiplicative_op_1): Allow
	LSHIFT_EXPR.
	(extract_range_from_binary_expr_1): Handle LSHIFT with constant range as
	shift amount.

From-SVN: r191057
parent 7fb3b7a7
2012-09-07 Tom de Vries <tom@codesourcery.com>
PR tree-optimization/53986
* tree-vrp.c (extract_range_from_multiplicative_op_1): Allow
LSHIFT_EXPR.
(extract_range_from_binary_expr_1): Handle LSHIFT with constant range as
shift amount.
2012-09-07 Segher Boessenkool <segher@kernel.crashing.org> 2012-09-07 Segher Boessenkool <segher@kernel.crashing.org>
* config/rs6000/aix43.h (RS6000_CALL_GLUE): Delete. * config/rs6000/aix43.h (RS6000_CALL_GLUE): Delete.
......
...@@ -2066,7 +2066,8 @@ extract_range_from_multiplicative_op_1 (value_range_t *vr, ...@@ -2066,7 +2066,8 @@ extract_range_from_multiplicative_op_1 (value_range_t *vr,
|| code == CEIL_DIV_EXPR || code == CEIL_DIV_EXPR
|| code == EXACT_DIV_EXPR || code == EXACT_DIV_EXPR
|| code == ROUND_DIV_EXPR || code == ROUND_DIV_EXPR
|| code == RSHIFT_EXPR); || code == RSHIFT_EXPR
|| code == LSHIFT_EXPR);
gcc_assert ((vr0->type == VR_RANGE gcc_assert ((vr0->type == VR_RANGE
|| (code == MULT_EXPR && vr0->type == VR_ANTI_RANGE)) || (code == MULT_EXPR && vr0->type == VR_ANTI_RANGE))
&& vr0->type == vr1->type); && vr0->type == vr1->type);
...@@ -2762,6 +2763,27 @@ extract_range_from_binary_expr_1 (value_range_t *vr, ...@@ -2762,6 +2763,27 @@ extract_range_from_binary_expr_1 (value_range_t *vr,
flag_wrapv = saved_flag_wrapv; flag_wrapv = saved_flag_wrapv;
return; return;
} }
else if (code == LSHIFT_EXPR
&& range_int_cst_p (&vr0))
{
int overflow_pos = TYPE_PRECISION (expr_type);
int bound_shift;
double_int bound;
if (!TYPE_UNSIGNED (expr_type))
overflow_pos -= 1;
bound_shift = overflow_pos - TREE_INT_CST_LOW (vr1.max);
bound = double_int_one.llshift (bound_shift,
TYPE_PRECISION (expr_type));
if (tree_to_double_int (vr0.max).ult (bound))
{
/* In the absense of overflow, (a << b) is equivalent
to (a * 2^b). */
extract_range_from_multiplicative_op_1 (vr, code, &vr0, &vr1);
return;
}
}
} }
set_value_range_to_varying (vr); set_value_range_to_varying (vr);
return; return;
......
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