https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93781
--- Comment #4 from vfdff <zhongyunde at huawei dot com> ---
according your prompt, I test it base on gcc 7.3, and the second testcase
works.
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -3301,6 +3301,18 @@ extract_range_from_binary_expr (value_range *vr,
else
set_value_range_to_varying (&vr1);
+ /* the [lr]shift operand with the range of [0, prec-1] */
+ if (code == LSHIFT_EXPR || code == RSHIFT_EXPR)
+ {
+ value_range shiftp = VR_INITIALIZER;
+ int prec = TYPE_PRECISION (expr_type);
+ shiftp.type = VR_RANGE;
+ shiftp.min = integer_zero_node;
+ shiftp.max = build_int_cst (expr_type, prec - 1);
+
+ vrp_intersect_ranges (&vr1, &shiftp);
+ }
+
========================================
Visiting statement:
_2 = 1 << arg_9;
Intersecting
~[3, 4294967294] EQUIVALENCES: { arg_5(D) } (1 elements)
and
[0, 31]
to
[0, 2] EQUIVALENCES: { arg_5(D) } (1 elements)
Found new range for _2: [1, 4]
marking stmt to be not simulated again