https://gcc.gnu.org/bugzilla/show_bug.cgi?id=77387

--- Comment #1 from kugan at gcc dot gnu.org ---
With :

diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
index e4d789b..2d1f4c8 100644
--- a/gcc/tree-vrp.c
+++ b/gcc/tree-vrp.c
@@ -3416,6 +3416,17 @@ extract_range_from_unary_expr_1 (value_range *vr,
          return;
        }

+      /* If SIGNED and VARYING set [0, TYPE_MAX].  */
+      if (!TYPE_UNSIGNED (type)
+         && vr0.type == VR_VARYING)
+       {
+         set_value_range (vr, VR_RANGE,
+                          build_int_cst (type, 0),
+                          vrp_val_max (type),
+                          NULL);
+         return;
+       }
+
       /* For the remaining varying or symbolic ranges we can't do anything
         useful.  */
       if (vr0.type == VR_VARYING


vrp1 dump becomes:
Value ranges after VRP:

_1: [0, 127]  EQUIVALENCES: { x_4 } (1 elements)
i_2(D): VARYING
x_3: [0, +INF]
x_4: [0, 127]
x_7: [0, 127]  EQUIVALENCES: { x_4 } (1 elements)


Folding predicate x_4 > 256 to 0
Removing basic block 5
Merging blocks 2 and 3
Merging blocks 2 and 4
foo (int i)
{
  int x;

  <bb 2>:
  x_3 = ABS_EXPR <i_2(D)>;
  x_4 = x_3 >> 24;
  return x_4;

}

Reply via email to