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

Reply via email to