register_edge_assert_for_2 operates on wide_ints of precision nprec
so a lot of the extensions are redundant.

Tested on x86_64-linux-gnu.  OK to install?

Thanks,
Richard


Index: gcc/tree-vrp.c
===================================================================
--- gcc/tree-vrp.c      2014-04-22 20:58:26.969683484 +0100
+++ gcc/tree-vrp.c      2014-04-22 21:00:26.670617168 +0100
@@ -5125,16 +5125,13 @@ register_edge_assert_for_2 (tree name, e
        {
          wide_int minv, maxv, valv, cst2v;
          wide_int tem, sgnbit;
-         bool valid_p = false, valn = false, cst2n = false;
+         bool valid_p = false, valn, cst2n;
          enum tree_code ccode = comp_code;
 
          valv = wide_int::from (val, nprec, UNSIGNED);
          cst2v = wide_int::from (cst2, nprec, UNSIGNED);
-         if (TYPE_SIGN (TREE_TYPE (val)) == SIGNED)
-           {
-             valn = wi::neg_p (wi::sext (valv, nprec));
-             cst2n = wi::neg_p (wi::sext (cst2v, nprec));
-           }
+         valn = wi::neg_p (valv, TYPE_SIGN (TREE_TYPE (val)));
+         cst2n = wi::neg_p (cst2v, TYPE_SIGN (TREE_TYPE (val)));
          /* If CST2 doesn't have most significant bit set,
             but VAL is negative, we have comparison like
             if ((x & 0x123) > -4) (always true).  Just give up.  */
@@ -5153,13 +5150,11 @@ register_edge_assert_for_2 (tree name, e
                 have folded the comparison into false) and
                 maximum unsigned value is VAL | ~CST2.  */
              maxv = valv | ~cst2v;
-             maxv = wi::zext (maxv, nprec);
              valid_p = true;
              break;
 
            case NE_EXPR:
              tem = valv | ~cst2v;
-             tem = wi::zext (tem, nprec);
              /* If VAL is 0, handle (X & CST2) != 0 as (X & CST2) > 0U.  */
              if (valv == 0)
                {
@@ -5176,7 +5171,7 @@ register_edge_assert_for_2 (tree name, e
                  sgnbit = wi::zero (nprec);
                  goto lt_expr;
                }
-             if (!cst2n && wi::neg_p (wi::sext (cst2v, nprec)))
+             if (!cst2n && wi::neg_p (cst2v))
                sgnbit = wi::set_bit_in_zero (nprec - 1, nprec);
              if (sgnbit != 0)
                {
@@ -5245,7 +5240,6 @@ register_edge_assert_for_2 (tree name, e
                  maxv -= 1;
                }
              maxv |= ~cst2v;
-             maxv = wi::zext (maxv, nprec);
              minv = sgnbit;
              valid_p = true;
              break;
@@ -5274,7 +5268,6 @@ register_edge_assert_for_2 (tree name, e
                }
              maxv -= 1;
              maxv |= ~cst2v;
-             maxv = wi::zext (maxv, nprec);
              minv = sgnbit;
              valid_p = true;
              break;
@@ -5283,7 +5276,7 @@ register_edge_assert_for_2 (tree name, e
              break;
            }
          if (valid_p
-             && wi::zext (maxv - minv, nprec) != wi::minus_one (nprec))
+             && (maxv - minv) != -1)
            {
              tree tmp, new_val, type;
              int i;

Reply via email to