diff mbox

Optimize in VRP if ((x & cst1) cmp cst2) (PR tree-optimization/52267)

Message ID 20120314172902.GY16117@tyan-ft48-01.lab.bos.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek March 14, 2012, 5:29 p.m. UTC
Hi!

This patch adds ASSERT_EXPRs derived from
  tmp_N = var_M & cst2;
  if (tmp_N cmp val)
where cst2 and val are constants.  Bootstrapped/regtested
on x86_64-linux and i686-linux, ok for trunk?

2012-03-14  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/52267
	* tree-vrp.c (masked_increment): New function.
	(register_edge_assert_for_2): Derive ASSERT_EXPRs
	from (X & CST1) cmp CST2 tests.

	* gcc.dg/pr52267.c: New test.
	* gcc.dg/tree-ssa/vrp65.c: New test.
	* gcc.dg/tree-ssa/vrp66.c: New test.


	Jakub

Comments

Richard Biener March 15, 2012, 9:42 a.m. UTC | #1
On Wed, Mar 14, 2012 at 6:29 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> This patch adds ASSERT_EXPRs derived from
>  tmp_N = var_M & cst2;
>  if (tmp_N cmp val)
> where cst2 and val are constants.  Bootstrapped/regtested
> on x86_64-linux and i686-linux, ok for trunk?

Ok.

Thanks,
Richard.

> 2012-03-14  Jakub Jelinek  <jakub@redhat.com>
>
>        PR tree-optimization/52267
>        * tree-vrp.c (masked_increment): New function.
>        (register_edge_assert_for_2): Derive ASSERT_EXPRs
>        from (X & CST1) cmp CST2 tests.
>
>        * gcc.dg/pr52267.c: New test.
>        * gcc.dg/tree-ssa/vrp65.c: New test.
>        * gcc.dg/tree-ssa/vrp66.c: New test.
>
> --- gcc/tree-vrp.c.jj   2012-03-14 09:39:41.574262693 +0100
> +++ gcc/tree-vrp.c      2012-03-14 13:22:49.468537249 +0100
> @@ -4338,6 +4338,34 @@ extract_code_and_val_from_cond_with_ops
>   return true;
>  }
>
> +/* Find out smallest RES where RES > VAL && (RES & MASK) == RES, if any
> +   (otherwise return VAL).  VAL and MASK must be zero-extended for
> +   precision PREC.  If SGNBIT is non-zero, first xor VAL with SGNBIT
> +   (to transform signed values into unsigned) and at the end xor
> +   SGNBIT back.  */
> +
> +static double_int
> +masked_increment (double_int val, double_int mask, double_int sgnbit,
> +                 unsigned int prec)
> +{
> +  double_int bit = double_int_one, res;
> +  unsigned int i;
> +
> +  val = double_int_xor (val, sgnbit);
> +  for (i = 0; i < prec; i++, bit = double_int_add (bit, bit))
> +    {
> +      res = mask;
> +      if (double_int_zero_p (double_int_and (res, bit)))
> +       continue;
> +      res = double_int_sub (bit, double_int_one);
> +      res = double_int_and_not (double_int_add (val, bit), res);
> +      res = double_int_and (res, mask);
> +      if (double_int_ucmp (res, val) > 0)
> +       return double_int_xor (res, sgnbit);
> +    }
> +  return double_int_xor (val, sgnbit);
> +}
> +
>  /* Try to register an edge assertion for SSA name NAME on edge E for
>    the condition COND contributing to the conditional jump pointed to by BSI.
>    Invert the condition COND if INVERT is true.
> @@ -4466,7 +4494,7 @@ register_edge_assert_for_2 (tree name, e
>       && TREE_CODE (val) == INTEGER_CST)
>     {
>       gimple def_stmt = SSA_NAME_DEF_STMT (name);
> -      tree name2 = NULL_TREE, cst2 = NULL_TREE;
> +      tree name2 = NULL_TREE, names[2], cst2 = NULL_TREE;
>       tree val2 = NULL_TREE;
>       double_int mask = double_int_zero;
>       unsigned int prec = TYPE_PRECISION (TREE_TYPE (val));
> @@ -4591,6 +4619,248 @@ register_edge_assert_for_2 (tree name, e
>              retval = true;
>            }
>        }
> +
> +      /* Add asserts for NAME cmp CST and NAME being defined as
> +        NAME = NAME2 & CST2.
> +
> +        Extract CST2 from the and.  */
> +      names[0] = NULL_TREE;
> +      names[1] = NULL_TREE;
> +      cst2 = NULL_TREE;
> +      if (is_gimple_assign (def_stmt)
> +         && gimple_assign_rhs_code (def_stmt) == BIT_AND_EXPR)
> +       {
> +         name2 = gimple_assign_rhs1 (def_stmt);
> +         cst2 = gimple_assign_rhs2 (def_stmt);
> +         if (TREE_CODE (name2) == SSA_NAME
> +             && INTEGRAL_TYPE_P (TREE_TYPE (name2))
> +             && TREE_CODE (cst2) == INTEGER_CST
> +             && !integer_zerop (cst2)
> +             && prec <= 2 * HOST_BITS_PER_WIDE_INT
> +             && (prec > 1
> +                 || TYPE_UNSIGNED (TREE_TYPE (val))))
> +           {
> +             gimple def_stmt2 = SSA_NAME_DEF_STMT (name2);
> +             if (gimple_assign_cast_p (def_stmt2))
> +               {
> +                 names[1] = gimple_assign_rhs1 (def_stmt2);
> +                 if (!CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def_stmt2))
> +                     || !INTEGRAL_TYPE_P (TREE_TYPE (names[1]))
> +                     || (TYPE_PRECISION (TREE_TYPE (name2))
> +                         != TYPE_PRECISION (TREE_TYPE (names[1])))
> +                     || !live_on_edge (e, names[1])
> +                     || has_single_use (names[1]))
> +                   names[1] = NULL_TREE;
> +               }
> +             if (live_on_edge (e, name2)
> +                 && !has_single_use (name2))
> +               names[0] = name2;
> +           }
> +       }
> +      if (names[0] || names[1])
> +       {
> +         double_int minv, maxv = double_int_zero, valv, cst2v;
> +         double_int tem, sgnbit;
> +         bool valid_p = false, valn = false, cst2n = false;
> +         enum tree_code ccode = comp_code;
> +
> +         valv = double_int_zext (tree_to_double_int (val), prec);
> +         cst2v = double_int_zext (tree_to_double_int (cst2), prec);
> +         if (!TYPE_UNSIGNED (TREE_TYPE (val)))
> +           {
> +             valn = double_int_negative_p (double_int_sext (valv, prec));
> +             cst2n = double_int_negative_p (double_int_sext (cst2v, prec));
> +           }
> +         /* 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.  */
> +         if (!cst2n && valn)
> +           ccode = ERROR_MARK;
> +         if (cst2n)
> +           sgnbit = double_int_zext (double_int_lshift (double_int_one,
> +                                                        prec - 1, prec,
> +                                                        false), prec);
> +         else
> +           sgnbit = double_int_zero;
> +         minv = double_int_and (valv, cst2v);
> +         switch (ccode)
> +           {
> +           case EQ_EXPR:
> +             /* Minimum unsigned value for equality is VAL & CST2
> +                (should be equal to VAL, otherwise we probably should
> +                have folded the comparison into false) and
> +                maximum unsigned value is VAL | ~CST2.  */
> +             maxv = double_int_ior (valv, double_int_not (cst2v));
> +             maxv = double_int_zext (maxv, prec);
> +             valid_p = true;
> +             break;
> +           case NE_EXPR:
> +             tem = double_int_ior (valv, double_int_not (cst2v));
> +             tem = double_int_zext (tem, prec);
> +             /* If VAL is 0, handle (X & CST2) != 0 as (X & CST2) > 0U.  */
> +             if (double_int_zero_p (valv))
> +               {
> +                 cst2n = false;
> +                 sgnbit = double_int_zero;
> +                 goto gt_expr;
> +               }
> +             /* If (VAL | ~CST2) is all ones, handle it as
> +                (X & CST2) < VAL.  */
> +             if (double_int_equal_p (tem, double_int_mask (prec)))
> +               {
> +                 cst2n = false;
> +                 valn = false;
> +                 sgnbit = double_int_zero;
> +                 goto lt_expr;
> +               }
> +             if (!cst2n
> +                 && double_int_negative_p (double_int_sext (cst2v, prec)))
> +               sgnbit = double_int_zext (double_int_lshift (double_int_one,
> +                                                            prec - 1, prec,
> +                                                            false), prec);
> +             if (!double_int_zero_p (sgnbit))
> +               {
> +                 if (double_int_equal_p (valv, sgnbit))
> +                   {
> +                     cst2n = true;
> +                     valn = true;
> +                     goto gt_expr;
> +                   }
> +                 if (double_int_equal_p (tem, double_int_mask (prec - 1)))
> +                   {
> +                     cst2n = true;
> +                     goto lt_expr;
> +                   }
> +                 if (!cst2n)
> +                   sgnbit = double_int_zero;
> +               }
> +             break;
> +           case GE_EXPR:
> +             /* Minimum unsigned value for >= if (VAL & CST2) == VAL
> +                is VAL and maximum unsigned value is ~0.  For signed
> +                comparison, if CST2 doesn't have most significant bit
> +                set, handle it similarly.  If CST2 has MSB set,
> +                the minimum is the same, and maximum is ~0U/2.  */
> +             if (!double_int_equal_p (minv, valv))
> +               {
> +                 /* If (VAL & CST2) != VAL, X & CST2 can't be equal to
> +                    VAL.  */
> +                 minv = masked_increment (valv, cst2v, sgnbit, prec);
> +                 if (double_int_equal_p (minv, valv))
> +                   break;
> +               }
> +             maxv = double_int_mask (prec - (cst2n ? 1 : 0));
> +             valid_p = true;
> +             break;
> +           case GT_EXPR:
> +           gt_expr:
> +             /* Find out smallest MINV where MINV > VAL
> +                && (MINV & CST2) == MINV, if any.  If VAL is signed and
> +                CST2 has MSB set, compute it biased by 1 << (prec - 1).  */
> +             minv = masked_increment (valv, cst2v, sgnbit, prec);
> +             if (double_int_equal_p (minv, valv))
> +               break;
> +             maxv = double_int_mask (prec - (cst2n ? 1 : 0));
> +             valid_p = true;
> +             break;
> +           case LE_EXPR:
> +             /* Minimum unsigned value for <= is 0 and maximum
> +                unsigned value is VAL | ~CST2 if (VAL & CST2) == VAL.
> +                Otherwise, find smallest VAL2 where VAL2 > VAL
> +                && (VAL2 & CST2) == VAL2 and use (VAL2 - 1) | ~CST2
> +                as maximum.
> +                For signed comparison, if CST2 doesn't have most
> +                significant bit set, handle it similarly.  If CST2 has
> +                MSB set, the maximum is the same and minimum is INT_MIN.  */
> +             if (double_int_equal_p (minv, valv))
> +               maxv = valv;
> +             else
> +               {
> +                 maxv = masked_increment (valv, cst2v, sgnbit, prec);
> +                 if (double_int_equal_p (maxv, valv))
> +                   break;
> +                 maxv = double_int_sub (maxv, double_int_one);
> +               }
> +             maxv = double_int_ior (maxv, double_int_not (cst2v));
> +             maxv = double_int_zext (maxv, prec);
> +             minv = sgnbit;
> +             valid_p = true;
> +             break;
> +           case LT_EXPR:
> +           lt_expr:
> +             /* Minimum unsigned value for < is 0 and maximum
> +                unsigned value is (VAL-1) | ~CST2 if (VAL & CST2) == VAL.
> +                Otherwise, find smallest VAL2 where VAL2 > VAL
> +                && (VAL2 & CST2) == VAL2 and use (VAL2 - 1) | ~CST2
> +                as maximum.
> +                For signed comparison, if CST2 doesn't have most
> +                significant bit set, handle it similarly.  If CST2 has
> +                MSB set, the maximum is the same and minimum is INT_MIN.  */
> +             if (double_int_equal_p (minv, valv))
> +               {
> +                 if (double_int_equal_p (valv, sgnbit))
> +                   break;
> +                 maxv = valv;
> +               }
> +             else
> +               {
> +                 maxv = masked_increment (valv, cst2v, sgnbit, prec);
> +                 if (double_int_equal_p (maxv, valv))
> +                   break;
> +               }
> +             maxv = double_int_sub (maxv, double_int_one);
> +             maxv = double_int_ior (maxv, double_int_not (cst2v));
> +             maxv = double_int_zext (maxv, prec);
> +             minv = sgnbit;
> +             valid_p = true;
> +             break;
> +           default:
> +             break;
> +           }
> +         if (valid_p
> +             && !double_int_equal_p (double_int_zext (double_int_sub (maxv,
> +                                                                      minv),
> +                                                      prec),
> +                                     double_int_mask (prec)))
> +           {
> +             tree tmp, new_val, type;
> +             int i;
> +
> +             for (i = 0; i < 2; i++)
> +               if (names[i])
> +                 {
> +                   double_int maxv2 = maxv;
> +                   tmp = names[i];
> +                   type = TREE_TYPE (names[i]);
> +                   if (!TYPE_UNSIGNED (type))
> +                     {
> +                       type = build_nonstandard_integer_type (prec, 1);
> +                       tmp = build1 (NOP_EXPR, type, names[i]);
> +                     }
> +                   if (!double_int_zero_p (minv))
> +                     {
> +                       tmp = build2 (PLUS_EXPR, type, tmp,
> +                                     double_int_to_tree (type,
> +                                                         double_int_neg (minv)));
> +                       maxv2 = double_int_sub (maxv, minv);
> +                     }
> +                   new_val = double_int_to_tree (type, maxv2);
> +
> +                   if (dump_file)
> +                     {
> +                       fprintf (dump_file, "Adding assert for ");
> +                       print_generic_expr (dump_file, names[i], 0);
> +                       fprintf (dump_file, " from ");
> +                       print_generic_expr (dump_file, tmp, 0);
> +                       fprintf (dump_file, "\n");
> +                     }
> +
> +                   register_new_assert_for (names[i], tmp, LE_EXPR,
> +                                            new_val, NULL, e, bsi);
> +                   retval = true;
> +                 }
> +           }
> +       }
>     }
>
>   return retval;
> --- gcc/testsuite/gcc.dg/pr52267.c.jj   2012-03-14 09:46:35.580831461 +0100
> +++ gcc/testsuite/gcc.dg/pr52267.c      2012-03-14 09:46:35.658831129 +0100
> @@ -0,0 +1,24 @@
> +/* PR tree-optimization/52267 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fdump-tree-optimized" } */
> +
> +int
> +foo (int a, int b)
> +{
> +  if (a > 3 || a < 0)
> +    return a;
> +  a &= 3;
> +  return a & 3;
> +}
> +
> +int
> +bar (int a)
> +{
> +  if (a & ~3)
> +    return a;
> +  return a & 3;
> +}
> +
> +/* { dg-final { scan-tree-dump-not "& 3" "optimized" } } */
> +/* { dg-final { scan-tree-dump-not "& -4" "optimized" } } */
> +/* { dg-final { cleanup-tree-dump "optimized" } } */
> --- gcc/testsuite/gcc.dg/tree-ssa/vrp65.c.jj    2012-03-14 09:46:35.665830990 +0100
> +++ gcc/testsuite/gcc.dg/tree-ssa/vrp65.c       2012-03-14 14:55:04.000000000 +0100
> @@ -0,0 +1,376 @@
> +/* PR tree-optimization/52267 */
> +/* { dg-do link } */
> +/* { dg-options "-O2" } */
> +
> +extern void link_error (void);
> +
> +#define BITSM1 (sizeof (int) * __CHAR_BIT__ - 1)
> +#define BITSH ((sizeof (int) - sizeof (short)) * __CHAR_BIT__)
> +
> +void
> +f1 (unsigned int s)
> +{
> +  if ((s & (7U << (BITSM1 - 2))) != 0)
> +    {
> +      if (s <= (1U << (BITSM1 - 2)) - 1)
> +       link_error ();
> +    }
> +  else
> +    {
> +      if (s >= (1U << (BITSM1 - 2)))
> +       link_error ();
> +    }
> +}
> +
> +void
> +f2 (int s)
> +{
> +  if ((s & (7U << (BITSM1 - 2))) == 0)
> +    {
> +      if (s >= (1 << (BITSM1 - 2)) || s < 0)
> +       link_error ();
> +    }
> +  else
> +    {
> +      if (s >= 0 && s <= (1 << (BITSM1 - 2)) - 1)
> +       link_error ();
> +    }
> +}
> +
> +void
> +f3 (unsigned int s)
> +{
> +  if ((s & 0x3cc0) == 0)
> +    {
> +      if (s >= -15552U)
> +       link_error ();
> +    }
> +  else
> +    {
> +      if (s <= 0x3f)
> +       link_error ();
> +    }
> +}
> +
> +void
> +f4 (int s)
> +{
> +  if ((s & 0x3cc0) == 0)
> +    {
> +      if (s >= -15552 && s < 0)
> +       link_error ();
> +    }
> +  else
> +    {
> +      if (/* s <= 0x3fU */ s == 0 || s == 0x20 || s == 0x3f)
> +       link_error ();
> +    }
> +}
> +
> +void
> +f5 (int s)
> +{
> +  if ((s & 0x3cc0U) == 0)
> +    {
> +      if (s >= -15552 && s < 0)
> +       link_error ();
> +    }
> +  else
> +    {
> +      if (/* s <= 0x3fU */ s == 0 || s == 0x20 || s == 0x3f)
> +       link_error ();
> +    }
> +}
> +
> +void
> +f6 (unsigned int s)
> +{
> +  if ((s & 0x3cc0) == 0x3cc0)
> +    {
> +      if (s <= 0x3cbf)
> +       link_error ();
> +    }
> +  else
> +    {
> +      if (s >= -64U)
> +       link_error ();
> +    }
> +}
> +
> +void
> +f7 (int s)
> +{
> +  if ((s & 0x3cc0) == 0x3cc0)
> +    {
> +      if (s >= 0 && s <= 0x3cbf)
> +       link_error ();
> +    }
> +  else
> +    {
> +      if (s >= -64 && s < 0)
> +       link_error ();
> +    }
> +}
> +
> +void
> +f8 (int s)
> +{
> +  if ((s & 0x3cc0U) == 0x3cc0)
> +    {
> +      if (s >= 0 && s <= 0x3cbf)
> +       link_error ();
> +    }
> +  else
> +    {
> +      if (s >= -64 && s < 0)
> +       link_error ();
> +    }
> +}
> +
> +void
> +f9 (unsigned int s)
> +{
> +  if ((s & 0x3cc0) >= 0x1cc0)
> +    {
> +      if (s <= 0x1cbf)
> +       link_error ();
> +    }
> +  else
> +    {
> +      if (s >= -8256U)
> +       link_error ();
> +    }
> +}
> +
> +void
> +f10 (unsigned int s)
> +{
> +  if ((s & 0x3cc0) > 0x1cc0)
> +    {
> +      if (s <= 0x1fff)
> +       link_error ();
> +    }
> +  else
> +    {
> +      if (s >= -8192U)
> +       link_error ();
> +    }
> +}
> +
> +void
> +f11 (int s)
> +{
> +  if ((s & 0x3cc0) >= 0x1cc0)
> +    {
> +      if (s >= 0 && s <= 0x1cbf)
> +       link_error ();
> +    }
> +  else
> +    {
> +      if (s >= -8256 && s < 0)
> +       link_error ();
> +    }
> +}
> +
> +void
> +f12 (int s)
> +{
> +  if ((s & 0x3cc0) > 0x1cc0)
> +    {
> +      if (s >= 0 && s <= 0x1fff)
> +       link_error ();
> +    }
> +  else
> +    {
> +      if (s >= -8192 && s < 0)
> +       link_error ();
> +    }
> +}
> +
> +void
> +f13 (unsigned int s)
> +{
> +  if ((s & (0xe071U << BITSH)) > (0xb030U << BITSH))
> +    {
> +      if (s <= ((0xc000U << BITSH) - 1))
> +       link_error ();
> +    }
> +  else
> +    {
> +      if (s >= (0xc000U << BITSH))
> +       link_error ();
> +    }
> +}
> +
> +void
> +f14 (unsigned int s)
> +{
> +  if ((s & (0xe071U << BITSH)) > (0xa030U << BITSH))
> +    {
> +      if (s <= ((0xa031U << BITSH) - 1))
> +       link_error ();
> +    }
> +  else
> +    {
> +      if (s >= (0xbfbfU << BITSH))
> +       link_error ();
> +    }
> +}
> +
> +void
> +f15 (int s)
> +{
> +  if ((s & ((-0x1f8f) << BITSH)) > ((-0x4fd0) << BITSH))
> +    {
> +      if (s <= ((-0x4000 << BITSH) - 1))
> +       link_error ();
> +    }
> +  else
> +    {
> +      if (s > ((-0x4000 << BITSH) - 1))
> +       link_error ();
> +    }
> +}
> +
> +void
> +f16 (int s)
> +{
> +  if ((s & ((-0x1f8f) << BITSH)) >= ((-0x4fd0) << BITSH))
> +    {
> +      if (s <= ((-0x4000 << BITSH) - 1))
> +       link_error ();
> +    }
> +  else
> +    {
> +      if (s > ((-0x4000 << BITSH) - 1))
> +       link_error ();
> +    }
> +}
> +
> +void
> +f17 (int s)
> +{
> +  if ((s & ((-0x4000 << BITSH) | 1)) != -__INT_MAX__ - 1)
> +    {
> +      if (s == -__INT_MAX__ - 1)
> +       link_error ();
> +    }
> +  else
> +    {
> +      if (s >= (-0x4000 << BITSH) - 1)
> +       link_error ();
> +    }
> +}
> +
> +void
> +f18 (int s)
> +{
> +  if ((s & ((-0x4000 << BITSH) | 1)) != ((-0x4000 << BITSH) | 1))
> +    {
> +      if (s == -1)
> +       link_error ();
> +    }
> +  else
> +    {
> +      if (s < ((-0x4000 << BITSH) | 1) || s >= 0)
> +       link_error ();
> +    }
> +}
> +
> +void
> +f19 (int s)
> +{
> +  if ((s & ((-0x4000 << BITSH) | 1)) != ((0x4000 << BITSH) | 1))
> +    {
> +      if (s == __INT_MAX__)
> +       link_error ();
> +    }
> +  else
> +    {
> +      if (s <= (0x4000 << BITSH))
> +       link_error ();
> +    }
> +}
> +
> +void
> +f20 (int s)
> +{
> +  if ((s & (-0x1000 << BITSH)) != -__INT_MAX__ - 1)
> +    {
> +      if (s < (-0x7000 << BITSH))
> +       link_error ();
> +    }
> +  else
> +    {
> +      if (s >= (-0x7000 << BITSH))
> +       link_error ();
> +    }
> +}
> +
> +void
> +f21 (int s)
> +{
> +  if ((s & (-0x1000 << BITSH)) != (-0x1000 << BITSH))
> +    {
> +      if (s >= (-0x1000 << BITSH) && s < 0)
> +       link_error ();
> +    }
> +  else
> +    {
> +      if (s < (-0x1000 << BITSH) || s >= 0)
> +       link_error ();
> +    }
> +}
> +
> +void
> +f22 (int s)
> +{
> +  if ((s & (-0x1000 << BITSH)) != (0x7000 << BITSH))
> +    {
> +      if (s >= (0x7000 << BITSH))
> +       link_error ();
> +    }
> +  else
> +    {
> +      if (s < (0x7000 << BITSH))
> +       link_error ();
> +    }
> +}
> +
> +void
> +f23 (unsigned int s)
> +{
> +  if ((s & (0xf000U << BITSH)) != (0x7000 << BITSH))
> +    {
> +      if (/* s >= (0x7000 << BITSH) && s < (0x8000U << BITSH) */
> +         s == (0x7000 << BITSH) || s == __INT_MAX__)
> +       link_error ();
> +    }
> +  else
> +    {
> +      if (s < (0x7000 << BITSH) || s >= (0x8000U << BITSH))
> +       link_error ();
> +    }
> +}
> +
> +void
> +f24 (unsigned int s)
> +{
> +  if ((s & (0xf000U << BITSH)) != (0x8000U << BITSH))
> +    {
> +      if (/* s >= (0x8000U << BITSH) && s < (0x9000U << BITSH) */
> +         s == (0x8000U << BITSH) || s == (0x9000U << BITSH) - 1)
> +       link_error ();
> +    }
> +  else
> +    {
> +      if (s >= (0x9000U << BITSH) || s < (0x8000U << BITSH))
> +       link_error ();
> +    }
> +}
> +
> +int
> +main ()
> +{
> +  return 0;
> +}
> --- gcc/testsuite/gcc.dg/tree-ssa/vrp66.c.jj    2012-03-14 09:46:35.665830990 +0100
> +++ gcc/testsuite/gcc.dg/tree-ssa/vrp66.c       2012-03-14 14:43:06.000000000 +0100
> @@ -0,0 +1,861 @@
> +/* PR tree-optimization/52267 */
> +/* { dg-do run } */
> +/* { dg-options "-O2" } */
> +
> +extern void abort (void);
> +
> +#define BITSM1 (sizeof (int) * __CHAR_BIT__ - 1)
> +#define BITSH ((sizeof (int) - sizeof (short)) * __CHAR_BIT__)
> +
> +void
> +f1 (unsigned int s)
> +{
> +  if ((s & (7U << (BITSM1 - 2))) != 0)
> +    {
> +      if (s == (0xc000U << BITSH) - 1 || s == (0xf000U << BITSH) - 1
> +         || s == (0x9000U << BITSH) - 1 || s == (0xa031U << BITSH) - 1
> +         || s == (0xbfbfU << BITSH) || s == (0xc000U << BITSH)
> +         || s == (0xf000U << BITSH) || s == (0x9000U << BITSH)
> +         || s == (0xc000U << BITSH) + 1 || s == -1U || s == -15U
> +         || s == -15550U || s == -15552U || s == (0x7000 << BITSH) - 1
> +         || s == (0x7000 << BITSH) || s == (1 << (BITSM1 - 2))
> +         || s == 1U + __INT_MAX__ || s == -32U
> +         || s == (3 << (BITSM1 - 2)) + 2 || s == -5U || s == -63U
> +         || s == -64U || s == -65U || s == 6U + __INT_MAX__ || s == -8189U
> +         || s == -8191U || s == -8192U || s == -8193U || s == -8250U
> +         || s == -8255U || s == -8256U || s == -8257U || s == __INT_MAX__
> +         || s == __INT_MAX__ + 9U)
> +       return;
> +    }
> +  else
> +    {
> +      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
> +         || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f || s == 1
> +         || s == (1 << (BITSM1 - 2)) - 1 || s == 2 || s == 24 || s == 5)
> +       return;
> +    }
> +  abort ();
> +}
> +
> +void
> +f2 (int s)
> +{
> +  if ((s & (7U << (BITSM1 - 2))) == 0)
> +    {
> +      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
> +         || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f || s == 1
> +         || s == (1 << (BITSM1 - 2)) - 1 || s == 2 || s == 24 || s == 5)
> +       return;
> +    }
> +  else
> +    {
> +      if (s == (-0x4000 << BITSH) - 1 || s == (-0x1000 << BITSH) - 1
> +         || s == (-0x7000 << BITSH) - 1 || s == (-0x5fcf << BITSH) - 1
> +         || s == (-0x4041 << BITSH) || s == (-0x4000 << BITSH)
> +         || s == (-0x1000 << BITSH) || s == (-0x7000 << BITSH)
> +         || s == (-0x4000 << BITSH) + 1 || s == -1 || s == -15 || s == -15550
> +         || s == -15552 || s == (0x7000 << BITSH) - 1
> +         || s == (0x7000 << BITSH) || s == (1 << (BITSM1 - 2))
> +         || s == -__INT_MAX__ - 1 || s == -32 || s == (3 << (BITSM1 - 2)) + 2
> +         || s == -5 || s == -63 || s == -64 || s == -65
> +         || s == -__INT_MAX__ + 4 || s == -8189 || s == -8191 || s == -8192
> +         || s == -8193 || s == -8250 || s == -8255 || s == -8256
> +         || s == -8257 || s == __INT_MAX__ || s == -__INT_MAX__ + 7)
> +       return;
> +    }
> +  abort ();
> +}
> +
> +void
> +f3 (unsigned int s)
> +{
> +  if ((s & 0x3cc0) == 0)
> +    {
> +      if (s == 0 || s == 0x20 || s == 0x3f || s == (0xbfbfU << BITSH)
> +         || s == (0xc000U << BITSH) || s == (0xf000U << BITSH)
> +         || s == (0x9000U << BITSH) || s == (0xc000U << BITSH) + 1 || s == 1
> +         || s == (0x7000 << BITSH) || s == (1 << (BITSM1 - 2))
> +         || s == 1U + __INT_MAX__ || s == 2 || s == 24
> +         || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == 6U + __INT_MAX__
> +         || s == __INT_MAX__ + 9U)
> +       return;
> +    }
> +  else
> +    {
> +      if (s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
> +         || s == 0x3cbf || s == 0x3cc0 || s == (0xc000U << BITSH) - 1
> +         || s == (0xf000U << BITSH) - 1 || s == (0x9000U << BITSH) - 1
> +         || s == (0xa031U << BITSH) - 1 || s == -1U || s == -15U
> +         || s == -15550U || s == -15552U || s == (0x7000 << BITSH) - 1
> +         || s == (1 << (BITSM1 - 2)) - 1 || s == -32U || s == -5U
> +         || s == -63U || s == -64U || s == -65U || s == -8189U || s == -8191U
> +         || s == -8192U || s == -8193U || s == -8250U || s == -8255U
> +         || s == -8256U || s == -8257U || s == __INT_MAX__)
> +       return;
> +    }
> +  abort ();
> +}
> +
> +void
> +f4 (int s)
> +{
> +  if ((s & 0x3cc0) == 0)
> +    {
> +      if (s == 0 || s == 0x20 || s == 0x3f || s == (-0x4041 << BITSH)
> +         || s == (-0x4000 << BITSH) || s == (-0x1000 << BITSH)
> +         || s == (-0x7000 << BITSH) || s == (-0x4000 << BITSH) + 1 || s == 1
> +         || s == (0x7000 << BITSH) || s == (1 << (BITSM1 - 2))
> +         || s == -__INT_MAX__ - 1 || s == 2 || s == 24
> +         || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -__INT_MAX__ + 4
> +         || s == -__INT_MAX__ + 7)
> +       return;
> +    }
> +  else
> +    {
> +      if (s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
> +         || s == 0x3cbf || s == 0x3cc0 || s == (-0x4000 << BITSH) - 1
> +         || s == (-0x1000 << BITSH) - 1 || s == (-0x7000 << BITSH) - 1
> +         || s == (-0x5fcf << BITSH) - 1 || s == -1 || s == -15 || s == -15550
> +         || s == -15552 || s == (0x7000 << BITSH) - 1
> +         || s == (1 << (BITSM1 - 2)) - 1 || s == -32 || s == -5 || s == -63
> +         || s == -64 || s == -65 || s == -8189 || s == -8191 || s == -8192
> +         || s == -8193 || s == -8250 || s == -8255 || s == -8256
> +         || s == -8257 || s == __INT_MAX__)
> +       return;
> +    }
> +  abort ();
> +}
> +
> +void
> +f5 (int s)
> +{
> +  if ((s & 0x3cc0U) == 0)
> +    {
> +      if (s == 0 || s == 0x20 || s == 0x3f || s == (-0x4041 << BITSH)
> +         || s == (-0x4000 << BITSH) || s == (-0x1000 << BITSH)
> +         || s == (-0x7000 << BITSH) || s == (-0x4000 << BITSH) + 1 || s == 1
> +         || s == (0x7000 << BITSH) || s == (1 << (BITSM1 - 2))
> +         || s == -__INT_MAX__ - 1 || s == 2 || s == 24
> +         || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -__INT_MAX__ + 4
> +         || s == -__INT_MAX__ + 7)
> +       return;
> +    }
> +  else
> +    {
> +      if (s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
> +         || s == 0x3cbf || s == 0x3cc0 || s == (-0x4000 << BITSH) - 1
> +         || s == (-0x1000 << BITSH) - 1 || s == (-0x7000 << BITSH) - 1
> +         || s == (-0x5fcf << BITSH) - 1 || s == -1 || s == -15 || s == -15550
> +         || s == -15552 || s == (0x7000 << BITSH) - 1
> +         || s == (1 << (BITSM1 - 2)) - 1 || s == -32 || s == -5 || s == -63
> +         || s == -64 || s == -65 || s == -8189 || s == -8191 || s == -8192
> +         || s == -8193 || s == -8250 || s == -8255 || s == -8256
> +         || s == -8257 || s == __INT_MAX__)
> +       return;
> +    }
> +  abort ();
> +}
> +
> +void
> +f6 (unsigned int s)
> +{
> +  if ((s & 0x3cc0) == 0x3cc0)
> +    {
> +      if (s == 0x3cc0 || s == (0xc000U << BITSH) - 1
> +         || s == (0xf000U << BITSH) - 1 || s == (0x9000U << BITSH) - 1
> +         || s == (0xa031U << BITSH) - 1 || s == -1U || s == -15U
> +         || s == (0x7000 << BITSH) - 1 || s == (1 << (BITSM1 - 2)) - 1
> +         || s == -32U || s == -5U || s == -63U || s == -64U
> +         || s == __INT_MAX__)
> +       return;
> +    }
> +  else
> +    {
> +      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
> +         || s == 0x20 || s == 0x3cbf || s == 0x3f || s == (0xbfbfU << BITSH)
> +         || s == (0xc000U << BITSH) || s == (0xf000U << BITSH)
> +         || s == (0x9000U << BITSH) || s == (0xc000U << BITSH) + 1 || s == 1
> +         || s == -15550U || s == -15552U || s == (0x7000 << BITSH)
> +         || s == (1 << (BITSM1 - 2)) || s == 1U + __INT_MAX__ || s == 2
> +         || s == 24 || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -65U
> +         || s == 6U + __INT_MAX__ || s == -8189U || s == -8191U
> +         || s == -8192U || s == -8193U || s == -8250U || s == -8255U
> +         || s == -8256U || s == -8257U || s == __INT_MAX__ + 9U)
> +       return;
> +    }
> +  abort ();
> +}
> +
> +void
> +f7 (int s)
> +{
> +  if ((s & 0x3cc0) == 0x3cc0)
> +    {
> +      if (s == 0x3cc0 || s == (-0x4000 << BITSH) - 1
> +         || s == (-0x1000 << BITSH) - 1 || s == (-0x7000 << BITSH) - 1
> +         || s == (-0x5fcf << BITSH) - 1 || s == -1 || s == -15
> +         || s == (0x7000 << BITSH) - 1 || s == (1 << (BITSM1 - 2)) - 1
> +         || s == -32 || s == -5 || s == -63 || s == -64 || s == __INT_MAX__)
> +       return;
> +    }
> +  else
> +    {
> +      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
> +         || s == 0x20 || s == 0x3cbf || s == 0x3f || s == (-0x4041 << BITSH)
> +         || s == (-0x4000 << BITSH) || s == (-0x1000 << BITSH)
> +         || s == (-0x7000 << BITSH) || s == (-0x4000 << BITSH) + 1 || s == 1
> +         || s == -15550 || s == -15552 || s == (0x7000 << BITSH)
> +         || s == (1 << (BITSM1 - 2)) || s == -__INT_MAX__ - 1 || s == 2
> +         || s == 24 || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -65
> +         || s == -__INT_MAX__ + 4 || s == -8189 || s == -8191 || s == -8192
> +         || s == -8193 || s == -8250 || s == -8255 || s == -8256
> +         || s == -8257 || s == -__INT_MAX__ + 7)
> +       return;
> +    }
> +  abort ();
> +}
> +
> +void
> +f8 (int s)
> +{
> +  if ((s & 0x3cc0U) == 0x3cc0)
> +    {
> +      if (s == 0x3cc0 || s == (-0x4000 << BITSH) - 1
> +         || s == (-0x1000 << BITSH) - 1 || s == (-0x7000 << BITSH) - 1
> +         || s == (-0x5fcf << BITSH) - 1 || s == -1 || s == -15
> +         || s == (0x7000 << BITSH) - 1 || s == (1 << (BITSM1 - 2)) - 1
> +         || s == -32 || s == -5 || s == -63 || s == -64 || s == __INT_MAX__)
> +       return;
> +    }
> +  else
> +    {
> +      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
> +         || s == 0x20 || s == 0x3cbf || s == 0x3f || s == (-0x4041 << BITSH)
> +         || s == (-0x4000 << BITSH) || s == (-0x1000 << BITSH)
> +         || s == (-0x7000 << BITSH) || s == (-0x4000 << BITSH) + 1 || s == 1
> +         || s == -15550 || s == -15552 || s == (0x7000 << BITSH)
> +         || s == (1 << (BITSM1 - 2)) || s == -__INT_MAX__ - 1 || s == 2
> +         || s == 24 || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -65
> +         || s == -__INT_MAX__ + 4 || s == -8189 || s == -8191 || s == -8192
> +         || s == -8193 || s == -8250 || s == -8255 || s == -8256
> +         || s == -8257 || s == -__INT_MAX__ + 7)
> +       return;
> +    }
> +  abort ();
> +}
> +
> +void
> +f9 (unsigned int s)
> +{
> +  if ((s & 0x3cc0) >= 0x1cc0)
> +    {
> +      if (s == 0x1cc0 || s == 0x1fff || s == 0x2000 || s == 0x3cbf
> +         || s == 0x3cc0 || s == (0xc000U << BITSH) - 1
> +         || s == (0xf000U << BITSH) - 1 || s == (0x9000U << BITSH) - 1
> +         || s == (0xa031U << BITSH) - 1 || s == -1U || s == -15U
> +         || s == (0x7000 << BITSH) - 1 || s == (1 << (BITSM1 - 2)) - 1
> +         || s == -32U || s == -5U || s == -63U || s == -64U || s == -65U
> +         || s == -8189U || s == -8191U || s == -8192U || s == -8193U
> +         || s == -8250U || s == -8255U || s == -8256U || s == __INT_MAX__)
> +       return;
> +    }
> +  else
> +    {
> +      if (s == 0 || s == 0x1cbf || s == 0x20 || s == 0x3f
> +         || s == (0xbfbfU << BITSH) || s == (0xc000U << BITSH)
> +         || s == (0xf000U << BITSH) || s == (0x9000U << BITSH)
> +         || s == (0xc000U << BITSH) + 1 || s == 1 || s == -15550U
> +         || s == -15552U || s == (0x7000 << BITSH)
> +         || s == (1 << (BITSM1 - 2)) || s == 1U + __INT_MAX__ || s == 2
> +         || s == 24 || s == (3 << (BITSM1 - 2)) + 2 || s == 5
> +         || s == 6U + __INT_MAX__ || s == -8257U || s == __INT_MAX__ + 9U)
> +       return;
> +    }
> +  abort ();
> +}
> +
> +void
> +f10 (unsigned int s)
> +{
> +  if ((s & 0x3cc0) > 0x1cc0)
> +    {
> +      if (s == 0x2000 || s == 0x3cbf || s == 0x3cc0
> +         || s == (0xc000U << BITSH) - 1 || s == (0xf000U << BITSH) - 1
> +         || s == (0x9000U << BITSH) - 1 || s == (0xa031U << BITSH) - 1
> +         || s == -1U || s == -15U || s == (0x7000 << BITSH) - 1
> +         || s == (1 << (BITSM1 - 2)) - 1 || s == -32U || s == -5U
> +         || s == -63U || s == -64U || s == -65U || s == -8189U || s == -8191U
> +         || s == -8192U || s == __INT_MAX__)
> +       return;
> +    }
> +  else
> +    {
> +      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x20
> +         || s == 0x3f || s == (0xbfbfU << BITSH) || s == (0xc000U << BITSH)
> +         || s == (0xf000U << BITSH) || s == (0x9000U << BITSH)
> +         || s == (0xc000U << BITSH) + 1 || s == 1 || s == -15550U
> +         || s == -15552U || s == (0x7000 << BITSH)
> +         || s == (1 << (BITSM1 - 2)) || s == 1U + __INT_MAX__ || s == 2
> +         || s == 24 || s == (3 << (BITSM1 - 2)) + 2 || s == 5
> +         || s == 6U + __INT_MAX__ || s == -8193U || s == -8250U
> +         || s == -8255U || s == -8256U || s == -8257U
> +         || s == __INT_MAX__ + 9U)
> +       return;
> +    }
> +  abort ();
> +}
> +
> +void
> +f11 (int s)
> +{
> +  if ((s & 0x3cc0) >= 0x1cc0)
> +    {
> +      if (s == 0x1cc0 || s == 0x1fff || s == 0x2000 || s == 0x3cbf
> +         || s == 0x3cc0 || s == (-0x4000 << BITSH) - 1
> +         || s == (-0x1000 << BITSH) - 1 || s == (-0x7000 << BITSH) - 1
> +         || s == (-0x5fcf << BITSH) - 1 || s == -1 || s == -15
> +         || s == (0x7000 << BITSH) - 1 || s == (1 << (BITSM1 - 2)) - 1
> +         || s == -32 || s == -5 || s == -63 || s == -64 || s == -65
> +         || s == -8189 || s == -8191 || s == -8192 || s == -8193
> +         || s == -8250 || s == -8255 || s == -8256 || s == __INT_MAX__)
> +       return;
> +    }
> +  else
> +    {
> +      if (s == 0 || s == 0x1cbf || s == 0x20 || s == 0x3f
> +         || s == (-0x4041 << BITSH) || s == (-0x4000 << BITSH)
> +         || s == (-0x1000 << BITSH) || s == (-0x7000 << BITSH)
> +         || s == (-0x4000 << BITSH) + 1 || s == 1 || s == -15550
> +         || s == -15552 || s == (0x7000 << BITSH) || s == (1 << (BITSM1 - 2))
> +         || s == -__INT_MAX__ - 1 || s == 2 || s == 24
> +         || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -__INT_MAX__ + 4
> +         || s == -8257 || s == -__INT_MAX__ + 7)
> +       return;
> +    }
> +  abort ();
> +}
> +
> +void
> +f12 (int s)
> +{
> +  if ((s & 0x3cc0) > 0x1cc0)
> +    {
> +      if (s == 0x2000 || s == 0x3cbf || s == 0x3cc0
> +         || s == (-0x4000 << BITSH) - 1 || s == (-0x1000 << BITSH) - 1
> +         || s == (-0x7000 << BITSH) - 1 || s == (-0x5fcf << BITSH) - 1
> +         || s == -1 || s == -15 || s == (0x7000 << BITSH) - 1
> +         || s == (1 << (BITSM1 - 2)) - 1 || s == -32 || s == -5 || s == -63
> +         || s == -64 || s == -65 || s == -8189 || s == -8191 || s == -8192
> +         || s == __INT_MAX__)
> +       return;
> +    }
> +  else
> +    {
> +      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x20
> +         || s == 0x3f || s == (-0x4041 << BITSH) || s == (-0x4000 << BITSH)
> +         || s == (-0x1000 << BITSH) || s == (-0x7000 << BITSH)
> +         || s == (-0x4000 << BITSH) + 1 || s == 1 || s == -15550
> +         || s == -15552 || s == (0x7000 << BITSH) || s == (1 << (BITSM1 - 2))
> +         || s == -__INT_MAX__ - 1 || s == 2 || s == 24
> +         || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -__INT_MAX__ + 4
> +         || s == -8193 || s == -8250 || s == -8255 || s == -8256
> +         || s == -8257 || s == -__INT_MAX__ + 7)
> +       return;
> +    }
> +  abort ();
> +}
> +
> +void
> +f13 (unsigned int s)
> +{
> +  if ((s & (0xe071U << BITSH)) > (0xb030U << BITSH))
> +    {
> +      if (s == (0xf000U << BITSH) - 1 || s == (0xc000U << BITSH)
> +         || s == (0xf000U << BITSH) || s == (0xc000U << BITSH) + 1
> +         || s == -1U || s == -15U || s == -15550U || s == -15552U
> +         || s == -32U || s == -5U || s == -63U || s == -64U || s == -65U
> +         || s == -8189U || s == -8191U || s == -8192U || s == -8193U
> +         || s == -8250U || s == -8255U || s == -8256U || s == -8257U)
> +       return;
> +    }
> +  else
> +    {
> +      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
> +         || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f
> +         || s == (0xc000U << BITSH) - 1 || s == (0x9000U << BITSH) - 1
> +         || s == (0xa031U << BITSH) - 1 || s == (0xbfbfU << BITSH)
> +         || s == (0x9000U << BITSH) || s == 1 || s == (0x7000 << BITSH) - 1
> +         || s == (0x7000 << BITSH) || s == (1 << (BITSM1 - 2))
> +         || s == (1 << (BITSM1 - 2)) - 1 || s == 1U + __INT_MAX__ || s == 2
> +         || s == 24 || s == (3 << (BITSM1 - 2)) + 2 || s == 5
> +         || s == 6U + __INT_MAX__ || s == __INT_MAX__
> +         || s == __INT_MAX__ + 9U)
> +       return;
> +    }
> +  abort ();
> +}
> +
> +void
> +f14 (unsigned int s)
> +{
> +  if ((s & (0xe071U << BITSH)) > (0xa030U << BITSH))
> +    {
> +      if (s == (0xc000U << BITSH) - 1 || s == (0xf000U << BITSH) - 1
> +         || s == (0xbfbfU << BITSH) || s == (0xc000U << BITSH)
> +         || s == (0xf000U << BITSH) || s == (0xc000U << BITSH) + 1
> +         || s == -1U || s == -15U || s == -15550U || s == -15552U
> +         || s == -32U || s == -5U || s == -63U || s == -64U || s == -65U
> +         || s == -8189U || s == -8191U || s == -8192U || s == -8193U
> +         || s == -8250U || s == -8255U || s == -8256U || s == -8257U)
> +       return;
> +    }
> +  else
> +    {
> +      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
> +         || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f
> +         || s == (0x9000U << BITSH) - 1 || s == (0xa031U << BITSH) - 1
> +         || s == (0x9000U << BITSH) || s == 1 || s == (0x7000 << BITSH) - 1
> +         || s == (0x7000 << BITSH) || s == (1 << (BITSM1 - 2))
> +         || s == (1 << (BITSM1 - 2)) - 1 || s == 1U + __INT_MAX__ || s == 2
> +         || s == 24 || s == (3 << (BITSM1 - 2)) + 2 || s == 5
> +         || s == 6U + __INT_MAX__ || s == __INT_MAX__
> +         || s == __INT_MAX__ + 9U)
> +       return;
> +    }
> +  abort ();
> +}
> +
> +void
> +f15 (int s)
> +{
> +  if ((s & ((-0x1f8f) << BITSH)) > ((-0x4fd0) << BITSH))
> +    {
> +      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
> +         || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f
> +         || s == (-0x1000 << BITSH) - 1 || s == (-0x4000 << BITSH)
> +         || s == (-0x1000 << BITSH) || s == (-0x4000 << BITSH) + 1 || s == 1
> +         || s == -1 || s == -15 || s == -15550 || s == -15552
> +         || s == (0x7000 << BITSH) - 1 || s == (0x7000 << BITSH)
> +         || s == (1 << (BITSM1 - 2)) || s == (1 << (BITSM1 - 2)) - 1
> +         || s == 2 || s == 24 || s == -32 || s == (3 << (BITSM1 - 2)) + 2
> +         || s == 5 || s == -5 || s == -63 || s == -64 || s == -65
> +         || s == -8189 || s == -8191 || s == -8192 || s == -8193
> +         || s == -8250 || s == -8255 || s == -8256 || s == -8257
> +         || s == __INT_MAX__)
> +       return;
> +    }
> +  else
> +    {
> +      if (s == (-0x4000 << BITSH) - 1 || s == (-0x7000 << BITSH) - 1
> +         || s == (-0x5fcf << BITSH) - 1 || s == (-0x4041 << BITSH)
> +         || s == (-0x7000 << BITSH) || s == -__INT_MAX__ - 1
> +         || s == -__INT_MAX__ + 4 || s == -__INT_MAX__ + 7)
> +       return;
> +    }
> +  abort ();
> +}
> +
> +void
> +f16 (int s)
> +{
> +  if ((s & ((-0x1f8f) << BITSH)) >= ((-0x4fd0) << BITSH))
> +    {
> +      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
> +         || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f
> +         || s == (-0x1000 << BITSH) - 1 || s == (-0x4000 << BITSH)
> +         || s == (-0x1000 << BITSH) || s == (-0x4000 << BITSH) + 1 || s == 1
> +         || s == -1 || s == -15 || s == -15550 || s == -15552
> +         || s == (0x7000 << BITSH) - 1 || s == (0x7000 << BITSH)
> +         || s == (1 << (BITSM1 - 2)) || s == (1 << (BITSM1 - 2)) - 1
> +         || s == 2 || s == 24 || s == -32 || s == (3 << (BITSM1 - 2)) + 2
> +         || s == 5 || s == -5 || s == -63 || s == -64 || s == -65
> +         || s == -8189 || s == -8191 || s == -8192 || s == -8193
> +         || s == -8250 || s == -8255 || s == -8256 || s == -8257
> +         || s == __INT_MAX__)
> +       return;
> +    }
> +  else
> +    {
> +      if (s == (-0x4000 << BITSH) - 1 || s == (-0x7000 << BITSH) - 1
> +         || s == (-0x5fcf << BITSH) - 1 || s == (-0x4041 << BITSH)
> +         || s == (-0x7000 << BITSH) || s == -__INT_MAX__ - 1
> +         || s == -__INT_MAX__ + 4 || s == -__INT_MAX__ + 7)
> +       return;
> +    }
> +  abort ();
> +}
> +
> +void
> +f17 (int s)
> +{
> +  if ((s & ((-0x4000 << BITSH) | 1)) != -__INT_MAX__ - 1)
> +    {
> +      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
> +         || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f
> +         || s == (-0x4000 << BITSH) - 1 || s == (-0x1000 << BITSH) - 1
> +         || s == (-0x7000 << BITSH) - 1 || s == (-0x5fcf << BITSH) - 1
> +         || s == (-0x4000 << BITSH) || s == (-0x1000 << BITSH)
> +         || s == (-0x4000 << BITSH) + 1 || s == 1 || s == -1 || s == -15
> +         || s == -15550 || s == -15552 || s == (0x7000 << BITSH) - 1
> +         || s == (0x7000 << BITSH) || s == (1 << (BITSM1 - 2))
> +         || s == (1 << (BITSM1 - 2)) - 1 || s == 2 || s == 24 || s == -32
> +         || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -5 || s == -63
> +         || s == -64 || s == -65 || s == -__INT_MAX__ + 4 || s == -8189
> +         || s == -8191 || s == -8192 || s == -8193 || s == -8250
> +         || s == -8255 || s == -8256 || s == -8257 || s == __INT_MAX__)
> +       return;
> +    }
> +  else
> +    {
> +      if (s == (-0x4041 << BITSH) || s == (-0x7000 << BITSH)
> +         || s == -__INT_MAX__ - 1 || s == -__INT_MAX__ + 7)
> +       return;
> +    }
> +  abort ();
> +}
> +
> +void
> +f18 (int s)
> +{
> +  if ((s & ((-0x4000 << BITSH) | 1)) != ((-0x4000 << BITSH) | 1))
> +    {
> +      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
> +         || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f
> +         || s == (-0x4000 << BITSH) - 1 || s == (-0x7000 << BITSH) - 1
> +         || s == (-0x5fcf << BITSH) - 1 || s == (-0x4041 << BITSH)
> +         || s == (-0x4000 << BITSH) || s == (-0x1000 << BITSH)
> +         || s == (-0x7000 << BITSH) || s == 1 || s == -15550 || s == -15552
> +         || s == (0x7000 << BITSH) - 1 || s == (0x7000 << BITSH)
> +         || s == (1 << (BITSM1 - 2)) || s == (1 << (BITSM1 - 2)) - 1
> +         || s == -__INT_MAX__ - 1 || s == 2 || s == 24 || s == -32
> +         || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -64
> +         || s == -__INT_MAX__ + 4 || s == -8192 || s == -8250 || s == -8256
> +         || s == __INT_MAX__ || s == -__INT_MAX__ + 7)
> +       return;
> +    }
> +  else
> +    {
> +      if (s == (-0x1000 << BITSH) - 1 || s == (-0x4000 << BITSH) + 1
> +         || s == -1 || s == -15 || s == -5 || s == -63 || s == -65
> +         || s == -8189 || s == -8191 || s == -8193 || s == -8255
> +         || s == -8257)
> +       return;
> +    }
> +  abort ();
> +}
> +
> +void
> +f19 (int s)
> +{
> +  if ((s & ((-0x4000 << BITSH) | 1)) != ((0x4000 << BITSH) | 1))
> +    {
> +      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
> +         || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f
> +         || s == (-0x4000 << BITSH) - 1 || s == (-0x1000 << BITSH) - 1
> +         || s == (-0x7000 << BITSH) - 1 || s == (-0x5fcf << BITSH) - 1
> +         || s == (-0x4041 << BITSH) || s == (-0x4000 << BITSH)
> +         || s == (-0x1000 << BITSH) || s == (-0x7000 << BITSH)
> +         || s == (-0x4000 << BITSH) + 1 || s == 1 || s == -1 || s == -15
> +         || s == -15550 || s == -15552 || s == (0x7000 << BITSH)
> +         || s == (1 << (BITSM1 - 2)) || s == (1 << (BITSM1 - 2)) - 1
> +         || s == -__INT_MAX__ - 1 || s == 2 || s == 24 || s == -32
> +         || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -5 || s == -63
> +         || s == -64 || s == -65 || s == -__INT_MAX__ + 4 || s == -8189
> +         || s == -8191 || s == -8192 || s == -8193 || s == -8250
> +         || s == -8255 || s == -8256 || s == -8257 || s == -__INT_MAX__ + 7)
> +       return;
> +    }
> +  else
> +    {
> +      if (s == (0x7000 << BITSH) - 1 || s == __INT_MAX__)
> +       return;
> +    }
> +  abort ();
> +}
> +
> +void
> +f20 (int s)
> +{
> +  if ((s & (-0x1000 << BITSH)) != -__INT_MAX__ - 1)
> +    {
> +      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
> +         || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f
> +         || s == (-0x4000 << BITSH) - 1 || s == (-0x1000 << BITSH) - 1
> +         || s == (-0x5fcf << BITSH) - 1 || s == (-0x4041 << BITSH)
> +         || s == (-0x4000 << BITSH) || s == (-0x1000 << BITSH)
> +         || s == (-0x7000 << BITSH) || s == (-0x4000 << BITSH) + 1 || s == 1
> +         || s == -1 || s == -15 || s == -15550 || s == -15552
> +         || s == (0x7000 << BITSH) - 1 || s == (0x7000 << BITSH)
> +         || s == (1 << (BITSM1 - 2)) || s == (1 << (BITSM1 - 2)) - 1
> +         || s == 2 || s == 24 || s == -32 || s == (3 << (BITSM1 - 2)) + 2
> +         || s == 5 || s == -5 || s == -63 || s == -64 || s == -65
> +         || s == -8189 || s == -8191 || s == -8192 || s == -8193
> +         || s == -8250 || s == -8255 || s == -8256 || s == -8257
> +         || s == __INT_MAX__)
> +       return;
> +    }
> +  else
> +    {
> +      if (s == (-0x7000 << BITSH) - 1 || s == -__INT_MAX__ - 1
> +         || s == -__INT_MAX__ + 4 || s == -__INT_MAX__ + 7)
> +       return;
> +    }
> +  abort ();
> +}
> +
> +void
> +f21 (int s)
> +{
> +  if ((s & (-0x1000 << BITSH)) != (-0x1000 << BITSH))
> +    {
> +      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
> +         || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f
> +         || s == (-0x4000 << BITSH) - 1 || s == (-0x1000 << BITSH) - 1
> +         || s == (-0x7000 << BITSH) - 1 || s == (-0x5fcf << BITSH) - 1
> +         || s == (-0x4041 << BITSH) || s == (-0x4000 << BITSH)
> +         || s == (-0x7000 << BITSH) || s == (-0x4000 << BITSH) + 1 || s == 1
> +         || s == (0x7000 << BITSH) - 1 || s == (0x7000 << BITSH)
> +         || s == (1 << (BITSM1 - 2)) || s == (1 << (BITSM1 - 2)) - 1
> +         || s == -__INT_MAX__ - 1 || s == 2 || s == 24
> +         || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -__INT_MAX__ + 4
> +         || s == __INT_MAX__ || s == -__INT_MAX__ + 7)
> +       return;
> +    }
> +  else
> +    {
> +      if (s == (-0x1000 << BITSH) || s == -1 || s == -15 || s == -15550
> +         || s == -15552 || s == -32 || s == -5 || s == -63 || s == -64
> +         || s == -65 || s == -8189 || s == -8191 || s == -8192 || s == -8193
> +         || s == -8250 || s == -8255 || s == -8256 || s == -8257)
> +       return;
> +    }
> +  abort ();
> +}
> +
> +void
> +f22 (int s)
> +{
> +  if ((s & (-0x1000 << BITSH)) != (0x7000 << BITSH))
> +    {
> +      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
> +         || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f
> +         || s == (-0x4000 << BITSH) - 1 || s == (-0x1000 << BITSH) - 1
> +         || s == (-0x7000 << BITSH) - 1 || s == (-0x5fcf << BITSH) - 1
> +         || s == (-0x4041 << BITSH) || s == (-0x4000 << BITSH)
> +         || s == (-0x1000 << BITSH) || s == (-0x7000 << BITSH)
> +         || s == (-0x4000 << BITSH) + 1 || s == 1 || s == -1 || s == -15
> +         || s == -15550 || s == -15552 || s == (0x7000 << BITSH) - 1
> +         || s == (1 << (BITSM1 - 2)) || s == (1 << (BITSM1 - 2)) - 1
> +         || s == -__INT_MAX__ - 1 || s == 2 || s == 24 || s == -32
> +         || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -5 || s == -63
> +         || s == -64 || s == -65 || s == -__INT_MAX__ + 4 || s == -8189
> +         || s == -8191 || s == -8192 || s == -8193 || s == -8250
> +         || s == -8255 || s == -8256 || s == -8257 || s == -__INT_MAX__ + 7)
> +       return;
> +    }
> +  else
> +    {
> +      if (s == (0x7000 << BITSH) || s == __INT_MAX__)
> +       return;
> +    }
> +  abort ();
> +}
> +
> +void
> +f23 (unsigned int s)
> +{
> +  if ((s & (0xf000U << BITSH)) != (0x7000 << BITSH))
> +    {
> +      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
> +         || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f
> +         || s == (0xc000U << BITSH) - 1 || s == (0xf000U << BITSH) - 1
> +         || s == (0x9000U << BITSH) - 1 || s == (0xa031U << BITSH) - 1
> +         || s == (0xbfbfU << BITSH) || s == (0xc000U << BITSH)
> +         || s == (0xf000U << BITSH) || s == (0x9000U << BITSH)
> +         || s == (0xc000U << BITSH) + 1 || s == 1 || s == -1U || s == -15U
> +         || s == -15550U || s == -15552U || s == (0x7000 << BITSH) - 1
> +         || s == (1 << (BITSM1 - 2)) || s == (1 << (BITSM1 - 2)) - 1
> +         || s == 1U + __INT_MAX__ || s == 2 || s == 24 || s == -32U
> +         || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -5U || s == -63U
> +         || s == -64U || s == -65U || s == 6U + __INT_MAX__ || s == -8189U
> +         || s == -8191U || s == -8192U || s == -8193U || s == -8250U
> +         || s == -8255U || s == -8256U || s == -8257U
> +         || s == __INT_MAX__ + 9U)
> +       return;
> +    }
> +  else
> +    {
> +      if (s == (0x7000 << BITSH) || s == __INT_MAX__)
> +       return;
> +    }
> +  abort ();
> +}
> +
> +void
> +f24 (unsigned int s)
> +{
> +  if ((s & (0xf000U << BITSH)) != (0x8000U << BITSH))
> +    {
> +      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
> +         || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f
> +         || s == (0xc000U << BITSH) - 1 || s == (0xf000U << BITSH) - 1
> +         || s == (0xa031U << BITSH) - 1 || s == (0xbfbfU << BITSH)
> +         || s == (0xc000U << BITSH) || s == (0xf000U << BITSH)
> +         || s == (0x9000U << BITSH) || s == (0xc000U << BITSH) + 1 || s == 1
> +         || s == -1U || s == -15U || s == -15550U || s == -15552U
> +         || s == (0x7000 << BITSH) - 1 || s == (0x7000 << BITSH)
> +         || s == (1 << (BITSM1 - 2)) || s == (1 << (BITSM1 - 2)) - 1
> +         || s == 2 || s == 24 || s == -32U || s == (3 << (BITSM1 - 2)) + 2
> +         || s == 5 || s == -5U || s == -63U || s == -64U || s == -65U
> +         || s == -8189U || s == -8191U || s == -8192U || s == -8193U
> +         || s == -8250U || s == -8255U || s == -8256U || s == -8257U
> +         || s == __INT_MAX__)
> +       return;
> +    }
> +  else
> +    {
> +      if (s == (0x9000U << BITSH) - 1 || s == 1U + __INT_MAX__
> +         || s == 6U + __INT_MAX__ || s == __INT_MAX__ + 9U)
> +       return;
> +    }
> +  abort ();
> +}
> +
> +int svals[] = {
> +  0,
> +  0x1cbf,
> +  0x1cc0,
> +  0x1fff,
> +  0x2000,
> +  0x20,
> +  0x3cbf,
> +  0x3cc0,
> +  0x3f,
> +  (-0x4000 << BITSH) - 1,
> +  (-0x1000 << BITSH) - 1,
> +  (-0x7000 << BITSH) - 1,
> +  (-0x5fcf << BITSH) - 1,
> +  (-0x4041 << BITSH),
> +  (-0x4000 << BITSH),
> +  (-0x1000 << BITSH),
> +  (-0x7000 << BITSH),
> +  (-0x4000 << BITSH) + 1,
> +  1,
> +  -1,
> +  -15,
> +  -15550,
> +  -15552,
> +  (0x7000 << BITSH) - 1,
> +  (0x7000 << BITSH),
> +  (1 << (BITSM1 - 2)),
> +  (1 << (BITSM1 - 2)) - 1,
> +  -__INT_MAX__ - 1,
> +  2,
> +  24,
> +  -32,
> +  (3 << (BITSM1 - 2)) + 2,
> +  5,
> +  -5,
> +  -63,
> +  -64,
> +  -65,
> +  -__INT_MAX__ + 4,
> +  -8189,
> +  -8191,
> +  -8192,
> +  -8193,
> +  -8250,
> +  -8255,
> +  -8256,
> +  -8257,
> +  __INT_MAX__,
> +  -__INT_MAX__ + 7,
> +};
> +
> +unsigned int uvals[] = {
> +  0,
> +  0x1cbf,
> +  0x1cc0,
> +  0x1fff,
> +  0x2000,
> +  0x20,
> +  0x3cbf,
> +  0x3cc0,
> +  0x3f,
> +  (0xc000U << BITSH) - 1,
> +  (0xf000U << BITSH) - 1,
> +  (0x9000U << BITSH) - 1,
> +  (0xa031U << BITSH) - 1,
> +  (0xbfbfU << BITSH),
> +  (0xc000U << BITSH),
> +  (0xf000U << BITSH),
> +  (0x9000U << BITSH),
> +  (0xc000U << BITSH) + 1,
> +  1,
> +  -1U,
> +  -15U,
> +  -15550U,
> +  -15552U,
> +  (0x7000 << BITSH) - 1,
> +  (0x7000 << BITSH),
> +  (1 << (BITSM1 - 2)),
> +  (1 << (BITSM1 - 2)) - 1,
> +  1U + __INT_MAX__,
> +  2,
> +  24,
> +  -32U,
> +  (3 << (BITSM1 - 2)) + 2,
> +  5,
> +  -5U,
> +  -63U,
> +  -64U,
> +  -65U,
> +  6U + __INT_MAX__,
> +  -8189U,
> +  -8191U,
> +  -8192U,
> +  -8193U,
> +  -8250U,
> +  -8255U,
> +  -8256U,
> +  -8257U,
> +  __INT_MAX__,
> +  __INT_MAX__ + 9U,
> +};
> +
> +int
> +main ()
> +{
> +  int i;
> +  for (i = 0; i < sizeof (svals) / sizeof (svals[0]); i++)
> +    {
> +      f2 (svals[i]);
> +      f4 (svals[i]);
> +      f5 (svals[i]);
> +      f7 (svals[i]);
> +      f8 (svals[i]);
> +      f11 (svals[i]);
> +      f12 (svals[i]);
> +      f15 (svals[i]);
> +      f16 (svals[i]);
> +      f17 (svals[i]);
> +      f18 (svals[i]);
> +      f19 (svals[i]);
> +      f20 (svals[i]);
> +      f21 (svals[i]);
> +      f22 (svals[i]);
> +    }
> +  for (i = 0; i < sizeof (uvals) / sizeof (uvals[0]); i++)
> +    {
> +      f1 (uvals[i]);
> +      f3 (uvals[i]);
> +      f6 (uvals[i]);
> +      f9 (uvals[i]);
> +      f10 (uvals[i]);
> +      f13 (uvals[i]);
> +      f14 (uvals[i]);
> +      f23 (uvals[i]);
> +      f24 (uvals[i]);
> +    }
> +  return 0;
> +}
>
>        Jakub
Georg-Johann Lay March 20, 2012, 7:51 p.m. UTC | #2
Jakub Jelinek wrote:
> Hi!
> 
> This patch adds ASSERT_EXPRs derived from
>   tmp_N = var_M & cst2;
>   if (tmp_N cmp val)
> where cst2 and val are constants.  Bootstrapped/regtested
> on x86_64-linux and i686-linux, ok for trunk?
> 
> 2012-03-14  Jakub Jelinek  <jakub@redhat.com>
> 
> 	PR tree-optimization/52267
> 	* tree-vrp.c (masked_increment): New function.
> 	(register_edge_assert_for_2): Derive ASSERT_EXPRs
> 	from (X & CST1) cmp CST2 tests.
> 
> 	* gcc.dg/pr52267.c: New test.
> 	* gcc.dg/tree-ssa/vrp65.c: New test.
> 	* gcc.dg/tree-ssa/vrp66.c: New test.

Hi

gcc.dg/tree-ssa/vrp66.c: New test

fails when executed for avr where sizeof(int) = 2

Skimming the code I'd expect that it is general enough to work there so I
wonder why it fails for that target?

Johann
diff mbox

Patch

--- gcc/tree-vrp.c.jj	2012-03-14 09:39:41.574262693 +0100
+++ gcc/tree-vrp.c	2012-03-14 13:22:49.468537249 +0100
@@ -4338,6 +4338,34 @@  extract_code_and_val_from_cond_with_ops
   return true;
 }
 
+/* Find out smallest RES where RES > VAL && (RES & MASK) == RES, if any
+   (otherwise return VAL).  VAL and MASK must be zero-extended for
+   precision PREC.  If SGNBIT is non-zero, first xor VAL with SGNBIT
+   (to transform signed values into unsigned) and at the end xor
+   SGNBIT back.  */
+
+static double_int
+masked_increment (double_int val, double_int mask, double_int sgnbit,
+		  unsigned int prec)
+{
+  double_int bit = double_int_one, res;
+  unsigned int i;
+
+  val = double_int_xor (val, sgnbit);
+  for (i = 0; i < prec; i++, bit = double_int_add (bit, bit))
+    {
+      res = mask;
+      if (double_int_zero_p (double_int_and (res, bit)))
+	continue;
+      res = double_int_sub (bit, double_int_one);
+      res = double_int_and_not (double_int_add (val, bit), res);
+      res = double_int_and (res, mask);
+      if (double_int_ucmp (res, val) > 0)
+	return double_int_xor (res, sgnbit);
+    }
+  return double_int_xor (val, sgnbit);
+}
+
 /* Try to register an edge assertion for SSA name NAME on edge E for
    the condition COND contributing to the conditional jump pointed to by BSI.
    Invert the condition COND if INVERT is true.
@@ -4466,7 +4494,7 @@  register_edge_assert_for_2 (tree name, e
       && TREE_CODE (val) == INTEGER_CST)
     {
       gimple def_stmt = SSA_NAME_DEF_STMT (name);
-      tree name2 = NULL_TREE, cst2 = NULL_TREE;
+      tree name2 = NULL_TREE, names[2], cst2 = NULL_TREE;
       tree val2 = NULL_TREE;
       double_int mask = double_int_zero;
       unsigned int prec = TYPE_PRECISION (TREE_TYPE (val));
@@ -4591,6 +4619,248 @@  register_edge_assert_for_2 (tree name, e
 	      retval = true;
 	    }
 	}
+
+      /* Add asserts for NAME cmp CST and NAME being defined as
+	 NAME = NAME2 & CST2.
+
+	 Extract CST2 from the and.  */
+      names[0] = NULL_TREE;
+      names[1] = NULL_TREE;
+      cst2 = NULL_TREE;
+      if (is_gimple_assign (def_stmt)
+	  && gimple_assign_rhs_code (def_stmt) == BIT_AND_EXPR)
+	{
+	  name2 = gimple_assign_rhs1 (def_stmt);
+	  cst2 = gimple_assign_rhs2 (def_stmt);
+	  if (TREE_CODE (name2) == SSA_NAME
+	      && INTEGRAL_TYPE_P (TREE_TYPE (name2))
+	      && TREE_CODE (cst2) == INTEGER_CST
+	      && !integer_zerop (cst2)
+	      && prec <= 2 * HOST_BITS_PER_WIDE_INT
+	      && (prec > 1
+		  || TYPE_UNSIGNED (TREE_TYPE (val))))
+	    {
+	      gimple def_stmt2 = SSA_NAME_DEF_STMT (name2);
+	      if (gimple_assign_cast_p (def_stmt2))
+		{
+		  names[1] = gimple_assign_rhs1 (def_stmt2);
+		  if (!CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (def_stmt2))
+		      || !INTEGRAL_TYPE_P (TREE_TYPE (names[1]))
+		      || (TYPE_PRECISION (TREE_TYPE (name2))
+			  != TYPE_PRECISION (TREE_TYPE (names[1])))
+		      || !live_on_edge (e, names[1])
+		      || has_single_use (names[1]))
+		    names[1] = NULL_TREE;
+		}
+	      if (live_on_edge (e, name2)
+		  && !has_single_use (name2))
+		names[0] = name2;
+	    }
+	}
+      if (names[0] || names[1])
+	{
+	  double_int minv, maxv = double_int_zero, valv, cst2v;
+	  double_int tem, sgnbit;
+	  bool valid_p = false, valn = false, cst2n = false;
+	  enum tree_code ccode = comp_code;
+
+	  valv = double_int_zext (tree_to_double_int (val), prec);
+	  cst2v = double_int_zext (tree_to_double_int (cst2), prec);
+	  if (!TYPE_UNSIGNED (TREE_TYPE (val)))
+	    {
+	      valn = double_int_negative_p (double_int_sext (valv, prec));
+	      cst2n = double_int_negative_p (double_int_sext (cst2v, prec));
+	    }
+	  /* 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.  */
+	  if (!cst2n && valn)
+	    ccode = ERROR_MARK;
+	  if (cst2n)
+	    sgnbit = double_int_zext (double_int_lshift (double_int_one,
+							 prec - 1, prec,
+							 false), prec);
+	  else
+	    sgnbit = double_int_zero;
+	  minv = double_int_and (valv, cst2v);
+	  switch (ccode)
+	    {
+	    case EQ_EXPR:
+	      /* Minimum unsigned value for equality is VAL & CST2
+		 (should be equal to VAL, otherwise we probably should
+		 have folded the comparison into false) and
+		 maximum unsigned value is VAL | ~CST2.  */
+	      maxv = double_int_ior (valv, double_int_not (cst2v));
+	      maxv = double_int_zext (maxv, prec);
+	      valid_p = true;
+	      break;
+	    case NE_EXPR:
+	      tem = double_int_ior (valv, double_int_not (cst2v));
+	      tem = double_int_zext (tem, prec);
+	      /* If VAL is 0, handle (X & CST2) != 0 as (X & CST2) > 0U.  */
+	      if (double_int_zero_p (valv))
+		{
+		  cst2n = false;
+		  sgnbit = double_int_zero;
+		  goto gt_expr;
+		}
+	      /* If (VAL | ~CST2) is all ones, handle it as
+		 (X & CST2) < VAL.  */
+	      if (double_int_equal_p (tem, double_int_mask (prec)))
+		{
+		  cst2n = false;
+		  valn = false;
+		  sgnbit = double_int_zero;
+		  goto lt_expr;
+		}
+	      if (!cst2n
+		  && double_int_negative_p (double_int_sext (cst2v, prec)))
+		sgnbit = double_int_zext (double_int_lshift (double_int_one,
+							     prec - 1, prec,
+							     false), prec);
+	      if (!double_int_zero_p (sgnbit))
+		{
+		  if (double_int_equal_p (valv, sgnbit))
+		    {
+		      cst2n = true;
+		      valn = true;
+		      goto gt_expr;
+		    }
+		  if (double_int_equal_p (tem, double_int_mask (prec - 1)))
+		    {
+		      cst2n = true;
+		      goto lt_expr;
+		    }
+		  if (!cst2n)
+		    sgnbit = double_int_zero;
+		}
+	      break;
+	    case GE_EXPR:
+	      /* Minimum unsigned value for >= if (VAL & CST2) == VAL
+		 is VAL and maximum unsigned value is ~0.  For signed
+		 comparison, if CST2 doesn't have most significant bit
+		 set, handle it similarly.  If CST2 has MSB set,
+		 the minimum is the same, and maximum is ~0U/2.  */
+	      if (!double_int_equal_p (minv, valv))
+		{
+		  /* If (VAL & CST2) != VAL, X & CST2 can't be equal to
+		     VAL.  */
+		  minv = masked_increment (valv, cst2v, sgnbit, prec);
+		  if (double_int_equal_p (minv, valv))
+		    break;
+		}
+	      maxv = double_int_mask (prec - (cst2n ? 1 : 0));
+	      valid_p = true;
+	      break;
+	    case GT_EXPR:
+	    gt_expr:
+	      /* Find out smallest MINV where MINV > VAL
+		 && (MINV & CST2) == MINV, if any.  If VAL is signed and
+		 CST2 has MSB set, compute it biased by 1 << (prec - 1).  */
+	      minv = masked_increment (valv, cst2v, sgnbit, prec);
+	      if (double_int_equal_p (minv, valv))
+		break;
+	      maxv = double_int_mask (prec - (cst2n ? 1 : 0));
+	      valid_p = true;
+	      break;
+	    case LE_EXPR:
+	      /* Minimum unsigned value for <= is 0 and maximum
+		 unsigned value is VAL | ~CST2 if (VAL & CST2) == VAL.
+		 Otherwise, find smallest VAL2 where VAL2 > VAL
+		 && (VAL2 & CST2) == VAL2 and use (VAL2 - 1) | ~CST2
+		 as maximum.
+		 For signed comparison, if CST2 doesn't have most
+		 significant bit set, handle it similarly.  If CST2 has
+		 MSB set, the maximum is the same and minimum is INT_MIN.  */
+	      if (double_int_equal_p (minv, valv))
+		maxv = valv;
+	      else
+		{
+		  maxv = masked_increment (valv, cst2v, sgnbit, prec);
+		  if (double_int_equal_p (maxv, valv))
+		    break;
+		  maxv = double_int_sub (maxv, double_int_one);
+		}
+	      maxv = double_int_ior (maxv, double_int_not (cst2v));
+	      maxv = double_int_zext (maxv, prec);
+	      minv = sgnbit;
+	      valid_p = true;
+	      break;
+	    case LT_EXPR:
+	    lt_expr:
+	      /* Minimum unsigned value for < is 0 and maximum
+		 unsigned value is (VAL-1) | ~CST2 if (VAL & CST2) == VAL.
+		 Otherwise, find smallest VAL2 where VAL2 > VAL
+		 && (VAL2 & CST2) == VAL2 and use (VAL2 - 1) | ~CST2
+		 as maximum.
+		 For signed comparison, if CST2 doesn't have most
+		 significant bit set, handle it similarly.  If CST2 has
+		 MSB set, the maximum is the same and minimum is INT_MIN.  */
+	      if (double_int_equal_p (minv, valv))
+		{
+		  if (double_int_equal_p (valv, sgnbit))
+		    break;
+		  maxv = valv;
+		}
+	      else
+		{
+		  maxv = masked_increment (valv, cst2v, sgnbit, prec);
+		  if (double_int_equal_p (maxv, valv))
+		    break;
+		}
+	      maxv = double_int_sub (maxv, double_int_one);
+	      maxv = double_int_ior (maxv, double_int_not (cst2v));
+	      maxv = double_int_zext (maxv, prec);
+	      minv = sgnbit;
+	      valid_p = true;
+	      break;
+	    default:
+	      break;
+	    }
+	  if (valid_p
+	      && !double_int_equal_p (double_int_zext (double_int_sub (maxv,
+								       minv),
+						       prec),
+				      double_int_mask (prec)))
+	    {
+	      tree tmp, new_val, type;
+	      int i;
+
+	      for (i = 0; i < 2; i++)
+		if (names[i])
+		  {
+		    double_int maxv2 = maxv;
+		    tmp = names[i];
+		    type = TREE_TYPE (names[i]);
+		    if (!TYPE_UNSIGNED (type))
+		      {
+			type = build_nonstandard_integer_type (prec, 1);
+			tmp = build1 (NOP_EXPR, type, names[i]);
+		      }
+		    if (!double_int_zero_p (minv))
+		      {
+			tmp = build2 (PLUS_EXPR, type, tmp,
+				      double_int_to_tree (type,
+							  double_int_neg (minv)));
+			maxv2 = double_int_sub (maxv, minv);
+		      }
+		    new_val = double_int_to_tree (type, maxv2);
+
+		    if (dump_file)
+		      {
+			fprintf (dump_file, "Adding assert for ");
+			print_generic_expr (dump_file, names[i], 0);
+			fprintf (dump_file, " from ");
+			print_generic_expr (dump_file, tmp, 0);
+			fprintf (dump_file, "\n");
+		      }
+
+		    register_new_assert_for (names[i], tmp, LE_EXPR,
+					     new_val, NULL, e, bsi);
+		    retval = true;
+		  }
+	    }
+	}
     }
 
   return retval;
--- gcc/testsuite/gcc.dg/pr52267.c.jj	2012-03-14 09:46:35.580831461 +0100
+++ gcc/testsuite/gcc.dg/pr52267.c	2012-03-14 09:46:35.658831129 +0100
@@ -0,0 +1,24 @@ 
+/* PR tree-optimization/52267 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+int
+foo (int a, int b)
+{
+  if (a > 3 || a < 0)
+    return a;
+  a &= 3;
+  return a & 3;
+}
+
+int
+bar (int a)
+{
+  if (a & ~3)
+    return a;
+  return a & 3;
+}
+
+/* { dg-final { scan-tree-dump-not "& 3" "optimized" } } */
+/* { dg-final { scan-tree-dump-not "& -4" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
--- gcc/testsuite/gcc.dg/tree-ssa/vrp65.c.jj	2012-03-14 09:46:35.665830990 +0100
+++ gcc/testsuite/gcc.dg/tree-ssa/vrp65.c	2012-03-14 14:55:04.000000000 +0100
@@ -0,0 +1,376 @@ 
+/* PR tree-optimization/52267 */
+/* { dg-do link } */
+/* { dg-options "-O2" } */
+
+extern void link_error (void);
+
+#define BITSM1 (sizeof (int) * __CHAR_BIT__ - 1)
+#define BITSH ((sizeof (int) - sizeof (short)) * __CHAR_BIT__)
+
+void
+f1 (unsigned int s)
+{
+  if ((s & (7U << (BITSM1 - 2))) != 0)
+    {
+      if (s <= (1U << (BITSM1 - 2)) - 1)
+	link_error ();
+    }
+  else
+    {
+      if (s >= (1U << (BITSM1 - 2)))
+	link_error ();
+    }
+}
+
+void
+f2 (int s)
+{
+  if ((s & (7U << (BITSM1 - 2))) == 0)
+    {
+      if (s >= (1 << (BITSM1 - 2)) || s < 0)
+	link_error ();
+    }
+  else
+    {
+      if (s >= 0 && s <= (1 << (BITSM1 - 2)) - 1)
+	link_error ();
+    }
+}
+
+void
+f3 (unsigned int s)
+{
+  if ((s & 0x3cc0) == 0)
+    {
+      if (s >= -15552U)
+	link_error ();
+    }
+  else
+    {
+      if (s <= 0x3f)
+	link_error ();
+    }
+}
+
+void
+f4 (int s)
+{
+  if ((s & 0x3cc0) == 0)
+    {
+      if (s >= -15552 && s < 0)
+	link_error ();
+    }
+  else
+    {
+      if (/* s <= 0x3fU */ s == 0 || s == 0x20 || s == 0x3f)
+	link_error ();
+    }
+}
+
+void
+f5 (int s)
+{
+  if ((s & 0x3cc0U) == 0)
+    {
+      if (s >= -15552 && s < 0)
+	link_error ();
+    }
+  else
+    {
+      if (/* s <= 0x3fU */ s == 0 || s == 0x20 || s == 0x3f)
+	link_error ();
+    }
+}
+
+void
+f6 (unsigned int s)
+{
+  if ((s & 0x3cc0) == 0x3cc0)
+    {
+      if (s <= 0x3cbf)
+	link_error ();
+    }
+  else
+    {
+      if (s >= -64U)
+	link_error ();
+    }
+}
+
+void
+f7 (int s)
+{
+  if ((s & 0x3cc0) == 0x3cc0)
+    {
+      if (s >= 0 && s <= 0x3cbf)
+	link_error ();
+    }
+  else
+    {
+      if (s >= -64 && s < 0)
+	link_error ();
+    }
+}
+
+void
+f8 (int s)
+{
+  if ((s & 0x3cc0U) == 0x3cc0)
+    {
+      if (s >= 0 && s <= 0x3cbf)
+	link_error ();
+    }
+  else
+    {
+      if (s >= -64 && s < 0)
+	link_error ();
+    }
+}
+
+void
+f9 (unsigned int s)
+{
+  if ((s & 0x3cc0) >= 0x1cc0)
+    {
+      if (s <= 0x1cbf)
+	link_error ();
+    }
+  else
+    {
+      if (s >= -8256U)
+	link_error ();
+    }
+}
+
+void
+f10 (unsigned int s)
+{
+  if ((s & 0x3cc0) > 0x1cc0)
+    {
+      if (s <= 0x1fff)
+	link_error ();
+    }
+  else
+    {
+      if (s >= -8192U)
+	link_error ();
+    }
+}
+
+void
+f11 (int s)
+{
+  if ((s & 0x3cc0) >= 0x1cc0)
+    {
+      if (s >= 0 && s <= 0x1cbf)
+	link_error ();
+    }
+  else
+    {
+      if (s >= -8256 && s < 0)
+	link_error ();
+    }
+}
+
+void
+f12 (int s)
+{
+  if ((s & 0x3cc0) > 0x1cc0)
+    {
+      if (s >= 0 && s <= 0x1fff)
+	link_error ();
+    }
+  else
+    {
+      if (s >= -8192 && s < 0)
+	link_error ();
+    }
+}
+
+void
+f13 (unsigned int s)
+{
+  if ((s & (0xe071U << BITSH)) > (0xb030U << BITSH))
+    {
+      if (s <= ((0xc000U << BITSH) - 1))
+	link_error ();
+    }
+  else
+    {
+      if (s >= (0xc000U << BITSH))
+	link_error ();
+    }
+}
+
+void
+f14 (unsigned int s)
+{
+  if ((s & (0xe071U << BITSH)) > (0xa030U << BITSH))
+    {
+      if (s <= ((0xa031U << BITSH) - 1))
+	link_error ();
+    }
+  else
+    {
+      if (s >= (0xbfbfU << BITSH))
+	link_error ();
+    }
+}
+
+void
+f15 (int s)
+{
+  if ((s & ((-0x1f8f) << BITSH)) > ((-0x4fd0) << BITSH))
+    {
+      if (s <= ((-0x4000 << BITSH) - 1))
+	link_error ();
+    }
+  else
+    {
+      if (s > ((-0x4000 << BITSH) - 1))
+	link_error ();
+    }
+}
+
+void
+f16 (int s)
+{
+  if ((s & ((-0x1f8f) << BITSH)) >= ((-0x4fd0) << BITSH))
+    {
+      if (s <= ((-0x4000 << BITSH) - 1))
+	link_error ();
+    }
+  else
+    {
+      if (s > ((-0x4000 << BITSH) - 1))
+	link_error ();
+    }
+}
+
+void
+f17 (int s)
+{
+  if ((s & ((-0x4000 << BITSH) | 1)) != -__INT_MAX__ - 1)
+    {
+      if (s == -__INT_MAX__ - 1)
+	link_error ();
+    }
+  else
+    {
+      if (s >= (-0x4000 << BITSH) - 1)
+	link_error ();
+    }
+}
+
+void
+f18 (int s)
+{
+  if ((s & ((-0x4000 << BITSH) | 1)) != ((-0x4000 << BITSH) | 1))
+    {
+      if (s == -1)
+	link_error ();
+    }
+  else
+    {
+      if (s < ((-0x4000 << BITSH) | 1) || s >= 0)
+	link_error ();
+    }
+}
+
+void
+f19 (int s)
+{
+  if ((s & ((-0x4000 << BITSH) | 1)) != ((0x4000 << BITSH) | 1))
+    {
+      if (s == __INT_MAX__)
+	link_error ();
+    }
+  else
+    {
+      if (s <= (0x4000 << BITSH))
+	link_error ();
+    }
+}
+
+void
+f20 (int s)
+{
+  if ((s & (-0x1000 << BITSH)) != -__INT_MAX__ - 1)
+    {
+      if (s < (-0x7000 << BITSH))
+	link_error ();
+    }
+  else
+    {
+      if (s >= (-0x7000 << BITSH))
+	link_error ();
+    }
+}
+
+void
+f21 (int s)
+{
+  if ((s & (-0x1000 << BITSH)) != (-0x1000 << BITSH))
+    {
+      if (s >= (-0x1000 << BITSH) && s < 0)
+	link_error ();
+    }
+  else
+    {
+      if (s < (-0x1000 << BITSH) || s >= 0)
+	link_error ();
+    }
+}
+
+void
+f22 (int s)
+{
+  if ((s & (-0x1000 << BITSH)) != (0x7000 << BITSH))
+    {
+      if (s >= (0x7000 << BITSH))
+	link_error ();
+    }
+  else
+    {
+      if (s < (0x7000 << BITSH))
+	link_error ();
+    }
+}
+
+void
+f23 (unsigned int s)
+{
+  if ((s & (0xf000U << BITSH)) != (0x7000 << BITSH))
+    {
+      if (/* s >= (0x7000 << BITSH) && s < (0x8000U << BITSH) */
+	  s == (0x7000 << BITSH) || s == __INT_MAX__)
+	link_error ();
+    }
+  else
+    {
+      if (s < (0x7000 << BITSH) || s >= (0x8000U << BITSH))
+	link_error ();
+    }
+}
+
+void
+f24 (unsigned int s)
+{
+  if ((s & (0xf000U << BITSH)) != (0x8000U << BITSH))
+    {
+      if (/* s >= (0x8000U << BITSH) && s < (0x9000U << BITSH) */
+	  s == (0x8000U << BITSH) || s == (0x9000U << BITSH) - 1)
+	link_error ();
+    }
+  else
+    {
+      if (s >= (0x9000U << BITSH) || s < (0x8000U << BITSH))
+	link_error ();
+    }
+}
+
+int
+main ()
+{
+  return 0;
+}
--- gcc/testsuite/gcc.dg/tree-ssa/vrp66.c.jj	2012-03-14 09:46:35.665830990 +0100
+++ gcc/testsuite/gcc.dg/tree-ssa/vrp66.c	2012-03-14 14:43:06.000000000 +0100
@@ -0,0 +1,861 @@ 
+/* PR tree-optimization/52267 */
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+extern void abort (void);
+
+#define BITSM1 (sizeof (int) * __CHAR_BIT__ - 1)
+#define BITSH ((sizeof (int) - sizeof (short)) * __CHAR_BIT__)
+
+void
+f1 (unsigned int s)
+{
+  if ((s & (7U << (BITSM1 - 2))) != 0)
+    {
+      if (s == (0xc000U << BITSH) - 1 || s == (0xf000U << BITSH) - 1
+	  || s == (0x9000U << BITSH) - 1 || s == (0xa031U << BITSH) - 1
+	  || s == (0xbfbfU << BITSH) || s == (0xc000U << BITSH)
+	  || s == (0xf000U << BITSH) || s == (0x9000U << BITSH)
+	  || s == (0xc000U << BITSH) + 1 || s == -1U || s == -15U
+	  || s == -15550U || s == -15552U || s == (0x7000 << BITSH) - 1
+	  || s == (0x7000 << BITSH) || s == (1 << (BITSM1 - 2))
+	  || s == 1U + __INT_MAX__ || s == -32U
+	  || s == (3 << (BITSM1 - 2)) + 2 || s == -5U || s == -63U
+	  || s == -64U || s == -65U || s == 6U + __INT_MAX__ || s == -8189U
+	  || s == -8191U || s == -8192U || s == -8193U || s == -8250U
+	  || s == -8255U || s == -8256U || s == -8257U || s == __INT_MAX__
+	  || s == __INT_MAX__ + 9U)
+	return;
+    }
+  else
+    {
+      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
+	  || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f || s == 1
+	  || s == (1 << (BITSM1 - 2)) - 1 || s == 2 || s == 24 || s == 5)
+	return;
+    }
+  abort ();
+}
+
+void
+f2 (int s)
+{
+  if ((s & (7U << (BITSM1 - 2))) == 0)
+    {
+      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
+	  || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f || s == 1
+	  || s == (1 << (BITSM1 - 2)) - 1 || s == 2 || s == 24 || s == 5)
+	return;
+    }
+  else
+    {
+      if (s == (-0x4000 << BITSH) - 1 || s == (-0x1000 << BITSH) - 1
+	  || s == (-0x7000 << BITSH) - 1 || s == (-0x5fcf << BITSH) - 1
+	  || s == (-0x4041 << BITSH) || s == (-0x4000 << BITSH)
+	  || s == (-0x1000 << BITSH) || s == (-0x7000 << BITSH)
+	  || s == (-0x4000 << BITSH) + 1 || s == -1 || s == -15 || s == -15550
+	  || s == -15552 || s == (0x7000 << BITSH) - 1
+	  || s == (0x7000 << BITSH) || s == (1 << (BITSM1 - 2))
+	  || s == -__INT_MAX__ - 1 || s == -32 || s == (3 << (BITSM1 - 2)) + 2
+	  || s == -5 || s == -63 || s == -64 || s == -65
+	  || s == -__INT_MAX__ + 4 || s == -8189 || s == -8191 || s == -8192
+	  || s == -8193 || s == -8250 || s == -8255 || s == -8256
+	  || s == -8257 || s == __INT_MAX__ || s == -__INT_MAX__ + 7)
+	return;
+    }
+  abort ();
+}
+
+void
+f3 (unsigned int s)
+{
+  if ((s & 0x3cc0) == 0)
+    {
+      if (s == 0 || s == 0x20 || s == 0x3f || s == (0xbfbfU << BITSH)
+	  || s == (0xc000U << BITSH) || s == (0xf000U << BITSH)
+	  || s == (0x9000U << BITSH) || s == (0xc000U << BITSH) + 1 || s == 1
+	  || s == (0x7000 << BITSH) || s == (1 << (BITSM1 - 2))
+	  || s == 1U + __INT_MAX__ || s == 2 || s == 24
+	  || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == 6U + __INT_MAX__
+	  || s == __INT_MAX__ + 9U)
+	return;
+    }
+  else
+    {
+      if (s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
+	  || s == 0x3cbf || s == 0x3cc0 || s == (0xc000U << BITSH) - 1
+	  || s == (0xf000U << BITSH) - 1 || s == (0x9000U << BITSH) - 1
+	  || s == (0xa031U << BITSH) - 1 || s == -1U || s == -15U
+	  || s == -15550U || s == -15552U || s == (0x7000 << BITSH) - 1
+	  || s == (1 << (BITSM1 - 2)) - 1 || s == -32U || s == -5U
+	  || s == -63U || s == -64U || s == -65U || s == -8189U || s == -8191U
+	  || s == -8192U || s == -8193U || s == -8250U || s == -8255U
+	  || s == -8256U || s == -8257U || s == __INT_MAX__)
+	return;
+    }
+  abort ();
+}
+
+void
+f4 (int s)
+{
+  if ((s & 0x3cc0) == 0)
+    {
+      if (s == 0 || s == 0x20 || s == 0x3f || s == (-0x4041 << BITSH)
+	  || s == (-0x4000 << BITSH) || s == (-0x1000 << BITSH)
+	  || s == (-0x7000 << BITSH) || s == (-0x4000 << BITSH) + 1 || s == 1
+	  || s == (0x7000 << BITSH) || s == (1 << (BITSM1 - 2))
+	  || s == -__INT_MAX__ - 1 || s == 2 || s == 24
+	  || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -__INT_MAX__ + 4
+	  || s == -__INT_MAX__ + 7)
+	return;
+    }
+  else
+    {
+      if (s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
+	  || s == 0x3cbf || s == 0x3cc0 || s == (-0x4000 << BITSH) - 1
+	  || s == (-0x1000 << BITSH) - 1 || s == (-0x7000 << BITSH) - 1
+	  || s == (-0x5fcf << BITSH) - 1 || s == -1 || s == -15 || s == -15550
+	  || s == -15552 || s == (0x7000 << BITSH) - 1
+	  || s == (1 << (BITSM1 - 2)) - 1 || s == -32 || s == -5 || s == -63
+	  || s == -64 || s == -65 || s == -8189 || s == -8191 || s == -8192
+	  || s == -8193 || s == -8250 || s == -8255 || s == -8256
+	  || s == -8257 || s == __INT_MAX__)
+	return;
+    }
+  abort ();
+}
+
+void
+f5 (int s)
+{
+  if ((s & 0x3cc0U) == 0)
+    {
+      if (s == 0 || s == 0x20 || s == 0x3f || s == (-0x4041 << BITSH)
+	  || s == (-0x4000 << BITSH) || s == (-0x1000 << BITSH)
+	  || s == (-0x7000 << BITSH) || s == (-0x4000 << BITSH) + 1 || s == 1
+	  || s == (0x7000 << BITSH) || s == (1 << (BITSM1 - 2))
+	  || s == -__INT_MAX__ - 1 || s == 2 || s == 24
+	  || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -__INT_MAX__ + 4
+	  || s == -__INT_MAX__ + 7)
+	return;
+    }
+  else
+    {
+      if (s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
+	  || s == 0x3cbf || s == 0x3cc0 || s == (-0x4000 << BITSH) - 1
+	  || s == (-0x1000 << BITSH) - 1 || s == (-0x7000 << BITSH) - 1
+	  || s == (-0x5fcf << BITSH) - 1 || s == -1 || s == -15 || s == -15550
+	  || s == -15552 || s == (0x7000 << BITSH) - 1
+	  || s == (1 << (BITSM1 - 2)) - 1 || s == -32 || s == -5 || s == -63
+	  || s == -64 || s == -65 || s == -8189 || s == -8191 || s == -8192
+	  || s == -8193 || s == -8250 || s == -8255 || s == -8256
+	  || s == -8257 || s == __INT_MAX__)
+	return;
+    }
+  abort ();
+}
+
+void
+f6 (unsigned int s)
+{
+  if ((s & 0x3cc0) == 0x3cc0)
+    {
+      if (s == 0x3cc0 || s == (0xc000U << BITSH) - 1
+	  || s == (0xf000U << BITSH) - 1 || s == (0x9000U << BITSH) - 1
+	  || s == (0xa031U << BITSH) - 1 || s == -1U || s == -15U
+	  || s == (0x7000 << BITSH) - 1 || s == (1 << (BITSM1 - 2)) - 1
+	  || s == -32U || s == -5U || s == -63U || s == -64U
+	  || s == __INT_MAX__)
+	return;
+    }
+  else
+    {
+      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
+	  || s == 0x20 || s == 0x3cbf || s == 0x3f || s == (0xbfbfU << BITSH)
+	  || s == (0xc000U << BITSH) || s == (0xf000U << BITSH)
+	  || s == (0x9000U << BITSH) || s == (0xc000U << BITSH) + 1 || s == 1
+	  || s == -15550U || s == -15552U || s == (0x7000 << BITSH)
+	  || s == (1 << (BITSM1 - 2)) || s == 1U + __INT_MAX__ || s == 2
+	  || s == 24 || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -65U
+	  || s == 6U + __INT_MAX__ || s == -8189U || s == -8191U
+	  || s == -8192U || s == -8193U || s == -8250U || s == -8255U
+	  || s == -8256U || s == -8257U || s == __INT_MAX__ + 9U)
+	return;
+    }
+  abort ();
+}
+
+void
+f7 (int s)
+{
+  if ((s & 0x3cc0) == 0x3cc0)
+    {
+      if (s == 0x3cc0 || s == (-0x4000 << BITSH) - 1
+	  || s == (-0x1000 << BITSH) - 1 || s == (-0x7000 << BITSH) - 1
+	  || s == (-0x5fcf << BITSH) - 1 || s == -1 || s == -15
+	  || s == (0x7000 << BITSH) - 1 || s == (1 << (BITSM1 - 2)) - 1
+	  || s == -32 || s == -5 || s == -63 || s == -64 || s == __INT_MAX__)
+	return;
+    }
+  else
+    {
+      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
+	  || s == 0x20 || s == 0x3cbf || s == 0x3f || s == (-0x4041 << BITSH)
+	  || s == (-0x4000 << BITSH) || s == (-0x1000 << BITSH)
+	  || s == (-0x7000 << BITSH) || s == (-0x4000 << BITSH) + 1 || s == 1
+	  || s == -15550 || s == -15552 || s == (0x7000 << BITSH)
+	  || s == (1 << (BITSM1 - 2)) || s == -__INT_MAX__ - 1 || s == 2
+	  || s == 24 || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -65
+	  || s == -__INT_MAX__ + 4 || s == -8189 || s == -8191 || s == -8192
+	  || s == -8193 || s == -8250 || s == -8255 || s == -8256
+	  || s == -8257 || s == -__INT_MAX__ + 7)
+	return;
+    }
+  abort ();
+}
+
+void
+f8 (int s)
+{
+  if ((s & 0x3cc0U) == 0x3cc0)
+    {
+      if (s == 0x3cc0 || s == (-0x4000 << BITSH) - 1
+	  || s == (-0x1000 << BITSH) - 1 || s == (-0x7000 << BITSH) - 1
+	  || s == (-0x5fcf << BITSH) - 1 || s == -1 || s == -15
+	  || s == (0x7000 << BITSH) - 1 || s == (1 << (BITSM1 - 2)) - 1
+	  || s == -32 || s == -5 || s == -63 || s == -64 || s == __INT_MAX__)
+	return;
+    }
+  else
+    {
+      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
+	  || s == 0x20 || s == 0x3cbf || s == 0x3f || s == (-0x4041 << BITSH)
+	  || s == (-0x4000 << BITSH) || s == (-0x1000 << BITSH)
+	  || s == (-0x7000 << BITSH) || s == (-0x4000 << BITSH) + 1 || s == 1
+	  || s == -15550 || s == -15552 || s == (0x7000 << BITSH)
+	  || s == (1 << (BITSM1 - 2)) || s == -__INT_MAX__ - 1 || s == 2
+	  || s == 24 || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -65
+	  || s == -__INT_MAX__ + 4 || s == -8189 || s == -8191 || s == -8192
+	  || s == -8193 || s == -8250 || s == -8255 || s == -8256
+	  || s == -8257 || s == -__INT_MAX__ + 7)
+	return;
+    }
+  abort ();
+}
+
+void
+f9 (unsigned int s)
+{
+  if ((s & 0x3cc0) >= 0x1cc0)
+    {
+      if (s == 0x1cc0 || s == 0x1fff || s == 0x2000 || s == 0x3cbf
+	  || s == 0x3cc0 || s == (0xc000U << BITSH) - 1
+	  || s == (0xf000U << BITSH) - 1 || s == (0x9000U << BITSH) - 1
+	  || s == (0xa031U << BITSH) - 1 || s == -1U || s == -15U
+	  || s == (0x7000 << BITSH) - 1 || s == (1 << (BITSM1 - 2)) - 1
+	  || s == -32U || s == -5U || s == -63U || s == -64U || s == -65U
+	  || s == -8189U || s == -8191U || s == -8192U || s == -8193U
+	  || s == -8250U || s == -8255U || s == -8256U || s == __INT_MAX__)
+	return;
+    }
+  else
+    {
+      if (s == 0 || s == 0x1cbf || s == 0x20 || s == 0x3f
+	  || s == (0xbfbfU << BITSH) || s == (0xc000U << BITSH)
+	  || s == (0xf000U << BITSH) || s == (0x9000U << BITSH)
+	  || s == (0xc000U << BITSH) + 1 || s == 1 || s == -15550U
+	  || s == -15552U || s == (0x7000 << BITSH)
+	  || s == (1 << (BITSM1 - 2)) || s == 1U + __INT_MAX__ || s == 2
+	  || s == 24 || s == (3 << (BITSM1 - 2)) + 2 || s == 5
+	  || s == 6U + __INT_MAX__ || s == -8257U || s == __INT_MAX__ + 9U)
+	return;
+    }
+  abort ();
+}
+
+void
+f10 (unsigned int s)
+{
+  if ((s & 0x3cc0) > 0x1cc0)
+    {
+      if (s == 0x2000 || s == 0x3cbf || s == 0x3cc0
+	  || s == (0xc000U << BITSH) - 1 || s == (0xf000U << BITSH) - 1
+	  || s == (0x9000U << BITSH) - 1 || s == (0xa031U << BITSH) - 1
+	  || s == -1U || s == -15U || s == (0x7000 << BITSH) - 1
+	  || s == (1 << (BITSM1 - 2)) - 1 || s == -32U || s == -5U
+	  || s == -63U || s == -64U || s == -65U || s == -8189U || s == -8191U
+	  || s == -8192U || s == __INT_MAX__)
+	return;
+    }
+  else
+    {
+      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x20
+	  || s == 0x3f || s == (0xbfbfU << BITSH) || s == (0xc000U << BITSH)
+	  || s == (0xf000U << BITSH) || s == (0x9000U << BITSH)
+	  || s == (0xc000U << BITSH) + 1 || s == 1 || s == -15550U
+	  || s == -15552U || s == (0x7000 << BITSH)
+	  || s == (1 << (BITSM1 - 2)) || s == 1U + __INT_MAX__ || s == 2
+	  || s == 24 || s == (3 << (BITSM1 - 2)) + 2 || s == 5
+	  || s == 6U + __INT_MAX__ || s == -8193U || s == -8250U
+	  || s == -8255U || s == -8256U || s == -8257U
+	  || s == __INT_MAX__ + 9U)
+	return;
+    }
+  abort ();
+}
+
+void
+f11 (int s)
+{
+  if ((s & 0x3cc0) >= 0x1cc0)
+    {
+      if (s == 0x1cc0 || s == 0x1fff || s == 0x2000 || s == 0x3cbf
+	  || s == 0x3cc0 || s == (-0x4000 << BITSH) - 1
+	  || s == (-0x1000 << BITSH) - 1 || s == (-0x7000 << BITSH) - 1
+	  || s == (-0x5fcf << BITSH) - 1 || s == -1 || s == -15
+	  || s == (0x7000 << BITSH) - 1 || s == (1 << (BITSM1 - 2)) - 1
+	  || s == -32 || s == -5 || s == -63 || s == -64 || s == -65
+	  || s == -8189 || s == -8191 || s == -8192 || s == -8193
+	  || s == -8250 || s == -8255 || s == -8256 || s == __INT_MAX__)
+	return;
+    }
+  else
+    {
+      if (s == 0 || s == 0x1cbf || s == 0x20 || s == 0x3f
+	  || s == (-0x4041 << BITSH) || s == (-0x4000 << BITSH)
+	  || s == (-0x1000 << BITSH) || s == (-0x7000 << BITSH)
+	  || s == (-0x4000 << BITSH) + 1 || s == 1 || s == -15550
+	  || s == -15552 || s == (0x7000 << BITSH) || s == (1 << (BITSM1 - 2))
+	  || s == -__INT_MAX__ - 1 || s == 2 || s == 24
+	  || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -__INT_MAX__ + 4
+	  || s == -8257 || s == -__INT_MAX__ + 7)
+	return;
+    }
+  abort ();
+}
+
+void
+f12 (int s)
+{
+  if ((s & 0x3cc0) > 0x1cc0)
+    {
+      if (s == 0x2000 || s == 0x3cbf || s == 0x3cc0
+	  || s == (-0x4000 << BITSH) - 1 || s == (-0x1000 << BITSH) - 1
+	  || s == (-0x7000 << BITSH) - 1 || s == (-0x5fcf << BITSH) - 1
+	  || s == -1 || s == -15 || s == (0x7000 << BITSH) - 1
+	  || s == (1 << (BITSM1 - 2)) - 1 || s == -32 || s == -5 || s == -63
+	  || s == -64 || s == -65 || s == -8189 || s == -8191 || s == -8192
+	  || s == __INT_MAX__)
+	return;
+    }
+  else
+    {
+      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x20
+	  || s == 0x3f || s == (-0x4041 << BITSH) || s == (-0x4000 << BITSH)
+	  || s == (-0x1000 << BITSH) || s == (-0x7000 << BITSH)
+	  || s == (-0x4000 << BITSH) + 1 || s == 1 || s == -15550
+	  || s == -15552 || s == (0x7000 << BITSH) || s == (1 << (BITSM1 - 2))
+	  || s == -__INT_MAX__ - 1 || s == 2 || s == 24
+	  || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -__INT_MAX__ + 4
+	  || s == -8193 || s == -8250 || s == -8255 || s == -8256
+	  || s == -8257 || s == -__INT_MAX__ + 7)
+	return;
+    }
+  abort ();
+}
+
+void
+f13 (unsigned int s)
+{
+  if ((s & (0xe071U << BITSH)) > (0xb030U << BITSH))
+    {
+      if (s == (0xf000U << BITSH) - 1 || s == (0xc000U << BITSH)
+	  || s == (0xf000U << BITSH) || s == (0xc000U << BITSH) + 1
+	  || s == -1U || s == -15U || s == -15550U || s == -15552U
+	  || s == -32U || s == -5U || s == -63U || s == -64U || s == -65U
+	  || s == -8189U || s == -8191U || s == -8192U || s == -8193U
+	  || s == -8250U || s == -8255U || s == -8256U || s == -8257U)
+	return;
+    }
+  else
+    {
+      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
+	  || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f
+	  || s == (0xc000U << BITSH) - 1 || s == (0x9000U << BITSH) - 1
+	  || s == (0xa031U << BITSH) - 1 || s == (0xbfbfU << BITSH)
+	  || s == (0x9000U << BITSH) || s == 1 || s == (0x7000 << BITSH) - 1
+	  || s == (0x7000 << BITSH) || s == (1 << (BITSM1 - 2))
+	  || s == (1 << (BITSM1 - 2)) - 1 || s == 1U + __INT_MAX__ || s == 2
+	  || s == 24 || s == (3 << (BITSM1 - 2)) + 2 || s == 5
+	  || s == 6U + __INT_MAX__ || s == __INT_MAX__
+	  || s == __INT_MAX__ + 9U)
+	return;
+    }
+  abort ();
+}
+
+void
+f14 (unsigned int s)
+{
+  if ((s & (0xe071U << BITSH)) > (0xa030U << BITSH))
+    {
+      if (s == (0xc000U << BITSH) - 1 || s == (0xf000U << BITSH) - 1
+	  || s == (0xbfbfU << BITSH) || s == (0xc000U << BITSH)
+	  || s == (0xf000U << BITSH) || s == (0xc000U << BITSH) + 1
+	  || s == -1U || s == -15U || s == -15550U || s == -15552U
+	  || s == -32U || s == -5U || s == -63U || s == -64U || s == -65U
+	  || s == -8189U || s == -8191U || s == -8192U || s == -8193U
+	  || s == -8250U || s == -8255U || s == -8256U || s == -8257U)
+	return;
+    }
+  else
+    {
+      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
+	  || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f
+	  || s == (0x9000U << BITSH) - 1 || s == (0xa031U << BITSH) - 1
+	  || s == (0x9000U << BITSH) || s == 1 || s == (0x7000 << BITSH) - 1
+	  || s == (0x7000 << BITSH) || s == (1 << (BITSM1 - 2))
+	  || s == (1 << (BITSM1 - 2)) - 1 || s == 1U + __INT_MAX__ || s == 2
+	  || s == 24 || s == (3 << (BITSM1 - 2)) + 2 || s == 5
+	  || s == 6U + __INT_MAX__ || s == __INT_MAX__
+	  || s == __INT_MAX__ + 9U)
+	return;
+    }
+  abort ();
+}
+
+void
+f15 (int s)
+{
+  if ((s & ((-0x1f8f) << BITSH)) > ((-0x4fd0) << BITSH))
+    {
+      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
+	  || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f
+	  || s == (-0x1000 << BITSH) - 1 || s == (-0x4000 << BITSH)
+	  || s == (-0x1000 << BITSH) || s == (-0x4000 << BITSH) + 1 || s == 1
+	  || s == -1 || s == -15 || s == -15550 || s == -15552
+	  || s == (0x7000 << BITSH) - 1 || s == (0x7000 << BITSH)
+	  || s == (1 << (BITSM1 - 2)) || s == (1 << (BITSM1 - 2)) - 1
+	  || s == 2 || s == 24 || s == -32 || s == (3 << (BITSM1 - 2)) + 2
+	  || s == 5 || s == -5 || s == -63 || s == -64 || s == -65
+	  || s == -8189 || s == -8191 || s == -8192 || s == -8193
+	  || s == -8250 || s == -8255 || s == -8256 || s == -8257
+	  || s == __INT_MAX__)
+	return;
+    }
+  else
+    {
+      if (s == (-0x4000 << BITSH) - 1 || s == (-0x7000 << BITSH) - 1
+	  || s == (-0x5fcf << BITSH) - 1 || s == (-0x4041 << BITSH)
+	  || s == (-0x7000 << BITSH) || s == -__INT_MAX__ - 1
+	  || s == -__INT_MAX__ + 4 || s == -__INT_MAX__ + 7)
+	return;
+    }
+  abort ();
+}
+
+void
+f16 (int s)
+{
+  if ((s & ((-0x1f8f) << BITSH)) >= ((-0x4fd0) << BITSH))
+    {
+      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
+	  || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f
+	  || s == (-0x1000 << BITSH) - 1 || s == (-0x4000 << BITSH)
+	  || s == (-0x1000 << BITSH) || s == (-0x4000 << BITSH) + 1 || s == 1
+	  || s == -1 || s == -15 || s == -15550 || s == -15552
+	  || s == (0x7000 << BITSH) - 1 || s == (0x7000 << BITSH)
+	  || s == (1 << (BITSM1 - 2)) || s == (1 << (BITSM1 - 2)) - 1
+	  || s == 2 || s == 24 || s == -32 || s == (3 << (BITSM1 - 2)) + 2
+	  || s == 5 || s == -5 || s == -63 || s == -64 || s == -65
+	  || s == -8189 || s == -8191 || s == -8192 || s == -8193
+	  || s == -8250 || s == -8255 || s == -8256 || s == -8257
+	  || s == __INT_MAX__)
+	return;
+    }
+  else
+    {
+      if (s == (-0x4000 << BITSH) - 1 || s == (-0x7000 << BITSH) - 1
+	  || s == (-0x5fcf << BITSH) - 1 || s == (-0x4041 << BITSH)
+	  || s == (-0x7000 << BITSH) || s == -__INT_MAX__ - 1
+	  || s == -__INT_MAX__ + 4 || s == -__INT_MAX__ + 7)
+	return;
+    }
+  abort ();
+}
+
+void
+f17 (int s)
+{
+  if ((s & ((-0x4000 << BITSH) | 1)) != -__INT_MAX__ - 1)
+    {
+      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
+	  || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f
+	  || s == (-0x4000 << BITSH) - 1 || s == (-0x1000 << BITSH) - 1
+	  || s == (-0x7000 << BITSH) - 1 || s == (-0x5fcf << BITSH) - 1
+	  || s == (-0x4000 << BITSH) || s == (-0x1000 << BITSH)
+	  || s == (-0x4000 << BITSH) + 1 || s == 1 || s == -1 || s == -15
+	  || s == -15550 || s == -15552 || s == (0x7000 << BITSH) - 1
+	  || s == (0x7000 << BITSH) || s == (1 << (BITSM1 - 2))
+	  || s == (1 << (BITSM1 - 2)) - 1 || s == 2 || s == 24 || s == -32
+	  || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -5 || s == -63
+	  || s == -64 || s == -65 || s == -__INT_MAX__ + 4 || s == -8189
+	  || s == -8191 || s == -8192 || s == -8193 || s == -8250
+	  || s == -8255 || s == -8256 || s == -8257 || s == __INT_MAX__)
+	return;
+    }
+  else
+    {
+      if (s == (-0x4041 << BITSH) || s == (-0x7000 << BITSH)
+	  || s == -__INT_MAX__ - 1 || s == -__INT_MAX__ + 7)
+	return;
+    }
+  abort ();
+}
+
+void
+f18 (int s)
+{
+  if ((s & ((-0x4000 << BITSH) | 1)) != ((-0x4000 << BITSH) | 1))
+    {
+      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
+	  || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f
+	  || s == (-0x4000 << BITSH) - 1 || s == (-0x7000 << BITSH) - 1
+	  || s == (-0x5fcf << BITSH) - 1 || s == (-0x4041 << BITSH)
+	  || s == (-0x4000 << BITSH) || s == (-0x1000 << BITSH)
+	  || s == (-0x7000 << BITSH) || s == 1 || s == -15550 || s == -15552
+	  || s == (0x7000 << BITSH) - 1 || s == (0x7000 << BITSH)
+	  || s == (1 << (BITSM1 - 2)) || s == (1 << (BITSM1 - 2)) - 1
+	  || s == -__INT_MAX__ - 1 || s == 2 || s == 24 || s == -32
+	  || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -64
+	  || s == -__INT_MAX__ + 4 || s == -8192 || s == -8250 || s == -8256
+	  || s == __INT_MAX__ || s == -__INT_MAX__ + 7)
+	return;
+    }
+  else
+    {
+      if (s == (-0x1000 << BITSH) - 1 || s == (-0x4000 << BITSH) + 1
+	  || s == -1 || s == -15 || s == -5 || s == -63 || s == -65
+	  || s == -8189 || s == -8191 || s == -8193 || s == -8255
+	  || s == -8257)
+	return;
+    }
+  abort ();
+}
+
+void
+f19 (int s)
+{
+  if ((s & ((-0x4000 << BITSH) | 1)) != ((0x4000 << BITSH) | 1))
+    {
+      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
+	  || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f
+	  || s == (-0x4000 << BITSH) - 1 || s == (-0x1000 << BITSH) - 1
+	  || s == (-0x7000 << BITSH) - 1 || s == (-0x5fcf << BITSH) - 1
+	  || s == (-0x4041 << BITSH) || s == (-0x4000 << BITSH)
+	  || s == (-0x1000 << BITSH) || s == (-0x7000 << BITSH)
+	  || s == (-0x4000 << BITSH) + 1 || s == 1 || s == -1 || s == -15
+	  || s == -15550 || s == -15552 || s == (0x7000 << BITSH)
+	  || s == (1 << (BITSM1 - 2)) || s == (1 << (BITSM1 - 2)) - 1
+	  || s == -__INT_MAX__ - 1 || s == 2 || s == 24 || s == -32
+	  || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -5 || s == -63
+	  || s == -64 || s == -65 || s == -__INT_MAX__ + 4 || s == -8189
+	  || s == -8191 || s == -8192 || s == -8193 || s == -8250
+	  || s == -8255 || s == -8256 || s == -8257 || s == -__INT_MAX__ + 7)
+	return;
+    }
+  else
+    {
+      if (s == (0x7000 << BITSH) - 1 || s == __INT_MAX__)
+	return;
+    }
+  abort ();
+}
+
+void
+f20 (int s)
+{
+  if ((s & (-0x1000 << BITSH)) != -__INT_MAX__ - 1)
+    {
+      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
+	  || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f
+	  || s == (-0x4000 << BITSH) - 1 || s == (-0x1000 << BITSH) - 1
+	  || s == (-0x5fcf << BITSH) - 1 || s == (-0x4041 << BITSH)
+	  || s == (-0x4000 << BITSH) || s == (-0x1000 << BITSH)
+	  || s == (-0x7000 << BITSH) || s == (-0x4000 << BITSH) + 1 || s == 1
+	  || s == -1 || s == -15 || s == -15550 || s == -15552
+	  || s == (0x7000 << BITSH) - 1 || s == (0x7000 << BITSH)
+	  || s == (1 << (BITSM1 - 2)) || s == (1 << (BITSM1 - 2)) - 1
+	  || s == 2 || s == 24 || s == -32 || s == (3 << (BITSM1 - 2)) + 2
+	  || s == 5 || s == -5 || s == -63 || s == -64 || s == -65
+	  || s == -8189 || s == -8191 || s == -8192 || s == -8193
+	  || s == -8250 || s == -8255 || s == -8256 || s == -8257
+	  || s == __INT_MAX__)
+	return;
+    }
+  else
+    {
+      if (s == (-0x7000 << BITSH) - 1 || s == -__INT_MAX__ - 1
+	  || s == -__INT_MAX__ + 4 || s == -__INT_MAX__ + 7)
+	return;
+    }
+  abort ();
+}
+
+void
+f21 (int s)
+{
+  if ((s & (-0x1000 << BITSH)) != (-0x1000 << BITSH))
+    {
+      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
+	  || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f
+	  || s == (-0x4000 << BITSH) - 1 || s == (-0x1000 << BITSH) - 1
+	  || s == (-0x7000 << BITSH) - 1 || s == (-0x5fcf << BITSH) - 1
+	  || s == (-0x4041 << BITSH) || s == (-0x4000 << BITSH)
+	  || s == (-0x7000 << BITSH) || s == (-0x4000 << BITSH) + 1 || s == 1
+	  || s == (0x7000 << BITSH) - 1 || s == (0x7000 << BITSH)
+	  || s == (1 << (BITSM1 - 2)) || s == (1 << (BITSM1 - 2)) - 1
+	  || s == -__INT_MAX__ - 1 || s == 2 || s == 24
+	  || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -__INT_MAX__ + 4
+	  || s == __INT_MAX__ || s == -__INT_MAX__ + 7)
+	return;
+    }
+  else
+    {
+      if (s == (-0x1000 << BITSH) || s == -1 || s == -15 || s == -15550
+	  || s == -15552 || s == -32 || s == -5 || s == -63 || s == -64
+	  || s == -65 || s == -8189 || s == -8191 || s == -8192 || s == -8193
+	  || s == -8250 || s == -8255 || s == -8256 || s == -8257)
+	return;
+    }
+  abort ();
+}
+
+void
+f22 (int s)
+{
+  if ((s & (-0x1000 << BITSH)) != (0x7000 << BITSH))
+    {
+      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
+	  || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f
+	  || s == (-0x4000 << BITSH) - 1 || s == (-0x1000 << BITSH) - 1
+	  || s == (-0x7000 << BITSH) - 1 || s == (-0x5fcf << BITSH) - 1
+	  || s == (-0x4041 << BITSH) || s == (-0x4000 << BITSH)
+	  || s == (-0x1000 << BITSH) || s == (-0x7000 << BITSH)
+	  || s == (-0x4000 << BITSH) + 1 || s == 1 || s == -1 || s == -15
+	  || s == -15550 || s == -15552 || s == (0x7000 << BITSH) - 1
+	  || s == (1 << (BITSM1 - 2)) || s == (1 << (BITSM1 - 2)) - 1
+	  || s == -__INT_MAX__ - 1 || s == 2 || s == 24 || s == -32
+	  || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -5 || s == -63
+	  || s == -64 || s == -65 || s == -__INT_MAX__ + 4 || s == -8189
+	  || s == -8191 || s == -8192 || s == -8193 || s == -8250
+	  || s == -8255 || s == -8256 || s == -8257 || s == -__INT_MAX__ + 7)
+	return;
+    }
+  else
+    {
+      if (s == (0x7000 << BITSH) || s == __INT_MAX__)
+	return;
+    }
+  abort ();
+}
+
+void
+f23 (unsigned int s)
+{
+  if ((s & (0xf000U << BITSH)) != (0x7000 << BITSH))
+    {
+      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
+	  || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f
+	  || s == (0xc000U << BITSH) - 1 || s == (0xf000U << BITSH) - 1
+	  || s == (0x9000U << BITSH) - 1 || s == (0xa031U << BITSH) - 1
+	  || s == (0xbfbfU << BITSH) || s == (0xc000U << BITSH)
+	  || s == (0xf000U << BITSH) || s == (0x9000U << BITSH)
+	  || s == (0xc000U << BITSH) + 1 || s == 1 || s == -1U || s == -15U
+	  || s == -15550U || s == -15552U || s == (0x7000 << BITSH) - 1
+	  || s == (1 << (BITSM1 - 2)) || s == (1 << (BITSM1 - 2)) - 1
+	  || s == 1U + __INT_MAX__ || s == 2 || s == 24 || s == -32U
+	  || s == (3 << (BITSM1 - 2)) + 2 || s == 5 || s == -5U || s == -63U
+	  || s == -64U || s == -65U || s == 6U + __INT_MAX__ || s == -8189U
+	  || s == -8191U || s == -8192U || s == -8193U || s == -8250U
+	  || s == -8255U || s == -8256U || s == -8257U
+	  || s == __INT_MAX__ + 9U)
+	return;
+    }
+  else
+    {
+      if (s == (0x7000 << BITSH) || s == __INT_MAX__)
+	return;
+    }
+  abort ();
+}
+
+void
+f24 (unsigned int s)
+{
+  if ((s & (0xf000U << BITSH)) != (0x8000U << BITSH))
+    {
+      if (s == 0 || s == 0x1cbf || s == 0x1cc0 || s == 0x1fff || s == 0x2000
+	  || s == 0x20 || s == 0x3cbf || s == 0x3cc0 || s == 0x3f
+	  || s == (0xc000U << BITSH) - 1 || s == (0xf000U << BITSH) - 1
+	  || s == (0xa031U << BITSH) - 1 || s == (0xbfbfU << BITSH)
+	  || s == (0xc000U << BITSH) || s == (0xf000U << BITSH)
+	  || s == (0x9000U << BITSH) || s == (0xc000U << BITSH) + 1 || s == 1
+	  || s == -1U || s == -15U || s == -15550U || s == -15552U
+	  || s == (0x7000 << BITSH) - 1 || s == (0x7000 << BITSH)
+	  || s == (1 << (BITSM1 - 2)) || s == (1 << (BITSM1 - 2)) - 1
+	  || s == 2 || s == 24 || s == -32U || s == (3 << (BITSM1 - 2)) + 2
+	  || s == 5 || s == -5U || s == -63U || s == -64U || s == -65U
+	  || s == -8189U || s == -8191U || s == -8192U || s == -8193U
+	  || s == -8250U || s == -8255U || s == -8256U || s == -8257U
+	  || s == __INT_MAX__)
+	return;
+    }
+  else
+    {
+      if (s == (0x9000U << BITSH) - 1 || s == 1U + __INT_MAX__
+	  || s == 6U + __INT_MAX__ || s == __INT_MAX__ + 9U)
+	return;
+    }
+  abort ();
+}
+
+int svals[] = {
+  0,
+  0x1cbf,
+  0x1cc0,
+  0x1fff,
+  0x2000,
+  0x20,
+  0x3cbf,
+  0x3cc0,
+  0x3f,
+  (-0x4000 << BITSH) - 1,
+  (-0x1000 << BITSH) - 1,
+  (-0x7000 << BITSH) - 1,
+  (-0x5fcf << BITSH) - 1,
+  (-0x4041 << BITSH),
+  (-0x4000 << BITSH),
+  (-0x1000 << BITSH),
+  (-0x7000 << BITSH),
+  (-0x4000 << BITSH) + 1,
+  1,
+  -1,
+  -15,
+  -15550,
+  -15552,
+  (0x7000 << BITSH) - 1,
+  (0x7000 << BITSH),
+  (1 << (BITSM1 - 2)),
+  (1 << (BITSM1 - 2)) - 1,
+  -__INT_MAX__ - 1,
+  2,
+  24,
+  -32,
+  (3 << (BITSM1 - 2)) + 2,
+  5,
+  -5,
+  -63,
+  -64,
+  -65,
+  -__INT_MAX__ + 4,
+  -8189,
+  -8191,
+  -8192,
+  -8193,
+  -8250,
+  -8255,
+  -8256,
+  -8257,
+  __INT_MAX__,
+  -__INT_MAX__ + 7,
+};
+
+unsigned int uvals[] = {
+  0,
+  0x1cbf,
+  0x1cc0,
+  0x1fff,
+  0x2000,
+  0x20,
+  0x3cbf,
+  0x3cc0,
+  0x3f,
+  (0xc000U << BITSH) - 1,
+  (0xf000U << BITSH) - 1,
+  (0x9000U << BITSH) - 1,
+  (0xa031U << BITSH) - 1,
+  (0xbfbfU << BITSH),
+  (0xc000U << BITSH),
+  (0xf000U << BITSH),
+  (0x9000U << BITSH),
+  (0xc000U << BITSH) + 1,
+  1,
+  -1U,
+  -15U,
+  -15550U,
+  -15552U,
+  (0x7000 << BITSH) - 1,
+  (0x7000 << BITSH),
+  (1 << (BITSM1 - 2)),
+  (1 << (BITSM1 - 2)) - 1,
+  1U + __INT_MAX__,
+  2,
+  24,
+  -32U,
+  (3 << (BITSM1 - 2)) + 2,
+  5,
+  -5U,
+  -63U,
+  -64U,
+  -65U,
+  6U + __INT_MAX__,
+  -8189U,
+  -8191U,
+  -8192U,
+  -8193U,
+  -8250U,
+  -8255U,
+  -8256U,
+  -8257U,
+  __INT_MAX__,
+  __INT_MAX__ + 9U,
+};
+
+int
+main ()
+{
+  int i;
+  for (i = 0; i < sizeof (svals) / sizeof (svals[0]); i++)
+    {
+      f2 (svals[i]);
+      f4 (svals[i]);
+      f5 (svals[i]);
+      f7 (svals[i]);
+      f8 (svals[i]);
+      f11 (svals[i]);
+      f12 (svals[i]);
+      f15 (svals[i]);
+      f16 (svals[i]);
+      f17 (svals[i]);
+      f18 (svals[i]);
+      f19 (svals[i]);
+      f20 (svals[i]);
+      f21 (svals[i]);
+      f22 (svals[i]);
+    }
+  for (i = 0; i < sizeof (uvals) / sizeof (uvals[0]); i++)
+    {
+      f1 (uvals[i]);
+      f3 (uvals[i]);
+      f6 (uvals[i]);
+      f9 (uvals[i]);
+      f10 (uvals[i]);
+      f13 (uvals[i]);
+      f14 (uvals[i]);
+      f23 (uvals[i]);
+      f24 (uvals[i]);
+    }
+  return 0;
+}