Home | History | Annotate | Line # | Download | only in gcc
      1      1.1  mrg /* Support routines for value ranges.
      2  1.1.1.2  mrg    Copyright (C) 2019-2022 Free Software Foundation, Inc.
      3  1.1.1.2  mrg    Major hacks by Aldy Hernandez <aldyh (at) redhat.com> and
      4  1.1.1.2  mrg    Andrew MacLeod <amacleod (at) redhat.com>.
      5      1.1  mrg 
      6      1.1  mrg This file is part of GCC.
      7      1.1  mrg 
      8      1.1  mrg GCC is free software; you can redistribute it and/or modify
      9      1.1  mrg it under the terms of the GNU General Public License as published by
     10      1.1  mrg the Free Software Foundation; either version 3, or (at your option)
     11      1.1  mrg any later version.
     12      1.1  mrg 
     13      1.1  mrg GCC is distributed in the hope that it will be useful,
     14      1.1  mrg but WITHOUT ANY WARRANTY; without even the implied warranty of
     15      1.1  mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     16      1.1  mrg GNU General Public License for more details.
     17      1.1  mrg 
     18      1.1  mrg You should have received a copy of the GNU General Public License
     19      1.1  mrg along with GCC; see the file COPYING3.  If not see
     20      1.1  mrg <http://www.gnu.org/licenses/>.  */
     21      1.1  mrg 
     22      1.1  mrg #include "config.h"
     23      1.1  mrg #include "system.h"
     24      1.1  mrg #include "coretypes.h"
     25      1.1  mrg #include "backend.h"
     26      1.1  mrg #include "tree.h"
     27      1.1  mrg #include "gimple.h"
     28      1.1  mrg #include "ssa.h"
     29      1.1  mrg #include "tree-pretty-print.h"
     30      1.1  mrg #include "fold-const.h"
     31  1.1.1.2  mrg #include "gimple-range.h"
     32      1.1  mrg 
     33  1.1.1.2  mrg // Here we copy between any two irange's.  The ranges can be legacy or
     34  1.1.1.2  mrg // multi-ranges, and copying between any combination works correctly.
     35      1.1  mrg 
     36  1.1.1.2  mrg irange &
     37  1.1.1.2  mrg irange::operator= (const irange &src)
     38      1.1  mrg {
     39  1.1.1.2  mrg   if (legacy_mode_p ())
     40  1.1.1.2  mrg     {
     41  1.1.1.2  mrg       copy_to_legacy (src);
     42  1.1.1.2  mrg       return *this;
     43  1.1.1.2  mrg     }
     44  1.1.1.2  mrg   if (src.legacy_mode_p ())
     45  1.1.1.2  mrg     {
     46  1.1.1.2  mrg       copy_legacy_to_multi_range (src);
     47  1.1.1.2  mrg       return *this;
     48  1.1.1.2  mrg     }
     49      1.1  mrg 
     50  1.1.1.2  mrg   unsigned x;
     51  1.1.1.2  mrg   unsigned lim = src.m_num_ranges;
     52  1.1.1.2  mrg   if (lim > m_max_ranges)
     53  1.1.1.2  mrg     lim = m_max_ranges;
     54  1.1.1.2  mrg 
     55  1.1.1.2  mrg   for (x = 0; x < lim * 2; ++x)
     56  1.1.1.2  mrg     m_base[x] = src.m_base[x];
     57  1.1.1.2  mrg 
     58  1.1.1.2  mrg   // If the range didn't fit, the last range should cover the rest.
     59  1.1.1.2  mrg   if (lim != src.m_num_ranges)
     60  1.1.1.2  mrg     m_base[x - 1] = src.m_base[src.m_num_ranges * 2 - 1];
     61  1.1.1.2  mrg 
     62  1.1.1.2  mrg   m_num_ranges = lim;
     63  1.1.1.2  mrg   m_kind = src.m_kind;
     64  1.1.1.2  mrg   return *this;
     65      1.1  mrg }
     66      1.1  mrg 
     67  1.1.1.2  mrg // Return TRUE if range is a multi-range that can be represented as a
     68  1.1.1.2  mrg // VR_ANTI_RANGE.
     69  1.1.1.2  mrg 
     70  1.1.1.2  mrg bool
     71  1.1.1.2  mrg irange::maybe_anti_range () const
     72      1.1  mrg {
     73  1.1.1.2  mrg   tree ttype = type ();
     74  1.1.1.2  mrg   unsigned int precision = TYPE_PRECISION (ttype);
     75  1.1.1.2  mrg   signop sign = TYPE_SIGN (ttype);
     76  1.1.1.2  mrg   return (num_pairs () > 1
     77  1.1.1.2  mrg 	  && precision > 1
     78  1.1.1.2  mrg 	  && lower_bound () == wi::min_value (precision, sign)
     79  1.1.1.2  mrg 	  && upper_bound () == wi::max_value (precision, sign));
     80      1.1  mrg }
     81      1.1  mrg 
     82      1.1  mrg void
     83  1.1.1.2  mrg irange::copy_legacy_to_multi_range (const irange &src)
     84      1.1  mrg {
     85  1.1.1.2  mrg   gcc_checking_assert (src.legacy_mode_p ());
     86  1.1.1.2  mrg   gcc_checking_assert (!legacy_mode_p ());
     87  1.1.1.2  mrg   if (src.undefined_p ())
     88  1.1.1.2  mrg     set_undefined ();
     89  1.1.1.2  mrg   else if (src.varying_p ())
     90  1.1.1.2  mrg     set_varying (src.type ());
     91  1.1.1.2  mrg   else
     92      1.1  mrg     {
     93  1.1.1.2  mrg       if (range_has_numeric_bounds_p (&src))
     94  1.1.1.2  mrg 	set (src.min (), src.max (), src.kind ());
     95  1.1.1.2  mrg       else
     96  1.1.1.2  mrg 	{
     97  1.1.1.2  mrg 	  value_range cst (src);
     98  1.1.1.2  mrg 	  cst.normalize_symbolics ();
     99  1.1.1.2  mrg 	  gcc_checking_assert (cst.varying_p () || cst.kind () == VR_RANGE);
    100  1.1.1.2  mrg 	  set (cst.min (), cst.max ());
    101  1.1.1.2  mrg 	}
    102      1.1  mrg     }
    103      1.1  mrg }
    104      1.1  mrg 
    105  1.1.1.2  mrg // Copy any type of irange into a legacy.
    106      1.1  mrg 
    107      1.1  mrg void
    108  1.1.1.2  mrg irange::copy_to_legacy (const irange &src)
    109      1.1  mrg {
    110  1.1.1.2  mrg   gcc_checking_assert (legacy_mode_p ());
    111  1.1.1.2  mrg   // Handle legacy to legacy and other things that are easy to copy.
    112  1.1.1.2  mrg   if (src.legacy_mode_p () || src.varying_p () || src.undefined_p ())
    113  1.1.1.2  mrg     {
    114  1.1.1.2  mrg       m_num_ranges = src.m_num_ranges;
    115  1.1.1.2  mrg       m_base[0] = src.m_base[0];
    116  1.1.1.2  mrg       m_base[1] = src.m_base[1];
    117  1.1.1.2  mrg       m_kind = src.m_kind;
    118      1.1  mrg       return;
    119      1.1  mrg     }
    120  1.1.1.2  mrg   // Copy multi-range to legacy.
    121  1.1.1.2  mrg   if (src.maybe_anti_range ())
    122      1.1  mrg     {
    123  1.1.1.2  mrg       int_range<3> r (src);
    124  1.1.1.2  mrg       r.invert ();
    125  1.1.1.2  mrg       // Use tree variants to save on tree -> wi -> tree conversions.
    126  1.1.1.2  mrg       set (r.tree_lower_bound (0), r.tree_upper_bound (0), VR_ANTI_RANGE);
    127      1.1  mrg     }
    128  1.1.1.2  mrg   else
    129  1.1.1.2  mrg     set (src.tree_lower_bound (), src.tree_upper_bound ());
    130  1.1.1.2  mrg }
    131      1.1  mrg 
    132  1.1.1.2  mrg // Swap MIN/MAX if they are out of order and adjust KIND appropriately.
    133      1.1  mrg 
    134  1.1.1.2  mrg static void
    135  1.1.1.2  mrg swap_out_of_order_endpoints (tree &min, tree &max, value_range_kind &kind)
    136  1.1.1.2  mrg {
    137  1.1.1.2  mrg   gcc_checking_assert (kind != VR_UNDEFINED);
    138  1.1.1.2  mrg   if (kind == VR_VARYING)
    139  1.1.1.2  mrg     return;
    140      1.1  mrg   /* Wrong order for min and max, to swap them and the VR type we need
    141      1.1  mrg      to adjust them.  */
    142      1.1  mrg   if (tree_int_cst_lt (max, min))
    143      1.1  mrg     {
    144      1.1  mrg       tree one, tmp;
    145      1.1  mrg 
    146      1.1  mrg       /* For one bit precision if max < min, then the swapped
    147      1.1  mrg 	 range covers all values, so for VR_RANGE it is varying and
    148      1.1  mrg 	 for VR_ANTI_RANGE empty range, so drop to varying as well.  */
    149      1.1  mrg       if (TYPE_PRECISION (TREE_TYPE (min)) == 1)
    150      1.1  mrg 	{
    151  1.1.1.2  mrg 	  kind = VR_VARYING;
    152      1.1  mrg 	  return;
    153      1.1  mrg 	}
    154      1.1  mrg 
    155      1.1  mrg       one = build_int_cst (TREE_TYPE (min), 1);
    156      1.1  mrg       tmp = int_const_binop (PLUS_EXPR, max, one);
    157      1.1  mrg       max = int_const_binop (MINUS_EXPR, min, one);
    158      1.1  mrg       min = tmp;
    159      1.1  mrg 
    160      1.1  mrg       /* There's one corner case, if we had [C+1, C] before we now have
    161      1.1  mrg 	 that again.  But this represents an empty value range, so drop
    162      1.1  mrg 	 to varying in this case.  */
    163      1.1  mrg       if (tree_int_cst_lt (max, min))
    164      1.1  mrg 	{
    165  1.1.1.2  mrg 	  kind = VR_VARYING;
    166      1.1  mrg 	  return;
    167      1.1  mrg 	}
    168      1.1  mrg       kind = kind == VR_RANGE ? VR_ANTI_RANGE : VR_RANGE;
    169      1.1  mrg     }
    170  1.1.1.2  mrg }
    171  1.1.1.2  mrg 
    172  1.1.1.2  mrg void
    173  1.1.1.2  mrg irange::irange_set (tree min, tree max)
    174  1.1.1.2  mrg {
    175  1.1.1.2  mrg   gcc_checking_assert (!POLY_INT_CST_P (min));
    176  1.1.1.2  mrg   gcc_checking_assert (!POLY_INT_CST_P (max));
    177  1.1.1.2  mrg 
    178  1.1.1.2  mrg   m_base[0] = min;
    179  1.1.1.2  mrg   m_base[1] = max;
    180  1.1.1.2  mrg   m_num_ranges = 1;
    181  1.1.1.2  mrg   m_kind = VR_RANGE;
    182  1.1.1.2  mrg   normalize_kind ();
    183  1.1.1.2  mrg 
    184  1.1.1.2  mrg   if (flag_checking)
    185  1.1.1.2  mrg     verify_range ();
    186  1.1.1.2  mrg }
    187  1.1.1.2  mrg 
    188  1.1.1.2  mrg void
    189  1.1.1.2  mrg irange::irange_set_1bit_anti_range (tree min, tree max)
    190  1.1.1.2  mrg {
    191  1.1.1.2  mrg   tree type = TREE_TYPE (min);
    192  1.1.1.2  mrg   gcc_checking_assert (TYPE_PRECISION (type) == 1);
    193  1.1.1.2  mrg 
    194  1.1.1.2  mrg   if (operand_equal_p (min, max))
    195  1.1.1.2  mrg     {
    196  1.1.1.2  mrg       // Since these are 1-bit quantities, they can only be [MIN,MIN]
    197  1.1.1.2  mrg       // or [MAX,MAX].
    198  1.1.1.2  mrg       if (vrp_val_is_min (min))
    199  1.1.1.2  mrg 	min = max = vrp_val_max (type);
    200  1.1.1.2  mrg       else
    201  1.1.1.2  mrg 	min = max = vrp_val_min (type);
    202  1.1.1.2  mrg       set (min, max);
    203  1.1.1.2  mrg     }
    204  1.1.1.2  mrg   else
    205  1.1.1.2  mrg     {
    206  1.1.1.2  mrg       // The only alternative is [MIN,MAX], which is the empty range.
    207  1.1.1.2  mrg       gcc_checking_assert (vrp_val_is_min (min));
    208  1.1.1.2  mrg       gcc_checking_assert (vrp_val_is_max (max));
    209  1.1.1.2  mrg       set_undefined ();
    210  1.1.1.2  mrg     }
    211  1.1.1.2  mrg   if (flag_checking)
    212  1.1.1.2  mrg     verify_range ();
    213  1.1.1.2  mrg }
    214  1.1.1.2  mrg 
    215  1.1.1.2  mrg void
    216  1.1.1.2  mrg irange::irange_set_anti_range (tree min, tree max)
    217  1.1.1.2  mrg {
    218  1.1.1.2  mrg   gcc_checking_assert (!POLY_INT_CST_P (min));
    219  1.1.1.2  mrg   gcc_checking_assert (!POLY_INT_CST_P (max));
    220  1.1.1.2  mrg 
    221  1.1.1.2  mrg   if (TYPE_PRECISION (TREE_TYPE (min)) == 1)
    222  1.1.1.2  mrg     {
    223  1.1.1.2  mrg       irange_set_1bit_anti_range (min, max);
    224  1.1.1.2  mrg       return;
    225  1.1.1.2  mrg     }
    226      1.1  mrg 
    227  1.1.1.2  mrg   // set an anti-range
    228      1.1  mrg   tree type = TREE_TYPE (min);
    229  1.1.1.2  mrg   signop sign = TYPE_SIGN (type);
    230  1.1.1.2  mrg   int_range<2> type_range (type);
    231  1.1.1.2  mrg   // Calculate INVERSE([I,J]) as [-MIN, I-1][J+1, +MAX].
    232  1.1.1.2  mrg   m_num_ranges = 0;
    233  1.1.1.2  mrg   wi::overflow_type ovf;
    234  1.1.1.2  mrg 
    235  1.1.1.2  mrg   wide_int w_min = wi::to_wide (min);
    236  1.1.1.2  mrg   if (wi::ne_p (w_min, type_range.lower_bound ()))
    237  1.1.1.2  mrg     {
    238  1.1.1.2  mrg       wide_int lim1 = wi::sub (w_min, 1, sign, &ovf);
    239  1.1.1.2  mrg       gcc_checking_assert (ovf != wi::OVF_OVERFLOW);
    240  1.1.1.2  mrg       m_base[0] = type_range.tree_lower_bound (0);
    241  1.1.1.2  mrg       m_base[1] = wide_int_to_tree (type, lim1);
    242  1.1.1.2  mrg       m_num_ranges = 1;
    243  1.1.1.2  mrg     }
    244  1.1.1.2  mrg   wide_int w_max = wi::to_wide (max);
    245  1.1.1.2  mrg   if (wi::ne_p (w_max, type_range.upper_bound ()))
    246  1.1.1.2  mrg     {
    247  1.1.1.2  mrg       wide_int lim2 = wi::add (w_max, 1, sign, &ovf);
    248  1.1.1.2  mrg       gcc_checking_assert (ovf != wi::OVF_OVERFLOW);
    249  1.1.1.2  mrg       m_base[m_num_ranges * 2] = wide_int_to_tree (type, lim2);
    250  1.1.1.2  mrg       m_base[m_num_ranges * 2 + 1] = type_range.tree_upper_bound (0);
    251  1.1.1.2  mrg       ++m_num_ranges;
    252  1.1.1.2  mrg     }
    253  1.1.1.2  mrg 
    254  1.1.1.2  mrg   m_kind = VR_RANGE;
    255  1.1.1.2  mrg   normalize_kind ();
    256  1.1.1.2  mrg 
    257  1.1.1.2  mrg   if (flag_checking)
    258  1.1.1.2  mrg     verify_range ();
    259  1.1.1.2  mrg }
    260  1.1.1.2  mrg 
    261  1.1.1.2  mrg /* Set value range to the canonical form of {VRTYPE, MIN, MAX, EQUIV}.
    262  1.1.1.2  mrg    This means adjusting VRTYPE, MIN and MAX representing the case of a
    263  1.1.1.2  mrg    wrapping range with MAX < MIN covering [MIN, type_max] U [type_min, MAX]
    264  1.1.1.2  mrg    as anti-rage ~[MAX+1, MIN-1].  Likewise for wrapping anti-ranges.
    265  1.1.1.2  mrg    In corner cases where MAX+1 or MIN-1 wraps this will fall back
    266  1.1.1.2  mrg    to varying.
    267  1.1.1.2  mrg    This routine exists to ease canonicalization in the case where we
    268  1.1.1.2  mrg    extract ranges from var + CST op limit.  */
    269  1.1.1.2  mrg 
    270  1.1.1.2  mrg void
    271  1.1.1.2  mrg irange::set (tree min, tree max, value_range_kind kind)
    272  1.1.1.2  mrg {
    273  1.1.1.2  mrg   if (kind != VR_UNDEFINED)
    274  1.1.1.2  mrg     {
    275  1.1.1.2  mrg       if (TREE_OVERFLOW_P (min))
    276  1.1.1.2  mrg 	min = drop_tree_overflow (min);
    277  1.1.1.2  mrg       if (TREE_OVERFLOW_P (max))
    278  1.1.1.2  mrg 	max = drop_tree_overflow (max);
    279  1.1.1.2  mrg     }
    280  1.1.1.2  mrg 
    281  1.1.1.2  mrg   if (!legacy_mode_p ())
    282  1.1.1.2  mrg     {
    283  1.1.1.2  mrg       if (kind == VR_RANGE)
    284  1.1.1.2  mrg 	irange_set (min, max);
    285  1.1.1.2  mrg       else
    286  1.1.1.2  mrg 	{
    287  1.1.1.2  mrg 	  gcc_checking_assert (kind == VR_ANTI_RANGE);
    288  1.1.1.2  mrg 	  irange_set_anti_range (min, max);
    289  1.1.1.2  mrg 	}
    290  1.1.1.2  mrg       return;
    291  1.1.1.2  mrg     }
    292  1.1.1.2  mrg   if (kind == VR_UNDEFINED)
    293  1.1.1.2  mrg     {
    294  1.1.1.2  mrg       set_undefined ();
    295  1.1.1.2  mrg       return;
    296  1.1.1.2  mrg     }
    297  1.1.1.2  mrg 
    298  1.1.1.2  mrg   if (kind == VR_VARYING
    299  1.1.1.2  mrg       || POLY_INT_CST_P (min)
    300  1.1.1.2  mrg       || POLY_INT_CST_P (max))
    301  1.1.1.2  mrg     {
    302  1.1.1.2  mrg       set_varying (TREE_TYPE (min));
    303  1.1.1.2  mrg       return;
    304  1.1.1.2  mrg     }
    305  1.1.1.2  mrg 
    306  1.1.1.2  mrg   // Nothing to canonicalize for symbolic ranges.
    307  1.1.1.2  mrg   if (TREE_CODE (min) != INTEGER_CST
    308  1.1.1.2  mrg       || TREE_CODE (max) != INTEGER_CST)
    309  1.1.1.2  mrg     {
    310  1.1.1.2  mrg       m_kind = kind;
    311  1.1.1.2  mrg       m_base[0] = min;
    312  1.1.1.2  mrg       m_base[1] = max;
    313  1.1.1.2  mrg       m_num_ranges = 1;
    314  1.1.1.2  mrg       return;
    315  1.1.1.2  mrg     }
    316      1.1  mrg 
    317  1.1.1.2  mrg   swap_out_of_order_endpoints (min, max, kind);
    318  1.1.1.2  mrg   if (kind == VR_VARYING)
    319  1.1.1.2  mrg     {
    320  1.1.1.2  mrg       set_varying (TREE_TYPE (min));
    321  1.1.1.2  mrg       return;
    322  1.1.1.2  mrg     }
    323  1.1.1.2  mrg 
    324  1.1.1.2  mrg   // Anti-ranges that can be represented as ranges should be so.
    325      1.1  mrg   if (kind == VR_ANTI_RANGE)
    326      1.1  mrg     {
    327      1.1  mrg       bool is_min = vrp_val_is_min (min);
    328      1.1  mrg       bool is_max = vrp_val_is_max (max);
    329      1.1  mrg 
    330      1.1  mrg       if (is_min && is_max)
    331      1.1  mrg 	{
    332  1.1.1.2  mrg 	  // Fall through.  This will either be normalized as
    333  1.1.1.2  mrg 	  // VR_UNDEFINED if the anti-range spans the entire
    334  1.1.1.2  mrg 	  // precision, or it will remain an VR_ANTI_RANGE in the case
    335  1.1.1.2  mrg 	  // of an -fstrict-enum where [MIN,MAX] is less than the span
    336  1.1.1.2  mrg 	  // of underlying precision.
    337      1.1  mrg 	}
    338  1.1.1.2  mrg       else if (TYPE_PRECISION (TREE_TYPE (min)) == 1)
    339      1.1  mrg 	{
    340  1.1.1.2  mrg 	  irange_set_1bit_anti_range (min, max);
    341  1.1.1.2  mrg 	  return;
    342      1.1  mrg 	}
    343      1.1  mrg       else if (is_min)
    344      1.1  mrg         {
    345      1.1  mrg 	  tree one = build_int_cst (TREE_TYPE (max), 1);
    346      1.1  mrg 	  min = int_const_binop (PLUS_EXPR, max, one);
    347      1.1  mrg 	  max = vrp_val_max (TREE_TYPE (max));
    348      1.1  mrg 	  kind = VR_RANGE;
    349      1.1  mrg         }
    350      1.1  mrg       else if (is_max)
    351      1.1  mrg         {
    352      1.1  mrg 	  tree one = build_int_cst (TREE_TYPE (min), 1);
    353      1.1  mrg 	  max = int_const_binop (MINUS_EXPR, min, one);
    354      1.1  mrg 	  min = vrp_val_min (TREE_TYPE (min));
    355      1.1  mrg 	  kind = VR_RANGE;
    356      1.1  mrg         }
    357      1.1  mrg     }
    358      1.1  mrg 
    359      1.1  mrg   m_kind = kind;
    360  1.1.1.2  mrg   m_base[0] = min;
    361  1.1.1.2  mrg   m_base[1] = max;
    362  1.1.1.2  mrg   m_num_ranges = 1;
    363  1.1.1.2  mrg   normalize_kind ();
    364      1.1  mrg   if (flag_checking)
    365  1.1.1.2  mrg     verify_range ();
    366      1.1  mrg }
    367      1.1  mrg 
    368  1.1.1.2  mrg // Check the validity of the range.
    369      1.1  mrg 
    370      1.1  mrg void
    371  1.1.1.2  mrg irange::verify_range ()
    372      1.1  mrg {
    373  1.1.1.2  mrg   if (m_kind == VR_UNDEFINED)
    374      1.1  mrg     {
    375  1.1.1.2  mrg       gcc_checking_assert (m_num_ranges == 0);
    376  1.1.1.2  mrg       return;
    377      1.1  mrg     }
    378  1.1.1.2  mrg   if (m_kind == VR_VARYING)
    379      1.1  mrg     {
    380  1.1.1.2  mrg       gcc_checking_assert (m_num_ranges == 1);
    381  1.1.1.2  mrg       gcc_checking_assert (varying_compatible_p ());
    382  1.1.1.2  mrg       return;
    383      1.1  mrg     }
    384  1.1.1.2  mrg   if (!legacy_mode_p ())
    385  1.1.1.2  mrg     {
    386  1.1.1.2  mrg       gcc_checking_assert (m_num_ranges != 0);
    387  1.1.1.2  mrg       gcc_checking_assert (!varying_compatible_p ());
    388  1.1.1.2  mrg       for (unsigned i = 0; i < m_num_ranges; ++i)
    389  1.1.1.2  mrg 	{
    390  1.1.1.2  mrg 	  tree lb = tree_lower_bound (i);
    391  1.1.1.2  mrg 	  tree ub = tree_upper_bound (i);
    392  1.1.1.2  mrg 	  int c = compare_values (lb, ub);
    393  1.1.1.2  mrg 	  gcc_checking_assert (c == 0 || c == -1);
    394  1.1.1.2  mrg 	}
    395  1.1.1.2  mrg       return;
    396  1.1.1.2  mrg     }
    397  1.1.1.2  mrg   if (m_kind == VR_RANGE || m_kind == VR_ANTI_RANGE)
    398      1.1  mrg     {
    399  1.1.1.2  mrg       gcc_checking_assert (m_num_ranges == 1);
    400  1.1.1.2  mrg       int cmp = compare_values (tree_lower_bound (0), tree_upper_bound (0));
    401  1.1.1.2  mrg       gcc_checking_assert (cmp == 0 || cmp == -1 || cmp == -2);
    402      1.1  mrg     }
    403      1.1  mrg }
    404      1.1  mrg 
    405  1.1.1.2  mrg // Return the lower bound for a sub-range.  PAIR is the sub-range in
    406  1.1.1.2  mrg // question.
    407      1.1  mrg 
    408      1.1  mrg wide_int
    409  1.1.1.2  mrg irange::legacy_lower_bound (unsigned pair) const
    410      1.1  mrg {
    411  1.1.1.2  mrg   gcc_checking_assert (legacy_mode_p ());
    412      1.1  mrg   if (symbolic_p ())
    413      1.1  mrg     {
    414      1.1  mrg       value_range numeric_range (*this);
    415      1.1  mrg       numeric_range.normalize_symbolics ();
    416  1.1.1.2  mrg       return numeric_range.legacy_lower_bound (pair);
    417      1.1  mrg     }
    418  1.1.1.2  mrg   gcc_checking_assert (m_num_ranges > 0);
    419      1.1  mrg   gcc_checking_assert (pair + 1 <= num_pairs ());
    420      1.1  mrg   if (m_kind == VR_ANTI_RANGE)
    421      1.1  mrg     {
    422  1.1.1.2  mrg       tree typ = type (), t;
    423  1.1.1.2  mrg       if (pair == 1 || vrp_val_is_min (min ()))
    424  1.1.1.2  mrg 	t = wide_int_to_tree (typ, wi::to_wide (max ()) + 1);
    425      1.1  mrg       else
    426      1.1  mrg 	t = vrp_val_min (typ);
    427  1.1.1.2  mrg       return wi::to_wide (t);
    428      1.1  mrg     }
    429  1.1.1.2  mrg  return wi::to_wide (tree_lower_bound (pair));
    430      1.1  mrg }
    431      1.1  mrg 
    432  1.1.1.2  mrg // Return the upper bound for a sub-range.  PAIR is the sub-range in
    433  1.1.1.2  mrg // question.
    434      1.1  mrg 
    435      1.1  mrg wide_int
    436  1.1.1.2  mrg irange::legacy_upper_bound (unsigned pair) const
    437      1.1  mrg {
    438  1.1.1.2  mrg   gcc_checking_assert (legacy_mode_p ());
    439      1.1  mrg   if (symbolic_p ())
    440      1.1  mrg     {
    441      1.1  mrg       value_range numeric_range (*this);
    442      1.1  mrg       numeric_range.normalize_symbolics ();
    443  1.1.1.2  mrg       return numeric_range.legacy_upper_bound (pair);
    444      1.1  mrg     }
    445  1.1.1.2  mrg   gcc_checking_assert (m_num_ranges > 0);
    446      1.1  mrg   gcc_checking_assert (pair + 1 <= num_pairs ());
    447      1.1  mrg   if (m_kind == VR_ANTI_RANGE)
    448      1.1  mrg     {
    449  1.1.1.2  mrg       tree typ = type (), t;
    450  1.1.1.2  mrg       if (pair == 1 || vrp_val_is_min (min ()))
    451      1.1  mrg 	t = vrp_val_max (typ);
    452      1.1  mrg       else
    453  1.1.1.2  mrg 	t = wide_int_to_tree (typ, wi::to_wide (min ()) - 1);
    454  1.1.1.2  mrg       return wi::to_wide (t);
    455      1.1  mrg     }
    456  1.1.1.2  mrg   return wi::to_wide (tree_upper_bound (pair));
    457      1.1  mrg }
    458      1.1  mrg 
    459      1.1  mrg bool
    460  1.1.1.2  mrg irange::legacy_equal_p (const irange &other) const
    461      1.1  mrg {
    462  1.1.1.2  mrg   gcc_checking_assert (legacy_mode_p () && other.legacy_mode_p ());
    463      1.1  mrg 
    464  1.1.1.2  mrg   if (m_kind != other.m_kind)
    465  1.1.1.2  mrg    return false;
    466  1.1.1.2  mrg   if (m_kind == VR_UNDEFINED)
    467  1.1.1.2  mrg     return true;
    468  1.1.1.2  mrg   if (m_kind == VR_VARYING)
    469  1.1.1.2  mrg     return range_compatible_p (type (), other.type ());
    470  1.1.1.2  mrg   return (vrp_operand_equal_p (tree_lower_bound (0),
    471  1.1.1.2  mrg 			       other.tree_lower_bound (0))
    472  1.1.1.2  mrg 	  && vrp_operand_equal_p (tree_upper_bound (0),
    473  1.1.1.2  mrg 				  other.tree_upper_bound (0)));
    474      1.1  mrg }
    475      1.1  mrg 
    476      1.1  mrg bool
    477  1.1.1.2  mrg irange::equal_p (const irange &other) const
    478      1.1  mrg {
    479  1.1.1.2  mrg   if (legacy_mode_p ())
    480  1.1.1.2  mrg     {
    481  1.1.1.2  mrg       if (other.legacy_mode_p ())
    482  1.1.1.2  mrg 	return legacy_equal_p (other);
    483  1.1.1.2  mrg       value_range tmp (other);
    484  1.1.1.2  mrg       return legacy_equal_p (tmp);
    485  1.1.1.2  mrg     }
    486  1.1.1.2  mrg   if (other.legacy_mode_p ())
    487  1.1.1.2  mrg     {
    488  1.1.1.2  mrg       value_range tmp2 (*this);
    489  1.1.1.2  mrg       return tmp2.legacy_equal_p (other);
    490  1.1.1.2  mrg     }
    491  1.1.1.2  mrg 
    492  1.1.1.2  mrg   if (m_num_ranges != other.m_num_ranges)
    493  1.1.1.2  mrg     return false;
    494  1.1.1.2  mrg 
    495  1.1.1.2  mrg   for (unsigned i = 0; i < m_num_ranges; ++i)
    496  1.1.1.2  mrg     {
    497  1.1.1.2  mrg       tree lb = tree_lower_bound (i);
    498  1.1.1.2  mrg       tree ub = tree_upper_bound (i);
    499  1.1.1.2  mrg       tree lb_other = other.tree_lower_bound (i);
    500  1.1.1.2  mrg       tree ub_other = other.tree_upper_bound (i);
    501  1.1.1.2  mrg       if (!operand_equal_p (lb, lb_other, 0)
    502  1.1.1.2  mrg 	  || !operand_equal_p (ub, ub_other, 0))
    503  1.1.1.2  mrg 	return false;
    504  1.1.1.2  mrg     }
    505  1.1.1.2  mrg   return true;
    506      1.1  mrg }
    507      1.1  mrg 
    508      1.1  mrg /* Return TRUE if this is a symbolic range.  */
    509      1.1  mrg 
    510      1.1  mrg bool
    511  1.1.1.2  mrg irange::symbolic_p () const
    512      1.1  mrg {
    513  1.1.1.2  mrg   return (m_num_ranges > 0
    514  1.1.1.2  mrg 	  && (!is_gimple_min_invariant (min ())
    515  1.1.1.2  mrg 	      || !is_gimple_min_invariant (max ())));
    516      1.1  mrg }
    517      1.1  mrg 
    518  1.1.1.2  mrg /* Return TRUE if this is a constant range.  */
    519      1.1  mrg 
    520      1.1  mrg bool
    521  1.1.1.2  mrg irange::constant_p () const
    522      1.1  mrg {
    523  1.1.1.2  mrg   return (m_num_ranges > 0
    524  1.1.1.2  mrg 	  && TREE_CODE (min ()) == INTEGER_CST
    525  1.1.1.2  mrg 	  && TREE_CODE (max ()) == INTEGER_CST);
    526      1.1  mrg }
    527      1.1  mrg 
    528  1.1.1.2  mrg /* If range is a singleton, place it in RESULT and return TRUE.
    529  1.1.1.2  mrg    Note: A singleton can be any gimple invariant, not just constants.
    530  1.1.1.2  mrg    So, [&x, &x] counts as a singleton.  */
    531  1.1.1.2  mrg 
    532      1.1  mrg bool
    533  1.1.1.2  mrg irange::singleton_p (tree *result) const
    534      1.1  mrg {
    535  1.1.1.2  mrg   if (!legacy_mode_p ())
    536  1.1.1.2  mrg     {
    537  1.1.1.2  mrg       if (num_pairs () == 1 && (wi::to_wide (tree_lower_bound ())
    538  1.1.1.2  mrg 				== wi::to_wide (tree_upper_bound ())))
    539  1.1.1.2  mrg 	{
    540  1.1.1.2  mrg 	  if (result)
    541  1.1.1.2  mrg 	    *result = tree_lower_bound ();
    542  1.1.1.2  mrg 	  return true;
    543  1.1.1.2  mrg 	}
    544  1.1.1.2  mrg       return false;
    545  1.1.1.2  mrg     }
    546      1.1  mrg   if (m_kind == VR_ANTI_RANGE)
    547      1.1  mrg     {
    548      1.1  mrg       if (nonzero_p ())
    549      1.1  mrg 	{
    550      1.1  mrg 	  if (TYPE_PRECISION (type ()) == 1)
    551      1.1  mrg 	    {
    552      1.1  mrg 	      if (result)
    553  1.1.1.2  mrg 		*result = max ();
    554      1.1  mrg 	      return true;
    555      1.1  mrg 	    }
    556      1.1  mrg 	  return false;
    557      1.1  mrg 	}
    558      1.1  mrg       if (num_pairs () == 1)
    559      1.1  mrg 	{
    560      1.1  mrg 	  value_range vr0, vr1;
    561  1.1.1.2  mrg 	  ranges_from_anti_range ((const value_range *) this, &vr0, &vr1);
    562      1.1  mrg 	  return vr0.singleton_p (result);
    563      1.1  mrg 	}
    564      1.1  mrg     }
    565  1.1.1.2  mrg   // Catches non-numeric extremes as well.
    566      1.1  mrg   if (m_kind == VR_RANGE
    567      1.1  mrg       && vrp_operand_equal_p (min (), max ())
    568      1.1  mrg       && is_gimple_min_invariant (min ()))
    569      1.1  mrg     {
    570      1.1  mrg       if (result)
    571      1.1  mrg         *result = min ();
    572      1.1  mrg       return true;
    573      1.1  mrg     }
    574      1.1  mrg   return false;
    575      1.1  mrg }
    576      1.1  mrg 
    577      1.1  mrg /* Return 1 if VAL is inside value range.
    578  1.1.1.2  mrg 	  0 if VAL is not inside value range.
    579      1.1  mrg 	 -2 if we cannot tell either way.
    580      1.1  mrg 
    581      1.1  mrg    Benchmark compile/20001226-1.c compilation time after changing this
    582      1.1  mrg    function.  */
    583      1.1  mrg 
    584      1.1  mrg int
    585  1.1.1.2  mrg irange::value_inside_range (tree val) const
    586      1.1  mrg {
    587      1.1  mrg   if (varying_p ())
    588      1.1  mrg     return 1;
    589      1.1  mrg 
    590      1.1  mrg   if (undefined_p ())
    591      1.1  mrg     return 0;
    592      1.1  mrg 
    593  1.1.1.2  mrg   if (!legacy_mode_p () && TREE_CODE (val) == INTEGER_CST)
    594  1.1.1.2  mrg     return contains_p (val);
    595  1.1.1.2  mrg 
    596  1.1.1.2  mrg   int cmp1 = operand_less_p (val, min ());
    597      1.1  mrg   if (cmp1 == -2)
    598      1.1  mrg     return -2;
    599      1.1  mrg   if (cmp1 == 1)
    600      1.1  mrg     return m_kind != VR_RANGE;
    601      1.1  mrg 
    602  1.1.1.2  mrg   int cmp2 = operand_less_p (max (), val);
    603      1.1  mrg   if (cmp2 == -2)
    604      1.1  mrg     return -2;
    605      1.1  mrg 
    606      1.1  mrg   if (m_kind == VR_RANGE)
    607      1.1  mrg     return !cmp2;
    608      1.1  mrg   else
    609      1.1  mrg     return !!cmp2;
    610      1.1  mrg }
    611      1.1  mrg 
    612      1.1  mrg /* Return TRUE if it is possible that range contains VAL.  */
    613      1.1  mrg 
    614      1.1  mrg bool
    615  1.1.1.2  mrg irange::may_contain_p (tree val) const
    616      1.1  mrg {
    617      1.1  mrg   return value_inside_range (val) != 0;
    618      1.1  mrg }
    619      1.1  mrg 
    620      1.1  mrg /* Return TRUE if range contains INTEGER_CST.  */
    621  1.1.1.2  mrg /* Return 1 if VAL is inside value range.
    622  1.1.1.2  mrg 	  0 if VAL is not inside value range.
    623  1.1.1.2  mrg 
    624  1.1.1.2  mrg    Benchmark compile/20001226-1.c compilation time after changing this
    625  1.1.1.2  mrg    function.  */
    626  1.1.1.2  mrg 
    627      1.1  mrg 
    628      1.1  mrg bool
    629  1.1.1.2  mrg irange::contains_p (tree cst) const
    630      1.1  mrg {
    631  1.1.1.2  mrg   if (undefined_p ())
    632  1.1.1.2  mrg     return false;
    633  1.1.1.2  mrg 
    634  1.1.1.2  mrg   if (legacy_mode_p ())
    635      1.1  mrg     {
    636  1.1.1.2  mrg       gcc_checking_assert (TREE_CODE (cst) == INTEGER_CST);
    637  1.1.1.2  mrg       if (symbolic_p ())
    638  1.1.1.2  mrg 	{
    639  1.1.1.2  mrg 	  value_range numeric_range (*this);
    640  1.1.1.2  mrg 	  numeric_range.normalize_symbolics ();
    641  1.1.1.2  mrg 	  return numeric_range.contains_p (cst);
    642  1.1.1.2  mrg 	}
    643  1.1.1.2  mrg       return value_inside_range (cst) == 1;
    644  1.1.1.2  mrg     }
    645  1.1.1.2  mrg 
    646  1.1.1.2  mrg   gcc_checking_assert (TREE_CODE (cst) == INTEGER_CST);
    647  1.1.1.2  mrg   signop sign = TYPE_SIGN (TREE_TYPE (cst));
    648  1.1.1.2  mrg   wide_int v = wi::to_wide (cst);
    649  1.1.1.2  mrg   for (unsigned r = 0; r < m_num_ranges; ++r)
    650  1.1.1.2  mrg     {
    651  1.1.1.2  mrg       if (wi::lt_p (v, lower_bound (r), sign))
    652  1.1.1.2  mrg 	return false;
    653  1.1.1.2  mrg       if (wi::le_p (v, upper_bound (r), sign))
    654  1.1.1.2  mrg 	return true;
    655      1.1  mrg     }
    656  1.1.1.2  mrg 
    657  1.1.1.2  mrg   return false;
    658      1.1  mrg }
    659      1.1  mrg 
    660  1.1.1.2  mrg 
    661      1.1  mrg /* Normalize addresses into constants.  */
    662      1.1  mrg 
    663      1.1  mrg void
    664  1.1.1.2  mrg irange::normalize_addresses ()
    665      1.1  mrg {
    666      1.1  mrg   if (undefined_p ())
    667      1.1  mrg     return;
    668      1.1  mrg 
    669      1.1  mrg   if (!POINTER_TYPE_P (type ()) || range_has_numeric_bounds_p (this))
    670      1.1  mrg     return;
    671      1.1  mrg 
    672      1.1  mrg   if (!range_includes_zero_p (this))
    673      1.1  mrg     {
    674  1.1.1.2  mrg       gcc_checking_assert (TREE_CODE (min ()) == ADDR_EXPR
    675  1.1.1.2  mrg 			   || TREE_CODE (max ()) == ADDR_EXPR);
    676      1.1  mrg       set_nonzero (type ());
    677      1.1  mrg       return;
    678      1.1  mrg     }
    679      1.1  mrg   set_varying (type ());
    680      1.1  mrg }
    681      1.1  mrg 
    682      1.1  mrg /* Normalize symbolics and addresses into constants.  */
    683      1.1  mrg 
    684      1.1  mrg void
    685  1.1.1.2  mrg irange::normalize_symbolics ()
    686      1.1  mrg {
    687      1.1  mrg   if (varying_p () || undefined_p ())
    688      1.1  mrg     return;
    689      1.1  mrg 
    690      1.1  mrg   tree ttype = type ();
    691      1.1  mrg   bool min_symbolic = !is_gimple_min_invariant (min ());
    692      1.1  mrg   bool max_symbolic = !is_gimple_min_invariant (max ());
    693      1.1  mrg   if (!min_symbolic && !max_symbolic)
    694      1.1  mrg     {
    695      1.1  mrg       normalize_addresses ();
    696      1.1  mrg       return;
    697      1.1  mrg     }
    698      1.1  mrg 
    699      1.1  mrg   // [SYM, SYM] -> VARYING
    700      1.1  mrg   if (min_symbolic && max_symbolic)
    701      1.1  mrg     {
    702      1.1  mrg       set_varying (ttype);
    703      1.1  mrg       return;
    704      1.1  mrg     }
    705      1.1  mrg   if (kind () == VR_RANGE)
    706      1.1  mrg     {
    707      1.1  mrg       // [SYM, NUM] -> [-MIN, NUM]
    708      1.1  mrg       if (min_symbolic)
    709      1.1  mrg 	{
    710      1.1  mrg 	  set (vrp_val_min (ttype), max ());
    711      1.1  mrg 	  return;
    712      1.1  mrg 	}
    713      1.1  mrg       // [NUM, SYM] -> [NUM, +MAX]
    714      1.1  mrg       set (min (), vrp_val_max (ttype));
    715      1.1  mrg       return;
    716      1.1  mrg     }
    717      1.1  mrg   gcc_checking_assert (kind () == VR_ANTI_RANGE);
    718      1.1  mrg   // ~[SYM, NUM] -> [NUM + 1, +MAX]
    719      1.1  mrg   if (min_symbolic)
    720      1.1  mrg     {
    721      1.1  mrg       if (!vrp_val_is_max (max ()))
    722      1.1  mrg 	{
    723      1.1  mrg 	  tree n = wide_int_to_tree (ttype, wi::to_wide (max ()) + 1);
    724      1.1  mrg 	  set (n, vrp_val_max (ttype));
    725      1.1  mrg 	  return;
    726      1.1  mrg 	}
    727      1.1  mrg       set_varying (ttype);
    728      1.1  mrg       return;
    729      1.1  mrg     }
    730      1.1  mrg   // ~[NUM, SYM] -> [-MIN, NUM - 1]
    731      1.1  mrg   if (!vrp_val_is_min (min ()))
    732      1.1  mrg     {
    733      1.1  mrg       tree n = wide_int_to_tree (ttype, wi::to_wide (min ()) - 1);
    734      1.1  mrg       set (vrp_val_min (ttype), n);
    735      1.1  mrg       return;
    736      1.1  mrg     }
    737      1.1  mrg   set_varying (ttype);
    738      1.1  mrg }
    739      1.1  mrg 
    740      1.1  mrg /* Intersect the two value-ranges { *VR0TYPE, *VR0MIN, *VR0MAX } and
    741      1.1  mrg    { VR1TYPE, VR0MIN, VR0MAX } and store the result
    742      1.1  mrg    in { *VR0TYPE, *VR0MIN, *VR0MAX }.  This may not be the smallest
    743      1.1  mrg    possible such range.  The resulting range is not canonicalized.  */
    744      1.1  mrg 
    745      1.1  mrg static void
    746      1.1  mrg intersect_ranges (enum value_range_kind *vr0type,
    747      1.1  mrg 		  tree *vr0min, tree *vr0max,
    748      1.1  mrg 		  enum value_range_kind vr1type,
    749      1.1  mrg 		  tree vr1min, tree vr1max)
    750      1.1  mrg {
    751      1.1  mrg   bool mineq = vrp_operand_equal_p (*vr0min, vr1min);
    752      1.1  mrg   bool maxeq = vrp_operand_equal_p (*vr0max, vr1max);
    753      1.1  mrg 
    754      1.1  mrg   /* [] is vr0, () is vr1 in the following classification comments.  */
    755      1.1  mrg   if (mineq && maxeq)
    756      1.1  mrg     {
    757      1.1  mrg       /* [(  )] */
    758      1.1  mrg       if (*vr0type == vr1type)
    759      1.1  mrg 	/* Nothing to do for equal ranges.  */
    760      1.1  mrg 	;
    761      1.1  mrg       else if ((*vr0type == VR_RANGE
    762      1.1  mrg 		&& vr1type == VR_ANTI_RANGE)
    763      1.1  mrg 	       || (*vr0type == VR_ANTI_RANGE
    764      1.1  mrg 		   && vr1type == VR_RANGE))
    765      1.1  mrg 	{
    766      1.1  mrg 	  /* For anti-range with range intersection the result is empty.  */
    767      1.1  mrg 	  *vr0type = VR_UNDEFINED;
    768      1.1  mrg 	  *vr0min = NULL_TREE;
    769      1.1  mrg 	  *vr0max = NULL_TREE;
    770      1.1  mrg 	}
    771      1.1  mrg       else
    772      1.1  mrg 	gcc_unreachable ();
    773      1.1  mrg     }
    774      1.1  mrg   else if (operand_less_p (*vr0max, vr1min) == 1
    775      1.1  mrg 	   || operand_less_p (vr1max, *vr0min) == 1)
    776      1.1  mrg     {
    777      1.1  mrg       /* [ ] ( ) or ( ) [ ]
    778      1.1  mrg 	 If the ranges have an empty intersection, the result of the
    779      1.1  mrg 	 intersect operation is the range for intersecting an
    780      1.1  mrg 	 anti-range with a range or empty when intersecting two ranges.  */
    781      1.1  mrg       if (*vr0type == VR_RANGE
    782      1.1  mrg 	  && vr1type == VR_ANTI_RANGE)
    783      1.1  mrg 	;
    784      1.1  mrg       else if (*vr0type == VR_ANTI_RANGE
    785      1.1  mrg 	       && vr1type == VR_RANGE)
    786      1.1  mrg 	{
    787      1.1  mrg 	  *vr0type = vr1type;
    788      1.1  mrg 	  *vr0min = vr1min;
    789      1.1  mrg 	  *vr0max = vr1max;
    790      1.1  mrg 	}
    791      1.1  mrg       else if (*vr0type == VR_RANGE
    792      1.1  mrg 	       && vr1type == VR_RANGE)
    793      1.1  mrg 	{
    794      1.1  mrg 	  *vr0type = VR_UNDEFINED;
    795      1.1  mrg 	  *vr0min = NULL_TREE;
    796      1.1  mrg 	  *vr0max = NULL_TREE;
    797      1.1  mrg 	}
    798      1.1  mrg       else if (*vr0type == VR_ANTI_RANGE
    799      1.1  mrg 	       && vr1type == VR_ANTI_RANGE)
    800      1.1  mrg 	{
    801      1.1  mrg 	  /* If the anti-ranges are adjacent to each other merge them.  */
    802      1.1  mrg 	  if (TREE_CODE (*vr0max) == INTEGER_CST
    803      1.1  mrg 	      && TREE_CODE (vr1min) == INTEGER_CST
    804      1.1  mrg 	      && operand_less_p (*vr0max, vr1min) == 1
    805      1.1  mrg 	      && integer_onep (int_const_binop (MINUS_EXPR,
    806      1.1  mrg 						vr1min, *vr0max)))
    807      1.1  mrg 	    *vr0max = vr1max;
    808      1.1  mrg 	  else if (TREE_CODE (vr1max) == INTEGER_CST
    809      1.1  mrg 		   && TREE_CODE (*vr0min) == INTEGER_CST
    810      1.1  mrg 		   && operand_less_p (vr1max, *vr0min) == 1
    811      1.1  mrg 		   && integer_onep (int_const_binop (MINUS_EXPR,
    812      1.1  mrg 						     *vr0min, vr1max)))
    813      1.1  mrg 	    *vr0min = vr1min;
    814      1.1  mrg 	  /* Else arbitrarily take VR0.  */
    815      1.1  mrg 	}
    816      1.1  mrg     }
    817      1.1  mrg   else if ((maxeq || operand_less_p (vr1max, *vr0max) == 1)
    818      1.1  mrg 	   && (mineq || operand_less_p (*vr0min, vr1min) == 1))
    819      1.1  mrg     {
    820      1.1  mrg       /* [ (  ) ] or [(  ) ] or [ (  )] */
    821      1.1  mrg       if (*vr0type == VR_RANGE
    822      1.1  mrg 	  && vr1type == VR_RANGE)
    823      1.1  mrg 	{
    824      1.1  mrg 	  /* If both are ranges the result is the inner one.  */
    825      1.1  mrg 	  *vr0type = vr1type;
    826      1.1  mrg 	  *vr0min = vr1min;
    827      1.1  mrg 	  *vr0max = vr1max;
    828      1.1  mrg 	}
    829      1.1  mrg       else if (*vr0type == VR_RANGE
    830      1.1  mrg 	       && vr1type == VR_ANTI_RANGE)
    831      1.1  mrg 	{
    832      1.1  mrg 	  /* Choose the right gap if the left one is empty.  */
    833      1.1  mrg 	  if (mineq)
    834      1.1  mrg 	    {
    835      1.1  mrg 	      if (TREE_CODE (vr1max) != INTEGER_CST)
    836      1.1  mrg 		*vr0min = vr1max;
    837      1.1  mrg 	      else if (TYPE_PRECISION (TREE_TYPE (vr1max)) == 1
    838      1.1  mrg 		       && !TYPE_UNSIGNED (TREE_TYPE (vr1max)))
    839      1.1  mrg 		*vr0min
    840      1.1  mrg 		  = int_const_binop (MINUS_EXPR, vr1max,
    841      1.1  mrg 				     build_int_cst (TREE_TYPE (vr1max), -1));
    842      1.1  mrg 	      else
    843      1.1  mrg 		*vr0min
    844      1.1  mrg 		  = int_const_binop (PLUS_EXPR, vr1max,
    845      1.1  mrg 				     build_int_cst (TREE_TYPE (vr1max), 1));
    846      1.1  mrg 	    }
    847      1.1  mrg 	  /* Choose the left gap if the right one is empty.  */
    848      1.1  mrg 	  else if (maxeq)
    849      1.1  mrg 	    {
    850      1.1  mrg 	      if (TREE_CODE (vr1min) != INTEGER_CST)
    851      1.1  mrg 		*vr0max = vr1min;
    852      1.1  mrg 	      else if (TYPE_PRECISION (TREE_TYPE (vr1min)) == 1
    853      1.1  mrg 		       && !TYPE_UNSIGNED (TREE_TYPE (vr1min)))
    854      1.1  mrg 		*vr0max
    855      1.1  mrg 		  = int_const_binop (PLUS_EXPR, vr1min,
    856      1.1  mrg 				     build_int_cst (TREE_TYPE (vr1min), -1));
    857      1.1  mrg 	      else
    858      1.1  mrg 		*vr0max
    859      1.1  mrg 		  = int_const_binop (MINUS_EXPR, vr1min,
    860      1.1  mrg 				     build_int_cst (TREE_TYPE (vr1min), 1));
    861      1.1  mrg 	    }
    862      1.1  mrg 	  /* Choose the anti-range if the range is effectively varying.  */
    863      1.1  mrg 	  else if (vrp_val_is_min (*vr0min)
    864      1.1  mrg 		   && vrp_val_is_max (*vr0max))
    865      1.1  mrg 	    {
    866      1.1  mrg 	      *vr0type = vr1type;
    867      1.1  mrg 	      *vr0min = vr1min;
    868      1.1  mrg 	      *vr0max = vr1max;
    869      1.1  mrg 	    }
    870      1.1  mrg 	  /* Else choose the range.  */
    871      1.1  mrg 	}
    872      1.1  mrg       else if (*vr0type == VR_ANTI_RANGE
    873      1.1  mrg 	       && vr1type == VR_ANTI_RANGE)
    874      1.1  mrg 	/* If both are anti-ranges the result is the outer one.  */
    875      1.1  mrg 	;
    876      1.1  mrg       else if (*vr0type == VR_ANTI_RANGE
    877      1.1  mrg 	       && vr1type == VR_RANGE)
    878      1.1  mrg 	{
    879      1.1  mrg 	  /* The intersection is empty.  */
    880      1.1  mrg 	  *vr0type = VR_UNDEFINED;
    881      1.1  mrg 	  *vr0min = NULL_TREE;
    882      1.1  mrg 	  *vr0max = NULL_TREE;
    883      1.1  mrg 	}
    884      1.1  mrg       else
    885      1.1  mrg 	gcc_unreachable ();
    886      1.1  mrg     }
    887      1.1  mrg   else if ((maxeq || operand_less_p (*vr0max, vr1max) == 1)
    888      1.1  mrg 	   && (mineq || operand_less_p (vr1min, *vr0min) == 1))
    889      1.1  mrg     {
    890      1.1  mrg       /* ( [  ] ) or ([  ] ) or ( [  ]) */
    891      1.1  mrg       if (*vr0type == VR_RANGE
    892      1.1  mrg 	  && vr1type == VR_RANGE)
    893      1.1  mrg 	/* Choose the inner range.  */
    894      1.1  mrg 	;
    895      1.1  mrg       else if (*vr0type == VR_ANTI_RANGE
    896      1.1  mrg 	       && vr1type == VR_RANGE)
    897      1.1  mrg 	{
    898      1.1  mrg 	  /* Choose the right gap if the left is empty.  */
    899      1.1  mrg 	  if (mineq)
    900      1.1  mrg 	    {
    901      1.1  mrg 	      *vr0type = VR_RANGE;
    902      1.1  mrg 	      if (TREE_CODE (*vr0max) != INTEGER_CST)
    903      1.1  mrg 		*vr0min = *vr0max;
    904      1.1  mrg 	      else if (TYPE_PRECISION (TREE_TYPE (*vr0max)) == 1
    905      1.1  mrg 		       && !TYPE_UNSIGNED (TREE_TYPE (*vr0max)))
    906      1.1  mrg 		*vr0min
    907      1.1  mrg 		  = int_const_binop (MINUS_EXPR, *vr0max,
    908      1.1  mrg 				     build_int_cst (TREE_TYPE (*vr0max), -1));
    909      1.1  mrg 	      else
    910      1.1  mrg 		*vr0min
    911      1.1  mrg 		  = int_const_binop (PLUS_EXPR, *vr0max,
    912      1.1  mrg 				     build_int_cst (TREE_TYPE (*vr0max), 1));
    913      1.1  mrg 	      *vr0max = vr1max;
    914      1.1  mrg 	    }
    915      1.1  mrg 	  /* Choose the left gap if the right is empty.  */
    916      1.1  mrg 	  else if (maxeq)
    917      1.1  mrg 	    {
    918      1.1  mrg 	      *vr0type = VR_RANGE;
    919      1.1  mrg 	      if (TREE_CODE (*vr0min) != INTEGER_CST)
    920      1.1  mrg 		*vr0max = *vr0min;
    921      1.1  mrg 	      else if (TYPE_PRECISION (TREE_TYPE (*vr0min)) == 1
    922      1.1  mrg 		       && !TYPE_UNSIGNED (TREE_TYPE (*vr0min)))
    923      1.1  mrg 		*vr0max
    924      1.1  mrg 		  = int_const_binop (PLUS_EXPR, *vr0min,
    925      1.1  mrg 				     build_int_cst (TREE_TYPE (*vr0min), -1));
    926      1.1  mrg 	      else
    927      1.1  mrg 		*vr0max
    928      1.1  mrg 		  = int_const_binop (MINUS_EXPR, *vr0min,
    929      1.1  mrg 				     build_int_cst (TREE_TYPE (*vr0min), 1));
    930      1.1  mrg 	      *vr0min = vr1min;
    931      1.1  mrg 	    }
    932      1.1  mrg 	  /* Choose the anti-range if the range is effectively varying.  */
    933      1.1  mrg 	  else if (vrp_val_is_min (vr1min)
    934      1.1  mrg 		   && vrp_val_is_max (vr1max))
    935      1.1  mrg 	    ;
    936      1.1  mrg 	  /* Choose the anti-range if it is ~[0,0], that range is special
    937      1.1  mrg 	     enough to special case when vr1's range is relatively wide.
    938      1.1  mrg 	     At least for types bigger than int - this covers pointers
    939      1.1  mrg 	     and arguments to functions like ctz.  */
    940      1.1  mrg 	  else if (*vr0min == *vr0max
    941      1.1  mrg 		   && integer_zerop (*vr0min)
    942      1.1  mrg 		   && ((TYPE_PRECISION (TREE_TYPE (*vr0min))
    943      1.1  mrg 			>= TYPE_PRECISION (integer_type_node))
    944      1.1  mrg 		       || POINTER_TYPE_P (TREE_TYPE (*vr0min)))
    945      1.1  mrg 		   && TREE_CODE (vr1max) == INTEGER_CST
    946      1.1  mrg 		   && TREE_CODE (vr1min) == INTEGER_CST
    947      1.1  mrg 		   && (wi::clz (wi::to_wide (vr1max) - wi::to_wide (vr1min))
    948      1.1  mrg 		       < TYPE_PRECISION (TREE_TYPE (*vr0min)) / 2))
    949      1.1  mrg 	    ;
    950      1.1  mrg 	  /* Else choose the range.  */
    951      1.1  mrg 	  else
    952      1.1  mrg 	    {
    953      1.1  mrg 	      *vr0type = vr1type;
    954      1.1  mrg 	      *vr0min = vr1min;
    955      1.1  mrg 	      *vr0max = vr1max;
    956      1.1  mrg 	    }
    957      1.1  mrg 	}
    958      1.1  mrg       else if (*vr0type == VR_ANTI_RANGE
    959      1.1  mrg 	       && vr1type == VR_ANTI_RANGE)
    960      1.1  mrg 	{
    961      1.1  mrg 	  /* If both are anti-ranges the result is the outer one.  */
    962      1.1  mrg 	  *vr0type = vr1type;
    963      1.1  mrg 	  *vr0min = vr1min;
    964      1.1  mrg 	  *vr0max = vr1max;
    965      1.1  mrg 	}
    966      1.1  mrg       else if (vr1type == VR_ANTI_RANGE
    967      1.1  mrg 	       && *vr0type == VR_RANGE)
    968      1.1  mrg 	{
    969      1.1  mrg 	  /* The intersection is empty.  */
    970      1.1  mrg 	  *vr0type = VR_UNDEFINED;
    971      1.1  mrg 	  *vr0min = NULL_TREE;
    972      1.1  mrg 	  *vr0max = NULL_TREE;
    973      1.1  mrg 	}
    974      1.1  mrg       else
    975      1.1  mrg 	gcc_unreachable ();
    976      1.1  mrg     }
    977      1.1  mrg   else if ((operand_less_p (vr1min, *vr0max) == 1
    978      1.1  mrg 	    || operand_equal_p (vr1min, *vr0max, 0))
    979      1.1  mrg 	   && operand_less_p (*vr0min, vr1min) == 1
    980      1.1  mrg 	   && operand_less_p (*vr0max, vr1max) == 1)
    981      1.1  mrg     {
    982      1.1  mrg       /* [  (  ]  ) or [  ](  ) */
    983      1.1  mrg       if (*vr0type == VR_ANTI_RANGE
    984      1.1  mrg 	  && vr1type == VR_ANTI_RANGE)
    985      1.1  mrg 	*vr0max = vr1max;
    986      1.1  mrg       else if (*vr0type == VR_RANGE
    987      1.1  mrg 	       && vr1type == VR_RANGE)
    988      1.1  mrg 	*vr0min = vr1min;
    989      1.1  mrg       else if (*vr0type == VR_RANGE
    990      1.1  mrg 	       && vr1type == VR_ANTI_RANGE)
    991      1.1  mrg 	{
    992      1.1  mrg 	  if (TREE_CODE (vr1min) == INTEGER_CST)
    993      1.1  mrg 	    *vr0max = int_const_binop (MINUS_EXPR, vr1min,
    994      1.1  mrg 				       build_int_cst (TREE_TYPE (vr1min), 1));
    995      1.1  mrg 	  else
    996      1.1  mrg 	    *vr0max = vr1min;
    997      1.1  mrg 	}
    998      1.1  mrg       else if (*vr0type == VR_ANTI_RANGE
    999      1.1  mrg 	       && vr1type == VR_RANGE)
   1000      1.1  mrg 	{
   1001      1.1  mrg 	  *vr0type = VR_RANGE;
   1002      1.1  mrg 	  if (TREE_CODE (*vr0max) == INTEGER_CST)
   1003      1.1  mrg 	    *vr0min = int_const_binop (PLUS_EXPR, *vr0max,
   1004      1.1  mrg 				       build_int_cst (TREE_TYPE (*vr0max), 1));
   1005      1.1  mrg 	  else
   1006      1.1  mrg 	    *vr0min = *vr0max;
   1007      1.1  mrg 	  *vr0max = vr1max;
   1008      1.1  mrg 	}
   1009      1.1  mrg       else
   1010      1.1  mrg 	gcc_unreachable ();
   1011      1.1  mrg     }
   1012      1.1  mrg   else if ((operand_less_p (*vr0min, vr1max) == 1
   1013      1.1  mrg 	    || operand_equal_p (*vr0min, vr1max, 0))
   1014      1.1  mrg 	   && operand_less_p (vr1min, *vr0min) == 1
   1015      1.1  mrg 	   && operand_less_p (vr1max, *vr0max) == 1)
   1016      1.1  mrg     {
   1017      1.1  mrg       /* (  [  )  ] or (  )[  ] */
   1018      1.1  mrg       if (*vr0type == VR_ANTI_RANGE
   1019      1.1  mrg 	  && vr1type == VR_ANTI_RANGE)
   1020      1.1  mrg 	*vr0min = vr1min;
   1021      1.1  mrg       else if (*vr0type == VR_RANGE
   1022      1.1  mrg 	       && vr1type == VR_RANGE)
   1023      1.1  mrg 	*vr0max = vr1max;
   1024      1.1  mrg       else if (*vr0type == VR_RANGE
   1025      1.1  mrg 	       && vr1type == VR_ANTI_RANGE)
   1026      1.1  mrg 	{
   1027      1.1  mrg 	  if (TREE_CODE (vr1max) == INTEGER_CST)
   1028      1.1  mrg 	    *vr0min = int_const_binop (PLUS_EXPR, vr1max,
   1029      1.1  mrg 				       build_int_cst (TREE_TYPE (vr1max), 1));
   1030      1.1  mrg 	  else
   1031      1.1  mrg 	    *vr0min = vr1max;
   1032      1.1  mrg 	}
   1033      1.1  mrg       else if (*vr0type == VR_ANTI_RANGE
   1034      1.1  mrg 	       && vr1type == VR_RANGE)
   1035      1.1  mrg 	{
   1036      1.1  mrg 	  *vr0type = VR_RANGE;
   1037      1.1  mrg 	  if (TREE_CODE (*vr0min) == INTEGER_CST)
   1038      1.1  mrg 	    *vr0max = int_const_binop (MINUS_EXPR, *vr0min,
   1039      1.1  mrg 				       build_int_cst (TREE_TYPE (*vr0min), 1));
   1040      1.1  mrg 	  else
   1041      1.1  mrg 	    *vr0max = *vr0min;
   1042      1.1  mrg 	  *vr0min = vr1min;
   1043      1.1  mrg 	}
   1044      1.1  mrg       else
   1045      1.1  mrg 	gcc_unreachable ();
   1046      1.1  mrg     }
   1047      1.1  mrg 
   1048      1.1  mrg   /* If we know the intersection is empty, there's no need to
   1049      1.1  mrg      conservatively add anything else to the set.  */
   1050      1.1  mrg   if (*vr0type == VR_UNDEFINED)
   1051      1.1  mrg     return;
   1052      1.1  mrg 
   1053      1.1  mrg   /* As a fallback simply use { *VRTYPE, *VR0MIN, *VR0MAX } as
   1054      1.1  mrg      result for the intersection.  That's always a conservative
   1055      1.1  mrg      correct estimate unless VR1 is a constant singleton range
   1056      1.1  mrg      in which case we choose that.  */
   1057      1.1  mrg   if (vr1type == VR_RANGE
   1058      1.1  mrg       && is_gimple_min_invariant (vr1min)
   1059      1.1  mrg       && vrp_operand_equal_p (vr1min, vr1max))
   1060      1.1  mrg     {
   1061      1.1  mrg       *vr0type = vr1type;
   1062      1.1  mrg       *vr0min = vr1min;
   1063      1.1  mrg       *vr0max = vr1max;
   1064      1.1  mrg     }
   1065      1.1  mrg }
   1066      1.1  mrg 
   1067      1.1  mrg /* Helper for the intersection operation for value ranges.  Given two
   1068  1.1.1.2  mrg    ranges VR0 and VR1, set VR0 to the intersection of both ranges.
   1069  1.1.1.2  mrg    This may not be the smallest possible such range.  */
   1070      1.1  mrg 
   1071  1.1.1.2  mrg void
   1072  1.1.1.2  mrg irange::legacy_intersect (irange *vr0, const irange *vr1)
   1073      1.1  mrg {
   1074  1.1.1.2  mrg   gcc_checking_assert (vr0->legacy_mode_p ());
   1075  1.1.1.2  mrg   gcc_checking_assert (vr1->legacy_mode_p ());
   1076      1.1  mrg   /* If either range is VR_VARYING the other one wins.  */
   1077      1.1  mrg   if (vr1->varying_p ())
   1078  1.1.1.2  mrg     return;
   1079      1.1  mrg   if (vr0->varying_p ())
   1080  1.1.1.2  mrg     {
   1081  1.1.1.2  mrg       vr0->set (vr1->min (), vr1->max (), vr1->kind ());
   1082  1.1.1.2  mrg       return;
   1083  1.1.1.2  mrg     }
   1084      1.1  mrg 
   1085      1.1  mrg   /* When either range is VR_UNDEFINED the resulting range is
   1086      1.1  mrg      VR_UNDEFINED, too.  */
   1087      1.1  mrg   if (vr0->undefined_p ())
   1088  1.1.1.2  mrg     return;
   1089      1.1  mrg   if (vr1->undefined_p ())
   1090  1.1.1.2  mrg     {
   1091  1.1.1.2  mrg       vr0->set_undefined ();
   1092  1.1.1.2  mrg       return;
   1093  1.1.1.2  mrg     }
   1094      1.1  mrg 
   1095      1.1  mrg   value_range_kind vr0kind = vr0->kind ();
   1096      1.1  mrg   tree vr0min = vr0->min ();
   1097      1.1  mrg   tree vr0max = vr0->max ();
   1098  1.1.1.2  mrg 
   1099      1.1  mrg   intersect_ranges (&vr0kind, &vr0min, &vr0max,
   1100      1.1  mrg 		    vr1->kind (), vr1->min (), vr1->max ());
   1101  1.1.1.2  mrg 
   1102      1.1  mrg   /* Make sure to canonicalize the result though as the inversion of a
   1103  1.1.1.2  mrg      VR_RANGE can still be a VR_RANGE.  */
   1104      1.1  mrg   if (vr0kind == VR_UNDEFINED)
   1105  1.1.1.2  mrg     vr0->set_undefined ();
   1106      1.1  mrg   else if (vr0kind == VR_VARYING)
   1107  1.1.1.2  mrg     {
   1108  1.1.1.2  mrg       /* If we failed, use the original VR0.  */
   1109  1.1.1.2  mrg       return;
   1110  1.1.1.2  mrg     }
   1111      1.1  mrg   else
   1112  1.1.1.2  mrg     vr0->set (vr0min, vr0max, vr0kind);
   1113      1.1  mrg }
   1114      1.1  mrg 
   1115      1.1  mrg /* Union the two value-ranges { *VR0TYPE, *VR0MIN, *VR0MAX } and
   1116      1.1  mrg    { VR1TYPE, VR0MIN, VR0MAX } and store the result
   1117      1.1  mrg    in { *VR0TYPE, *VR0MIN, *VR0MAX }.  This may not be the smallest
   1118      1.1  mrg    possible such range.  The resulting range is not canonicalized.  */
   1119      1.1  mrg 
   1120      1.1  mrg static void
   1121      1.1  mrg union_ranges (enum value_range_kind *vr0type,
   1122      1.1  mrg 	      tree *vr0min, tree *vr0max,
   1123      1.1  mrg 	      enum value_range_kind vr1type,
   1124      1.1  mrg 	      tree vr1min, tree vr1max)
   1125      1.1  mrg {
   1126      1.1  mrg   int cmpmin = compare_values (*vr0min, vr1min);
   1127      1.1  mrg   int cmpmax = compare_values (*vr0max, vr1max);
   1128      1.1  mrg   bool mineq = cmpmin == 0;
   1129      1.1  mrg   bool maxeq = cmpmax == 0;
   1130      1.1  mrg 
   1131      1.1  mrg   /* [] is vr0, () is vr1 in the following classification comments.  */
   1132      1.1  mrg   if (mineq && maxeq)
   1133      1.1  mrg     {
   1134      1.1  mrg       /* [(  )] */
   1135      1.1  mrg       if (*vr0type == vr1type)
   1136      1.1  mrg 	/* Nothing to do for equal ranges.  */
   1137      1.1  mrg 	;
   1138      1.1  mrg       else if ((*vr0type == VR_RANGE
   1139      1.1  mrg 		&& vr1type == VR_ANTI_RANGE)
   1140      1.1  mrg 	       || (*vr0type == VR_ANTI_RANGE
   1141      1.1  mrg 		   && vr1type == VR_RANGE))
   1142      1.1  mrg 	{
   1143      1.1  mrg 	  /* For anti-range with range union the result is varying.  */
   1144      1.1  mrg 	  goto give_up;
   1145      1.1  mrg 	}
   1146      1.1  mrg       else
   1147      1.1  mrg 	gcc_unreachable ();
   1148      1.1  mrg     }
   1149      1.1  mrg   else if (operand_less_p (*vr0max, vr1min) == 1
   1150      1.1  mrg 	   || operand_less_p (vr1max, *vr0min) == 1)
   1151      1.1  mrg     {
   1152      1.1  mrg       /* [ ] ( ) or ( ) [ ]
   1153      1.1  mrg 	 If the ranges have an empty intersection, result of the union
   1154      1.1  mrg 	 operation is the anti-range or if both are anti-ranges
   1155      1.1  mrg 	 it covers all.  */
   1156      1.1  mrg       if (*vr0type == VR_ANTI_RANGE
   1157      1.1  mrg 	  && vr1type == VR_ANTI_RANGE)
   1158      1.1  mrg 	goto give_up;
   1159      1.1  mrg       else if (*vr0type == VR_ANTI_RANGE
   1160      1.1  mrg 	       && vr1type == VR_RANGE)
   1161      1.1  mrg 	;
   1162      1.1  mrg       else if (*vr0type == VR_RANGE
   1163      1.1  mrg 	       && vr1type == VR_ANTI_RANGE)
   1164      1.1  mrg 	{
   1165      1.1  mrg 	  *vr0type = vr1type;
   1166      1.1  mrg 	  *vr0min = vr1min;
   1167      1.1  mrg 	  *vr0max = vr1max;
   1168      1.1  mrg 	}
   1169      1.1  mrg       else if (*vr0type == VR_RANGE
   1170      1.1  mrg 	       && vr1type == VR_RANGE)
   1171      1.1  mrg 	{
   1172      1.1  mrg 	  /* The result is the convex hull of both ranges.  */
   1173      1.1  mrg 	  if (operand_less_p (*vr0max, vr1min) == 1)
   1174      1.1  mrg 	    {
   1175      1.1  mrg 	      /* If the result can be an anti-range, create one.  */
   1176      1.1  mrg 	      if (TREE_CODE (*vr0max) == INTEGER_CST
   1177      1.1  mrg 		  && TREE_CODE (vr1min) == INTEGER_CST
   1178      1.1  mrg 		  && vrp_val_is_min (*vr0min)
   1179      1.1  mrg 		  && vrp_val_is_max (vr1max))
   1180      1.1  mrg 		{
   1181      1.1  mrg 		  tree min = int_const_binop (PLUS_EXPR,
   1182      1.1  mrg 					      *vr0max,
   1183      1.1  mrg 					      build_int_cst (TREE_TYPE (*vr0max), 1));
   1184      1.1  mrg 		  tree max = int_const_binop (MINUS_EXPR,
   1185      1.1  mrg 					      vr1min,
   1186      1.1  mrg 					      build_int_cst (TREE_TYPE (vr1min), 1));
   1187      1.1  mrg 		  if (!operand_less_p (max, min))
   1188      1.1  mrg 		    {
   1189      1.1  mrg 		      *vr0type = VR_ANTI_RANGE;
   1190      1.1  mrg 		      *vr0min = min;
   1191      1.1  mrg 		      *vr0max = max;
   1192      1.1  mrg 		    }
   1193      1.1  mrg 		  else
   1194      1.1  mrg 		    *vr0max = vr1max;
   1195      1.1  mrg 		}
   1196      1.1  mrg 	      else
   1197      1.1  mrg 		*vr0max = vr1max;
   1198      1.1  mrg 	    }
   1199      1.1  mrg 	  else
   1200      1.1  mrg 	    {
   1201      1.1  mrg 	      /* If the result can be an anti-range, create one.  */
   1202      1.1  mrg 	      if (TREE_CODE (vr1max) == INTEGER_CST
   1203      1.1  mrg 		  && TREE_CODE (*vr0min) == INTEGER_CST
   1204      1.1  mrg 		  && vrp_val_is_min (vr1min)
   1205      1.1  mrg 		  && vrp_val_is_max (*vr0max))
   1206      1.1  mrg 		{
   1207      1.1  mrg 		  tree min = int_const_binop (PLUS_EXPR,
   1208      1.1  mrg 					      vr1max,
   1209      1.1  mrg 					      build_int_cst (TREE_TYPE (vr1max), 1));
   1210      1.1  mrg 		  tree max = int_const_binop (MINUS_EXPR,
   1211      1.1  mrg 					      *vr0min,
   1212      1.1  mrg 					      build_int_cst (TREE_TYPE (*vr0min), 1));
   1213      1.1  mrg 		  if (!operand_less_p (max, min))
   1214      1.1  mrg 		    {
   1215      1.1  mrg 		      *vr0type = VR_ANTI_RANGE;
   1216      1.1  mrg 		      *vr0min = min;
   1217      1.1  mrg 		      *vr0max = max;
   1218      1.1  mrg 		    }
   1219      1.1  mrg 		  else
   1220      1.1  mrg 		    *vr0min = vr1min;
   1221      1.1  mrg 		}
   1222      1.1  mrg 	      else
   1223      1.1  mrg 		*vr0min = vr1min;
   1224      1.1  mrg 	    }
   1225      1.1  mrg 	}
   1226      1.1  mrg       else
   1227      1.1  mrg 	gcc_unreachable ();
   1228      1.1  mrg     }
   1229      1.1  mrg   else if ((maxeq || cmpmax == 1)
   1230      1.1  mrg 	   && (mineq || cmpmin == -1))
   1231      1.1  mrg     {
   1232      1.1  mrg       /* [ (  ) ] or [(  ) ] or [ (  )] */
   1233      1.1  mrg       if (*vr0type == VR_RANGE
   1234      1.1  mrg 	  && vr1type == VR_RANGE)
   1235      1.1  mrg 	;
   1236      1.1  mrg       else if (*vr0type == VR_ANTI_RANGE
   1237      1.1  mrg 	       && vr1type == VR_ANTI_RANGE)
   1238      1.1  mrg 	{
   1239      1.1  mrg 	  *vr0type = vr1type;
   1240      1.1  mrg 	  *vr0min = vr1min;
   1241      1.1  mrg 	  *vr0max = vr1max;
   1242      1.1  mrg 	}
   1243      1.1  mrg       else if (*vr0type == VR_ANTI_RANGE
   1244      1.1  mrg 	       && vr1type == VR_RANGE)
   1245      1.1  mrg 	{
   1246      1.1  mrg 	  /* Arbitrarily choose the right or left gap.  */
   1247      1.1  mrg 	  if (!mineq && TREE_CODE (vr1min) == INTEGER_CST)
   1248      1.1  mrg 	    *vr0max = int_const_binop (MINUS_EXPR, vr1min,
   1249      1.1  mrg 				       build_int_cst (TREE_TYPE (vr1min), 1));
   1250      1.1  mrg 	  else if (!maxeq && TREE_CODE (vr1max) == INTEGER_CST)
   1251      1.1  mrg 	    *vr0min = int_const_binop (PLUS_EXPR, vr1max,
   1252      1.1  mrg 				       build_int_cst (TREE_TYPE (vr1max), 1));
   1253      1.1  mrg 	  else
   1254      1.1  mrg 	    goto give_up;
   1255      1.1  mrg 	}
   1256      1.1  mrg       else if (*vr0type == VR_RANGE
   1257      1.1  mrg 	       && vr1type == VR_ANTI_RANGE)
   1258      1.1  mrg 	/* The result covers everything.  */
   1259      1.1  mrg 	goto give_up;
   1260      1.1  mrg       else
   1261      1.1  mrg 	gcc_unreachable ();
   1262      1.1  mrg     }
   1263      1.1  mrg   else if ((maxeq || cmpmax == -1)
   1264      1.1  mrg 	   && (mineq || cmpmin == 1))
   1265      1.1  mrg     {
   1266      1.1  mrg       /* ( [  ] ) or ([  ] ) or ( [  ]) */
   1267      1.1  mrg       if (*vr0type == VR_RANGE
   1268      1.1  mrg 	  && vr1type == VR_RANGE)
   1269      1.1  mrg 	{
   1270      1.1  mrg 	  *vr0type = vr1type;
   1271      1.1  mrg 	  *vr0min = vr1min;
   1272      1.1  mrg 	  *vr0max = vr1max;
   1273      1.1  mrg 	}
   1274      1.1  mrg       else if (*vr0type == VR_ANTI_RANGE
   1275      1.1  mrg 	       && vr1type == VR_ANTI_RANGE)
   1276      1.1  mrg 	;
   1277      1.1  mrg       else if (*vr0type == VR_RANGE
   1278      1.1  mrg 	       && vr1type == VR_ANTI_RANGE)
   1279      1.1  mrg 	{
   1280      1.1  mrg 	  *vr0type = VR_ANTI_RANGE;
   1281      1.1  mrg 	  if (!mineq && TREE_CODE (*vr0min) == INTEGER_CST)
   1282      1.1  mrg 	    {
   1283      1.1  mrg 	      *vr0max = int_const_binop (MINUS_EXPR, *vr0min,
   1284      1.1  mrg 					 build_int_cst (TREE_TYPE (*vr0min), 1));
   1285      1.1  mrg 	      *vr0min = vr1min;
   1286      1.1  mrg 	    }
   1287      1.1  mrg 	  else if (!maxeq && TREE_CODE (*vr0max) == INTEGER_CST)
   1288      1.1  mrg 	    {
   1289      1.1  mrg 	      *vr0min = int_const_binop (PLUS_EXPR, *vr0max,
   1290      1.1  mrg 					 build_int_cst (TREE_TYPE (*vr0max), 1));
   1291      1.1  mrg 	      *vr0max = vr1max;
   1292      1.1  mrg 	    }
   1293      1.1  mrg 	  else
   1294      1.1  mrg 	    goto give_up;
   1295      1.1  mrg 	}
   1296      1.1  mrg       else if (*vr0type == VR_ANTI_RANGE
   1297      1.1  mrg 	       && vr1type == VR_RANGE)
   1298      1.1  mrg 	/* The result covers everything.  */
   1299      1.1  mrg 	goto give_up;
   1300      1.1  mrg       else
   1301      1.1  mrg 	gcc_unreachable ();
   1302      1.1  mrg     }
   1303      1.1  mrg   else if (cmpmin == -1
   1304      1.1  mrg 	   && cmpmax == -1
   1305      1.1  mrg 	   && (operand_less_p (vr1min, *vr0max) == 1
   1306      1.1  mrg 	       || operand_equal_p (vr1min, *vr0max, 0)))
   1307      1.1  mrg     {
   1308      1.1  mrg       /* [  (  ]  ) or [   ](   ) */
   1309      1.1  mrg       if (*vr0type == VR_RANGE
   1310      1.1  mrg 	  && vr1type == VR_RANGE)
   1311      1.1  mrg 	*vr0max = vr1max;
   1312      1.1  mrg       else if (*vr0type == VR_ANTI_RANGE
   1313      1.1  mrg 	       && vr1type == VR_ANTI_RANGE)
   1314      1.1  mrg 	*vr0min = vr1min;
   1315      1.1  mrg       else if (*vr0type == VR_ANTI_RANGE
   1316      1.1  mrg 	       && vr1type == VR_RANGE)
   1317      1.1  mrg 	{
   1318      1.1  mrg 	  if (TREE_CODE (vr1min) == INTEGER_CST)
   1319      1.1  mrg 	    *vr0max = int_const_binop (MINUS_EXPR, vr1min,
   1320      1.1  mrg 				       build_int_cst (TREE_TYPE (vr1min), 1));
   1321      1.1  mrg 	  else
   1322      1.1  mrg 	    goto give_up;
   1323      1.1  mrg 	}
   1324      1.1  mrg       else if (*vr0type == VR_RANGE
   1325      1.1  mrg 	       && vr1type == VR_ANTI_RANGE)
   1326      1.1  mrg 	{
   1327      1.1  mrg 	  if (TREE_CODE (*vr0max) == INTEGER_CST)
   1328      1.1  mrg 	    {
   1329      1.1  mrg 	      *vr0type = vr1type;
   1330      1.1  mrg 	      *vr0min = int_const_binop (PLUS_EXPR, *vr0max,
   1331      1.1  mrg 					 build_int_cst (TREE_TYPE (*vr0max), 1));
   1332      1.1  mrg 	      *vr0max = vr1max;
   1333      1.1  mrg 	    }
   1334      1.1  mrg 	  else
   1335      1.1  mrg 	    goto give_up;
   1336      1.1  mrg 	}
   1337      1.1  mrg       else
   1338      1.1  mrg 	gcc_unreachable ();
   1339      1.1  mrg     }
   1340      1.1  mrg   else if (cmpmin == 1
   1341      1.1  mrg 	   && cmpmax == 1
   1342      1.1  mrg 	   && (operand_less_p (*vr0min, vr1max) == 1
   1343      1.1  mrg 	       || operand_equal_p (*vr0min, vr1max, 0)))
   1344      1.1  mrg     {
   1345      1.1  mrg       /* (  [  )  ] or (   )[   ] */
   1346      1.1  mrg       if (*vr0type == VR_RANGE
   1347      1.1  mrg 	  && vr1type == VR_RANGE)
   1348      1.1  mrg 	*vr0min = vr1min;
   1349      1.1  mrg       else if (*vr0type == VR_ANTI_RANGE
   1350      1.1  mrg 	       && vr1type == VR_ANTI_RANGE)
   1351      1.1  mrg 	*vr0max = vr1max;
   1352      1.1  mrg       else if (*vr0type == VR_ANTI_RANGE
   1353      1.1  mrg 	       && vr1type == VR_RANGE)
   1354      1.1  mrg 	{
   1355      1.1  mrg 	  if (TREE_CODE (vr1max) == INTEGER_CST)
   1356      1.1  mrg 	    *vr0min = int_const_binop (PLUS_EXPR, vr1max,
   1357      1.1  mrg 				       build_int_cst (TREE_TYPE (vr1max), 1));
   1358      1.1  mrg 	  else
   1359      1.1  mrg 	    goto give_up;
   1360      1.1  mrg 	}
   1361      1.1  mrg       else if (*vr0type == VR_RANGE
   1362      1.1  mrg 	       && vr1type == VR_ANTI_RANGE)
   1363      1.1  mrg 	{
   1364      1.1  mrg 	  if (TREE_CODE (*vr0min) == INTEGER_CST)
   1365      1.1  mrg 	    {
   1366      1.1  mrg 	      *vr0type = vr1type;
   1367      1.1  mrg 	      *vr0max = int_const_binop (MINUS_EXPR, *vr0min,
   1368      1.1  mrg 					 build_int_cst (TREE_TYPE (*vr0min), 1));
   1369      1.1  mrg 	      *vr0min = vr1min;
   1370      1.1  mrg 	    }
   1371      1.1  mrg 	  else
   1372      1.1  mrg 	    goto give_up;
   1373      1.1  mrg 	}
   1374      1.1  mrg       else
   1375      1.1  mrg 	gcc_unreachable ();
   1376      1.1  mrg     }
   1377      1.1  mrg   else
   1378      1.1  mrg     goto give_up;
   1379      1.1  mrg 
   1380      1.1  mrg   return;
   1381      1.1  mrg 
   1382      1.1  mrg give_up:
   1383      1.1  mrg   *vr0type = VR_VARYING;
   1384      1.1  mrg   *vr0min = NULL_TREE;
   1385      1.1  mrg   *vr0max = NULL_TREE;
   1386      1.1  mrg }
   1387      1.1  mrg 
   1388  1.1.1.2  mrg /* Helper for meet operation for value ranges.  Given two ranges VR0
   1389  1.1.1.2  mrg    and VR1, set VR0 to the union of both ranges.  This may not be the
   1390      1.1  mrg    smallest possible such range.  */
   1391      1.1  mrg 
   1392  1.1.1.2  mrg void
   1393  1.1.1.2  mrg irange::legacy_union (irange *vr0, const irange *vr1)
   1394      1.1  mrg {
   1395  1.1.1.2  mrg   gcc_checking_assert (vr0->legacy_mode_p ());
   1396  1.1.1.2  mrg   gcc_checking_assert (vr1->legacy_mode_p ());
   1397  1.1.1.2  mrg 
   1398      1.1  mrg   /* VR0 has the resulting range if VR1 is undefined or VR0 is varying.  */
   1399      1.1  mrg   if (vr1->undefined_p ()
   1400      1.1  mrg       || vr0->varying_p ())
   1401  1.1.1.2  mrg     return;
   1402      1.1  mrg 
   1403      1.1  mrg   /* VR1 has the resulting range if VR0 is undefined or VR1 is varying.  */
   1404  1.1.1.2  mrg   if (vr0->undefined_p ())
   1405  1.1.1.2  mrg     {
   1406  1.1.1.2  mrg       vr0->set (vr1->min (), vr1->max (), vr1->kind ());
   1407  1.1.1.2  mrg       return;
   1408  1.1.1.2  mrg     }
   1409  1.1.1.2  mrg 
   1410  1.1.1.2  mrg   if (vr1->varying_p ())
   1411  1.1.1.2  mrg     {
   1412  1.1.1.2  mrg       vr0->set_varying (vr1->type ());
   1413  1.1.1.2  mrg       return;
   1414  1.1.1.2  mrg     }
   1415      1.1  mrg 
   1416      1.1  mrg   value_range_kind vr0kind = vr0->kind ();
   1417      1.1  mrg   tree vr0min = vr0->min ();
   1418      1.1  mrg   tree vr0max = vr0->max ();
   1419  1.1.1.2  mrg 
   1420      1.1  mrg   union_ranges (&vr0kind, &vr0min, &vr0max,
   1421      1.1  mrg 		vr1->kind (), vr1->min (), vr1->max ());
   1422      1.1  mrg 
   1423      1.1  mrg   if (vr0kind == VR_UNDEFINED)
   1424  1.1.1.2  mrg     vr0->set_undefined ();
   1425      1.1  mrg   else if (vr0kind == VR_VARYING)
   1426      1.1  mrg     {
   1427  1.1.1.2  mrg       /* Failed to find an efficient meet.  Before giving up and
   1428  1.1.1.2  mrg 	 setting the result to VARYING, see if we can at least derive
   1429  1.1.1.2  mrg 	 a non-zero range.  */
   1430  1.1.1.2  mrg       if (range_includes_zero_p (vr0) == 0
   1431  1.1.1.2  mrg 	  && range_includes_zero_p (vr1) == 0)
   1432  1.1.1.2  mrg 	vr0->set_nonzero (vr0->type ());
   1433  1.1.1.2  mrg       else
   1434  1.1.1.2  mrg 	vr0->set_varying (vr0->type ());
   1435      1.1  mrg     }
   1436  1.1.1.2  mrg   else
   1437  1.1.1.2  mrg     vr0->set (vr0min, vr0max, vr0kind);
   1438      1.1  mrg }
   1439      1.1  mrg 
   1440      1.1  mrg /* Meet operation for value ranges.  Given two value ranges VR0 and
   1441      1.1  mrg    VR1, store in VR0 a range that contains both VR0 and VR1.  This
   1442      1.1  mrg    may not be the smallest possible such range.  */
   1443      1.1  mrg 
   1444      1.1  mrg void
   1445  1.1.1.2  mrg irange::union_ (const irange *other)
   1446      1.1  mrg {
   1447  1.1.1.2  mrg   if (legacy_mode_p ())
   1448      1.1  mrg     {
   1449  1.1.1.2  mrg       if (!other->legacy_mode_p ())
   1450  1.1.1.2  mrg 	{
   1451  1.1.1.2  mrg 	  int_range<1> tmp = *other;
   1452  1.1.1.2  mrg 	  legacy_union (this, &tmp);
   1453  1.1.1.2  mrg 	  return;
   1454  1.1.1.2  mrg 	}
   1455  1.1.1.2  mrg       if (dump_file && (dump_flags & TDF_DETAILS))
   1456  1.1.1.2  mrg 	{
   1457  1.1.1.2  mrg 	  fprintf (dump_file, "Meeting\n  ");
   1458  1.1.1.2  mrg 	  dump_value_range (dump_file, this);
   1459  1.1.1.2  mrg 	  fprintf (dump_file, "\nand\n  ");
   1460  1.1.1.2  mrg 	  dump_value_range (dump_file, other);
   1461  1.1.1.2  mrg 	  fprintf (dump_file, "\n");
   1462  1.1.1.2  mrg 	}
   1463      1.1  mrg 
   1464  1.1.1.2  mrg       legacy_union (this, other);
   1465      1.1  mrg 
   1466  1.1.1.2  mrg       if (dump_file && (dump_flags & TDF_DETAILS))
   1467  1.1.1.2  mrg 	{
   1468  1.1.1.2  mrg 	  fprintf (dump_file, "to\n  ");
   1469  1.1.1.2  mrg 	  dump_value_range (dump_file, this);
   1470  1.1.1.2  mrg 	  fprintf (dump_file, "\n");
   1471  1.1.1.2  mrg 	}
   1472  1.1.1.2  mrg       return;
   1473  1.1.1.2  mrg     }
   1474  1.1.1.2  mrg 
   1475  1.1.1.2  mrg   if (other->legacy_mode_p ())
   1476      1.1  mrg     {
   1477  1.1.1.2  mrg       int_range<2> wider = *other;
   1478  1.1.1.2  mrg       irange_union (wider);
   1479      1.1  mrg     }
   1480  1.1.1.2  mrg   else
   1481  1.1.1.2  mrg     irange_union (*other);
   1482      1.1  mrg }
   1483      1.1  mrg 
   1484      1.1  mrg void
   1485  1.1.1.2  mrg irange::intersect (const irange *other)
   1486      1.1  mrg {
   1487  1.1.1.2  mrg   if (legacy_mode_p ())
   1488  1.1.1.2  mrg     {
   1489  1.1.1.2  mrg       if (!other->legacy_mode_p ())
   1490  1.1.1.2  mrg 	{
   1491  1.1.1.2  mrg 	  int_range<1> tmp = *other;
   1492  1.1.1.2  mrg 	  legacy_intersect (this, &tmp);
   1493  1.1.1.2  mrg 	  return;
   1494  1.1.1.2  mrg 	}
   1495  1.1.1.2  mrg       if (dump_file && (dump_flags & TDF_DETAILS))
   1496  1.1.1.2  mrg 	{
   1497  1.1.1.2  mrg 	  fprintf (dump_file, "Intersecting\n  ");
   1498  1.1.1.2  mrg 	  dump_value_range (dump_file, this);
   1499  1.1.1.2  mrg 	  fprintf (dump_file, "\nand\n  ");
   1500  1.1.1.2  mrg 	  dump_value_range (dump_file, other);
   1501  1.1.1.2  mrg 	  fprintf (dump_file, "\n");
   1502  1.1.1.2  mrg 	}
   1503  1.1.1.2  mrg 
   1504  1.1.1.2  mrg       legacy_intersect (this, other);
   1505  1.1.1.2  mrg 
   1506  1.1.1.2  mrg       if (dump_file && (dump_flags & TDF_DETAILS))
   1507  1.1.1.2  mrg 	{
   1508  1.1.1.2  mrg 	  fprintf (dump_file, "to\n  ");
   1509  1.1.1.2  mrg 	  dump_value_range (dump_file, this);
   1510  1.1.1.2  mrg 	  fprintf (dump_file, "\n");
   1511  1.1.1.2  mrg 	}
   1512  1.1.1.2  mrg       return;
   1513  1.1.1.2  mrg     }
   1514  1.1.1.2  mrg 
   1515  1.1.1.2  mrg   if (other->legacy_mode_p ())
   1516  1.1.1.2  mrg     {
   1517  1.1.1.2  mrg       int_range<2> wider;
   1518  1.1.1.2  mrg       wider = *other;
   1519  1.1.1.2  mrg       irange_intersect (wider);
   1520  1.1.1.2  mrg     }
   1521  1.1.1.2  mrg   else
   1522  1.1.1.2  mrg     irange_intersect (*other);
   1523      1.1  mrg }
   1524      1.1  mrg 
   1525  1.1.1.2  mrg // union_ for multi-ranges.
   1526  1.1.1.2  mrg 
   1527      1.1  mrg void
   1528  1.1.1.2  mrg irange::irange_union (const irange &r)
   1529      1.1  mrg {
   1530  1.1.1.2  mrg   gcc_checking_assert (!legacy_mode_p () && !r.legacy_mode_p ());
   1531  1.1.1.2  mrg 
   1532  1.1.1.2  mrg   if (r.undefined_p () || varying_p ())
   1533  1.1.1.2  mrg     return;
   1534  1.1.1.2  mrg 
   1535  1.1.1.2  mrg   if (undefined_p () || r.varying_p ())
   1536  1.1.1.2  mrg     {
   1537  1.1.1.2  mrg       operator= (r);
   1538  1.1.1.2  mrg       return;
   1539  1.1.1.2  mrg     }
   1540  1.1.1.2  mrg 
   1541  1.1.1.2  mrg   // Do not worry about merging and such by reserving twice as many
   1542  1.1.1.2  mrg   // pairs as needed, and then simply sort the 2 ranges into this
   1543  1.1.1.2  mrg   // intermediate form.
   1544  1.1.1.2  mrg   //
   1545  1.1.1.2  mrg   // The intermediate result will have the property that the beginning
   1546  1.1.1.2  mrg   // of each range is <= the beginning of the next range.  There may
   1547  1.1.1.2  mrg   // be overlapping ranges at this point.  I.e. this would be valid
   1548  1.1.1.2  mrg   // [-20, 10], [-10, 0], [0, 20], [40, 90] as it satisfies this
   1549  1.1.1.2  mrg   // contraint : -20 < -10 < 0 < 40.  When the range is rebuilt into r,
   1550  1.1.1.2  mrg   // the merge is performed.
   1551  1.1.1.2  mrg   //
   1552  1.1.1.2  mrg   // [Xi,Yi]..[Xn,Yn]  U  [Xj,Yj]..[Xm,Ym]   -->  [Xk,Yk]..[Xp,Yp]
   1553  1.1.1.2  mrg   auto_vec<tree, 20> res (m_num_ranges * 2 + r.m_num_ranges * 2);
   1554  1.1.1.2  mrg   unsigned i = 0, j = 0, k = 0;
   1555  1.1.1.2  mrg 
   1556  1.1.1.2  mrg   while (i < m_num_ranges * 2 && j < r.m_num_ranges * 2)
   1557  1.1.1.2  mrg     {
   1558  1.1.1.2  mrg       // lower of Xi and Xj is the lowest point.
   1559  1.1.1.2  mrg       if (wi::to_widest (m_base[i]) <= wi::to_widest (r.m_base[j]))
   1560  1.1.1.2  mrg 	{
   1561  1.1.1.2  mrg 	  res.quick_push (m_base[i]);
   1562  1.1.1.2  mrg 	  res.quick_push (m_base[i + 1]);
   1563  1.1.1.2  mrg 	  k += 2;
   1564  1.1.1.2  mrg 	  i += 2;
   1565  1.1.1.2  mrg 	}
   1566  1.1.1.2  mrg       else
   1567  1.1.1.2  mrg 	{
   1568  1.1.1.2  mrg 	  res.quick_push (r.m_base[j]);
   1569  1.1.1.2  mrg 	  res.quick_push (r.m_base[j + 1]);
   1570  1.1.1.2  mrg 	  k += 2;
   1571  1.1.1.2  mrg 	  j += 2;
   1572  1.1.1.2  mrg 	}
   1573  1.1.1.2  mrg     }
   1574  1.1.1.2  mrg   for ( ; i < m_num_ranges * 2; i += 2)
   1575  1.1.1.2  mrg     {
   1576  1.1.1.2  mrg       res.quick_push (m_base[i]);
   1577  1.1.1.2  mrg       res.quick_push (m_base[i + 1]);
   1578  1.1.1.2  mrg       k += 2;
   1579  1.1.1.2  mrg     }
   1580  1.1.1.2  mrg   for ( ; j < r.m_num_ranges * 2; j += 2)
   1581      1.1  mrg     {
   1582  1.1.1.2  mrg       res.quick_push (r.m_base[j]);
   1583  1.1.1.2  mrg       res.quick_push (r.m_base[j + 1]);
   1584  1.1.1.2  mrg       k += 2;
   1585      1.1  mrg     }
   1586      1.1  mrg 
   1587  1.1.1.2  mrg   // Now normalize the vector removing any overlaps.
   1588  1.1.1.2  mrg   i = 2;
   1589  1.1.1.2  mrg   for (j = 2; j < k ; j += 2)
   1590  1.1.1.2  mrg     {
   1591  1.1.1.2  mrg       // Current upper+1 is >= lower bound next pair, then we merge ranges.
   1592  1.1.1.2  mrg       if (wi::to_widest (res[i - 1]) + 1 >= wi::to_widest (res[j]))
   1593  1.1.1.2  mrg 	{
   1594  1.1.1.2  mrg 	  // New upper bounds is greater of current or the next one.
   1595  1.1.1.2  mrg 	  if (wi::to_widest (res[j + 1]) > wi::to_widest (res[i - 1]))
   1596  1.1.1.2  mrg 	    res[i - 1] = res[j + 1];
   1597  1.1.1.2  mrg 	}
   1598  1.1.1.2  mrg       else
   1599  1.1.1.2  mrg 	{
   1600  1.1.1.2  mrg 	  // This is a new distinct range, but no point in copying it
   1601  1.1.1.2  mrg 	  // if it is already in the right place.
   1602  1.1.1.2  mrg 	  if (i != j)
   1603  1.1.1.2  mrg 	    {
   1604  1.1.1.2  mrg 	      res[i++] = res[j];
   1605  1.1.1.2  mrg 	      res[i++] = res[j + 1];
   1606  1.1.1.2  mrg 	    }
   1607  1.1.1.2  mrg 	  else
   1608  1.1.1.2  mrg 	    i += 2;
   1609  1.1.1.2  mrg 	}
   1610  1.1.1.2  mrg     }
   1611      1.1  mrg 
   1612  1.1.1.2  mrg   // At this point, the vector should have i ranges, none overlapping.
   1613  1.1.1.2  mrg   // Now it simply needs to be copied, and if there are too many
   1614  1.1.1.2  mrg   // ranges, merge some.  We wont do any analysis as to what the
   1615  1.1.1.2  mrg   // "best" merges are, simply combine the final ranges into one.
   1616  1.1.1.2  mrg   if (i > m_max_ranges * 2)
   1617      1.1  mrg     {
   1618  1.1.1.2  mrg       res[m_max_ranges * 2 - 1] = res[i - 1];
   1619  1.1.1.2  mrg       i = m_max_ranges * 2;
   1620      1.1  mrg     }
   1621      1.1  mrg 
   1622  1.1.1.2  mrg   for (j = 0; j < i ; j++)
   1623  1.1.1.2  mrg     m_base[j] = res [j];
   1624  1.1.1.2  mrg   m_num_ranges = i / 2;
   1625      1.1  mrg 
   1626  1.1.1.2  mrg   m_kind = VR_RANGE;
   1627  1.1.1.2  mrg   normalize_kind ();
   1628  1.1.1.2  mrg 
   1629  1.1.1.2  mrg   if (flag_checking)
   1630  1.1.1.2  mrg     verify_range ();
   1631      1.1  mrg }
   1632      1.1  mrg 
   1633  1.1.1.2  mrg // intersect for multi-ranges.
   1634      1.1  mrg 
   1635      1.1  mrg void
   1636  1.1.1.2  mrg irange::irange_intersect (const irange &r)
   1637      1.1  mrg {
   1638  1.1.1.2  mrg   gcc_checking_assert (!legacy_mode_p () && !r.legacy_mode_p ());
   1639  1.1.1.2  mrg   gcc_checking_assert (undefined_p () || r.undefined_p ()
   1640  1.1.1.2  mrg 		       || range_compatible_p (type (), r.type ()));
   1641  1.1.1.2  mrg 
   1642  1.1.1.2  mrg   if (undefined_p () || r.varying_p ())
   1643  1.1.1.2  mrg     return;
   1644  1.1.1.2  mrg   if (r.undefined_p ())
   1645  1.1.1.2  mrg     {
   1646  1.1.1.2  mrg       set_undefined ();
   1647  1.1.1.2  mrg       return;
   1648  1.1.1.2  mrg     }
   1649  1.1.1.2  mrg   if (varying_p ())
   1650  1.1.1.2  mrg     {
   1651  1.1.1.2  mrg       operator= (r);
   1652  1.1.1.2  mrg       return;
   1653  1.1.1.2  mrg     }
   1654  1.1.1.2  mrg 
   1655  1.1.1.2  mrg   if (r.num_pairs () == 1)
   1656  1.1.1.2  mrg    {
   1657  1.1.1.2  mrg      // R cannot be undefined, use more efficent pair routine.
   1658  1.1.1.2  mrg      intersect (r.lower_bound(), r.upper_bound ());
   1659  1.1.1.2  mrg      return;
   1660  1.1.1.2  mrg    }
   1661  1.1.1.2  mrg 
   1662  1.1.1.2  mrg   signop sign = TYPE_SIGN (TREE_TYPE(m_base[0]));
   1663  1.1.1.2  mrg   unsigned bld_pair = 0;
   1664  1.1.1.2  mrg   unsigned bld_lim = m_max_ranges;
   1665  1.1.1.2  mrg   int_range_max r2 (*this);
   1666  1.1.1.2  mrg   unsigned r2_lim = r2.num_pairs ();
   1667  1.1.1.2  mrg   unsigned i2 = 0;
   1668  1.1.1.2  mrg   for (unsigned i = 0; i < r.num_pairs (); )
   1669  1.1.1.2  mrg     {
   1670  1.1.1.2  mrg       // If r1's upper is < r2's lower, we can skip r1's pair.
   1671  1.1.1.2  mrg       tree ru = r.m_base[i * 2 + 1];
   1672  1.1.1.2  mrg       tree r2l = r2.m_base[i2 * 2];
   1673  1.1.1.2  mrg       if (wi::lt_p (wi::to_wide (ru), wi::to_wide (r2l), sign))
   1674  1.1.1.2  mrg 	{
   1675  1.1.1.2  mrg 	  i++;
   1676  1.1.1.2  mrg 	  continue;
   1677  1.1.1.2  mrg 	}
   1678  1.1.1.2  mrg       // Likewise, skip r2's pair if its excluded.
   1679  1.1.1.2  mrg       tree r2u = r2.m_base[i2 * 2 + 1];
   1680  1.1.1.2  mrg       tree rl = r.m_base[i * 2];
   1681  1.1.1.2  mrg       if (wi::lt_p (wi::to_wide (r2u), wi::to_wide (rl), sign))
   1682  1.1.1.2  mrg 	{
   1683  1.1.1.2  mrg 	  i2++;
   1684  1.1.1.2  mrg 	  if (i2 < r2_lim)
   1685  1.1.1.2  mrg 	    continue;
   1686  1.1.1.2  mrg 	  // No more r2, break.
   1687  1.1.1.2  mrg 	  break;
   1688  1.1.1.2  mrg 	}
   1689  1.1.1.2  mrg 
   1690  1.1.1.2  mrg       // Must be some overlap.  Find the highest of the lower bounds,
   1691  1.1.1.2  mrg       // and set it, unless the build limits lower bounds is already
   1692  1.1.1.2  mrg       // set.
   1693  1.1.1.2  mrg       if (bld_pair < bld_lim)
   1694  1.1.1.2  mrg 	{
   1695  1.1.1.2  mrg 	  if (wi::ge_p (wi::to_wide (rl), wi::to_wide (r2l), sign))
   1696  1.1.1.2  mrg 	    m_base[bld_pair * 2] = rl;
   1697  1.1.1.2  mrg 	  else
   1698  1.1.1.2  mrg 	    m_base[bld_pair * 2] = r2l;
   1699  1.1.1.2  mrg 	}
   1700  1.1.1.2  mrg       else
   1701  1.1.1.2  mrg 	// Decrease and set a new upper.
   1702  1.1.1.2  mrg 	bld_pair--;
   1703  1.1.1.2  mrg 
   1704  1.1.1.2  mrg       // ...and choose the lower of the upper bounds.
   1705  1.1.1.2  mrg       if (wi::le_p (wi::to_wide (ru), wi::to_wide (r2u), sign))
   1706  1.1.1.2  mrg 	{
   1707  1.1.1.2  mrg 	  m_base[bld_pair * 2 + 1] = ru;
   1708  1.1.1.2  mrg 	  bld_pair++;
   1709  1.1.1.2  mrg 	  // Move past the r1 pair and keep trying.
   1710  1.1.1.2  mrg 	  i++;
   1711  1.1.1.2  mrg 	  continue;
   1712  1.1.1.2  mrg 	}
   1713  1.1.1.2  mrg       else
   1714  1.1.1.2  mrg 	{
   1715  1.1.1.2  mrg 	  m_base[bld_pair * 2 + 1] = r2u;
   1716  1.1.1.2  mrg 	  bld_pair++;
   1717  1.1.1.2  mrg 	  i2++;
   1718  1.1.1.2  mrg 	  if (i2 < r2_lim)
   1719  1.1.1.2  mrg 	    continue;
   1720  1.1.1.2  mrg 	  // No more r2, break.
   1721  1.1.1.2  mrg 	  break;
   1722  1.1.1.2  mrg 	}
   1723  1.1.1.2  mrg       // r2 has the higher lower bound.
   1724  1.1.1.2  mrg     }
   1725  1.1.1.2  mrg 
   1726  1.1.1.2  mrg   // At the exit of this loop, it is one of 2 things:
   1727  1.1.1.2  mrg   // ran out of r1, or r2, but either means we are done.
   1728  1.1.1.2  mrg   m_num_ranges = bld_pair;
   1729  1.1.1.2  mrg 
   1730  1.1.1.2  mrg   m_kind = VR_RANGE;
   1731  1.1.1.2  mrg   normalize_kind ();
   1732  1.1.1.2  mrg 
   1733  1.1.1.2  mrg   if (flag_checking)
   1734  1.1.1.2  mrg     verify_range ();
   1735      1.1  mrg }
   1736      1.1  mrg 
   1737  1.1.1.2  mrg // Multirange intersect for a specified wide_int [lb, ub] range.
   1738  1.1.1.2  mrg 
   1739      1.1  mrg void
   1740  1.1.1.2  mrg irange::intersect (const wide_int& lb, const wide_int& ub)
   1741      1.1  mrg {
   1742  1.1.1.2  mrg   // Undefined remains undefined.
   1743      1.1  mrg   if (undefined_p ())
   1744  1.1.1.2  mrg     return;
   1745  1.1.1.2  mrg 
   1746  1.1.1.2  mrg   if (legacy_mode_p ())
   1747      1.1  mrg     {
   1748  1.1.1.2  mrg       intersect (int_range<1> (type (), lb, ub));
   1749  1.1.1.2  mrg       return;
   1750  1.1.1.2  mrg     }
   1751      1.1  mrg 
   1752  1.1.1.2  mrg   tree range_type = type();
   1753  1.1.1.2  mrg   signop sign = TYPE_SIGN (range_type);
   1754      1.1  mrg 
   1755  1.1.1.2  mrg   gcc_checking_assert (TYPE_PRECISION (range_type) == wi::get_precision (lb));
   1756  1.1.1.2  mrg   gcc_checking_assert (TYPE_PRECISION (range_type) == wi::get_precision (ub));
   1757      1.1  mrg 
   1758  1.1.1.2  mrg   unsigned bld_index = 0;
   1759  1.1.1.2  mrg   unsigned pair_lim = num_pairs ();
   1760  1.1.1.2  mrg   for (unsigned i = 0; i < pair_lim; i++)
   1761  1.1.1.2  mrg     {
   1762  1.1.1.2  mrg       tree pairl = m_base[i * 2];
   1763  1.1.1.2  mrg       tree pairu = m_base[i * 2 + 1];
   1764  1.1.1.2  mrg       // Once UB is less than a pairs lower bound, we're done.
   1765  1.1.1.2  mrg       if (wi::lt_p (ub, wi::to_wide (pairl), sign))
   1766  1.1.1.2  mrg 	break;
   1767  1.1.1.2  mrg       // if LB is greater than this pairs upper, this pair is excluded.
   1768  1.1.1.2  mrg       if (wi::lt_p (wi::to_wide (pairu), lb, sign))
   1769  1.1.1.2  mrg 	continue;
   1770  1.1.1.2  mrg 
   1771  1.1.1.2  mrg       // Must be some overlap.  Find the highest of the lower bounds,
   1772  1.1.1.2  mrg       // and set it
   1773  1.1.1.2  mrg       if (wi::gt_p (lb, wi::to_wide (pairl), sign))
   1774  1.1.1.2  mrg 	m_base[bld_index * 2] = wide_int_to_tree (range_type, lb);
   1775      1.1  mrg       else
   1776  1.1.1.2  mrg 	m_base[bld_index * 2] = pairl;
   1777      1.1  mrg 
   1778  1.1.1.2  mrg       // ...and choose the lower of the upper bounds and if the base pair
   1779  1.1.1.2  mrg       // has the lower upper bound, need to check next pair too.
   1780  1.1.1.2  mrg       if (wi::lt_p (ub, wi::to_wide (pairu), sign))
   1781  1.1.1.2  mrg 	{
   1782  1.1.1.2  mrg 	  m_base[bld_index++ * 2 + 1] = wide_int_to_tree (range_type, ub);
   1783  1.1.1.2  mrg 	  break;
   1784  1.1.1.2  mrg 	}
   1785  1.1.1.2  mrg       else
   1786  1.1.1.2  mrg 	m_base[bld_index++ * 2 + 1] = pairu;
   1787  1.1.1.2  mrg     }
   1788  1.1.1.2  mrg 
   1789  1.1.1.2  mrg   m_num_ranges = bld_index;
   1790  1.1.1.2  mrg 
   1791  1.1.1.2  mrg   m_kind = VR_RANGE;
   1792  1.1.1.2  mrg   normalize_kind ();
   1793  1.1.1.2  mrg 
   1794  1.1.1.2  mrg   if (flag_checking)
   1795  1.1.1.2  mrg     verify_range ();
   1796  1.1.1.2  mrg }
   1797  1.1.1.2  mrg // Signed 1-bits are strange.  You can't subtract 1, because you can't
   1798  1.1.1.2  mrg // represent the number 1.  This works around that for the invert routine.
   1799  1.1.1.2  mrg 
   1800  1.1.1.2  mrg static wide_int inline
   1801  1.1.1.2  mrg subtract_one (const wide_int &x, tree type, wi::overflow_type &overflow)
   1802  1.1.1.2  mrg {
   1803  1.1.1.2  mrg   if (TYPE_SIGN (type) == SIGNED)
   1804  1.1.1.2  mrg     return wi::add (x, -1, SIGNED, &overflow);
   1805  1.1.1.2  mrg   else
   1806  1.1.1.2  mrg     return wi::sub (x, 1, UNSIGNED, &overflow);
   1807  1.1.1.2  mrg }
   1808  1.1.1.2  mrg 
   1809  1.1.1.2  mrg // The analogous function for adding 1.
   1810  1.1.1.2  mrg 
   1811  1.1.1.2  mrg static wide_int inline
   1812  1.1.1.2  mrg add_one (const wide_int &x, tree type, wi::overflow_type &overflow)
   1813  1.1.1.2  mrg {
   1814  1.1.1.2  mrg   if (TYPE_SIGN (type) == SIGNED)
   1815  1.1.1.2  mrg     return wi::sub (x, -1, SIGNED, &overflow);
   1816  1.1.1.2  mrg   else
   1817  1.1.1.2  mrg     return wi::add (x, 1, UNSIGNED, &overflow);
   1818  1.1.1.2  mrg }
   1819      1.1  mrg 
   1820  1.1.1.2  mrg // Return the inverse of a range.
   1821  1.1.1.2  mrg 
   1822  1.1.1.2  mrg void
   1823  1.1.1.2  mrg irange::invert ()
   1824  1.1.1.2  mrg {
   1825  1.1.1.2  mrg   if (legacy_mode_p ())
   1826  1.1.1.2  mrg     {
   1827  1.1.1.2  mrg       // We can't just invert VR_RANGE and VR_ANTI_RANGE because we may
   1828  1.1.1.2  mrg       // create non-canonical ranges.  Use the constructors instead.
   1829  1.1.1.2  mrg       if (m_kind == VR_RANGE)
   1830  1.1.1.2  mrg 	*this = value_range (min (), max (), VR_ANTI_RANGE);
   1831  1.1.1.2  mrg       else if (m_kind == VR_ANTI_RANGE)
   1832  1.1.1.2  mrg 	*this = value_range (min (), max ());
   1833      1.1  mrg       else
   1834  1.1.1.2  mrg 	gcc_unreachable ();
   1835  1.1.1.2  mrg       return;
   1836  1.1.1.2  mrg     }
   1837      1.1  mrg 
   1838  1.1.1.2  mrg   gcc_checking_assert (!undefined_p () && !varying_p ());
   1839  1.1.1.2  mrg 
   1840  1.1.1.2  mrg   // We always need one more set of bounds to represent an inverse, so
   1841  1.1.1.2  mrg   // if we're at the limit, we can't properly represent things.
   1842  1.1.1.2  mrg   //
   1843  1.1.1.2  mrg   // For instance, to represent the inverse of a 2 sub-range set
   1844  1.1.1.2  mrg   // [5, 10][20, 30], we would need a 3 sub-range set
   1845  1.1.1.2  mrg   // [-MIN, 4][11, 19][31, MAX].
   1846  1.1.1.2  mrg   //
   1847  1.1.1.2  mrg   // In this case, return the most conservative thing.
   1848  1.1.1.2  mrg   //
   1849  1.1.1.2  mrg   // However, if any of the extremes of the range are -MIN/+MAX, we
   1850  1.1.1.2  mrg   // know we will not need an extra bound.  For example:
   1851  1.1.1.2  mrg   //
   1852  1.1.1.2  mrg   // 	INVERT([-MIN,20][30,40]) => [21,29][41,+MAX]
   1853  1.1.1.2  mrg   // 	INVERT([-MIN,20][30,MAX]) => [21,29]
   1854  1.1.1.2  mrg   tree ttype = type ();
   1855  1.1.1.2  mrg   unsigned prec = TYPE_PRECISION (ttype);
   1856  1.1.1.2  mrg   signop sign = TYPE_SIGN (ttype);
   1857  1.1.1.2  mrg   wide_int type_min = wi::min_value (prec, sign);
   1858  1.1.1.2  mrg   wide_int type_max = wi::max_value (prec, sign);
   1859  1.1.1.2  mrg   // The algorithm is as follows.  To calculate INVERT ([a,b][c,d]), we
   1860  1.1.1.2  mrg   // generate [-MIN, a-1][b+1, c-1][d+1, MAX].
   1861  1.1.1.2  mrg   //
   1862  1.1.1.2  mrg   // If there is an over/underflow in the calculation for any
   1863  1.1.1.2  mrg   // sub-range, we eliminate that subrange.  This allows us to easily
   1864  1.1.1.2  mrg   // calculate INVERT([-MIN, 5]) with: [-MIN, -MIN-1][6, MAX].  And since
   1865  1.1.1.2  mrg   // we eliminate the underflow, only [6, MAX] remains.
   1866  1.1.1.2  mrg   unsigned i = 0;
   1867  1.1.1.2  mrg   wi::overflow_type ovf;
   1868  1.1.1.2  mrg   // Construct leftmost range.
   1869  1.1.1.2  mrg   int_range_max orig_range (*this);
   1870  1.1.1.2  mrg   unsigned nitems = 0;
   1871  1.1.1.2  mrg   wide_int tmp;
   1872  1.1.1.2  mrg   // If this is going to underflow on the MINUS 1, don't even bother
   1873  1.1.1.2  mrg   // checking.  This also handles subtracting one from an unsigned 0,
   1874  1.1.1.2  mrg   // which doesn't set the underflow bit.
   1875  1.1.1.2  mrg   if (type_min != orig_range.lower_bound ())
   1876  1.1.1.2  mrg     {
   1877  1.1.1.2  mrg       m_base[nitems++] = wide_int_to_tree (ttype, type_min);
   1878  1.1.1.2  mrg       tmp = subtract_one (orig_range.lower_bound (), ttype, ovf);
   1879  1.1.1.2  mrg       m_base[nitems++] = wide_int_to_tree (ttype, tmp);
   1880  1.1.1.2  mrg       if (ovf)
   1881  1.1.1.2  mrg 	nitems = 0;
   1882  1.1.1.2  mrg     }
   1883  1.1.1.2  mrg   i++;
   1884  1.1.1.2  mrg   // Construct middle ranges if applicable.
   1885  1.1.1.2  mrg   if (orig_range.num_pairs () > 1)
   1886  1.1.1.2  mrg     {
   1887  1.1.1.2  mrg       unsigned j = i;
   1888  1.1.1.2  mrg       for (; j < (orig_range.num_pairs () * 2) - 1; j += 2)
   1889  1.1.1.2  mrg 	{
   1890  1.1.1.2  mrg 	  // The middle ranges cannot have MAX/MIN, so there's no need
   1891  1.1.1.2  mrg 	  // to check for unsigned overflow on the +1 and -1 here.
   1892  1.1.1.2  mrg 	  tmp = wi::add (wi::to_wide (orig_range.m_base[j]), 1, sign, &ovf);
   1893  1.1.1.2  mrg 	  m_base[nitems++] = wide_int_to_tree (ttype, tmp);
   1894  1.1.1.2  mrg 	  tmp = subtract_one (wi::to_wide (orig_range.m_base[j + 1]),
   1895  1.1.1.2  mrg 			      ttype, ovf);
   1896  1.1.1.2  mrg 	  m_base[nitems++] = wide_int_to_tree (ttype, tmp);
   1897  1.1.1.2  mrg 	  if (ovf)
   1898  1.1.1.2  mrg 	    nitems -= 2;
   1899  1.1.1.2  mrg 	}
   1900  1.1.1.2  mrg       i = j;
   1901  1.1.1.2  mrg     }
   1902  1.1.1.2  mrg   // Construct rightmost range.
   1903  1.1.1.2  mrg   //
   1904  1.1.1.2  mrg   // However, if this will overflow on the PLUS 1, don't even bother.
   1905  1.1.1.2  mrg   // This also handles adding one to an unsigned MAX, which doesn't
   1906  1.1.1.2  mrg   // set the overflow bit.
   1907  1.1.1.2  mrg   if (type_max != wi::to_wide (orig_range.m_base[i]))
   1908  1.1.1.2  mrg     {
   1909  1.1.1.2  mrg       tmp = add_one (wi::to_wide (orig_range.m_base[i]), ttype, ovf);
   1910  1.1.1.2  mrg       m_base[nitems++] = wide_int_to_tree (ttype, tmp);
   1911  1.1.1.2  mrg       m_base[nitems++] = wide_int_to_tree (ttype, type_max);
   1912  1.1.1.2  mrg       if (ovf)
   1913  1.1.1.2  mrg 	nitems -= 2;
   1914  1.1.1.2  mrg     }
   1915  1.1.1.2  mrg   m_num_ranges = nitems / 2;
   1916  1.1.1.2  mrg 
   1917  1.1.1.2  mrg   // We disallow undefined or varying coming in, so the result can
   1918  1.1.1.2  mrg   // only be a VR_RANGE.
   1919  1.1.1.2  mrg   gcc_checking_assert (m_kind == VR_RANGE);
   1920  1.1.1.2  mrg 
   1921  1.1.1.2  mrg   if (flag_checking)
   1922  1.1.1.2  mrg     verify_range ();
   1923  1.1.1.2  mrg }
   1924  1.1.1.2  mrg 
   1925  1.1.1.2  mrg static void
   1926  1.1.1.2  mrg dump_bound_with_infinite_markers (FILE *file, tree bound)
   1927  1.1.1.2  mrg {
   1928  1.1.1.2  mrg   tree type = TREE_TYPE (bound);
   1929  1.1.1.2  mrg   wide_int type_min = wi::min_value (TYPE_PRECISION (type), TYPE_SIGN (type));
   1930  1.1.1.2  mrg   wide_int type_max = wi::max_value (TYPE_PRECISION (type), TYPE_SIGN (type));
   1931  1.1.1.2  mrg 
   1932  1.1.1.2  mrg   if (INTEGRAL_TYPE_P (type)
   1933  1.1.1.2  mrg       && !TYPE_UNSIGNED (type)
   1934  1.1.1.2  mrg       && TREE_CODE (bound) == INTEGER_CST
   1935  1.1.1.2  mrg       && wi::to_wide (bound) == type_min
   1936  1.1.1.2  mrg       && TYPE_PRECISION (type) != 1)
   1937  1.1.1.2  mrg     fprintf (file, "-INF");
   1938  1.1.1.2  mrg   else if (TREE_CODE (bound) == INTEGER_CST
   1939  1.1.1.2  mrg 	   && wi::to_wide (bound) == type_max
   1940  1.1.1.2  mrg 	   && TYPE_PRECISION (type) != 1)
   1941  1.1.1.2  mrg     fprintf (file, "+INF");
   1942  1.1.1.2  mrg   else
   1943  1.1.1.2  mrg     print_generic_expr (file, bound);
   1944  1.1.1.2  mrg }
   1945  1.1.1.2  mrg 
   1946  1.1.1.2  mrg void
   1947  1.1.1.2  mrg irange::dump (FILE *file) const
   1948  1.1.1.2  mrg {
   1949  1.1.1.2  mrg   if (undefined_p ())
   1950  1.1.1.2  mrg     {
   1951  1.1.1.2  mrg       fprintf (file, "UNDEFINED");
   1952  1.1.1.2  mrg       return;
   1953  1.1.1.2  mrg     }
   1954  1.1.1.2  mrg   print_generic_expr (file, type ());
   1955  1.1.1.2  mrg   fprintf (file, " ");
   1956  1.1.1.2  mrg   if (varying_p ())
   1957  1.1.1.2  mrg     {
   1958  1.1.1.2  mrg       fprintf (file, "VARYING");
   1959  1.1.1.2  mrg       return;
   1960  1.1.1.2  mrg     }
   1961  1.1.1.2  mrg  if (legacy_mode_p ())
   1962  1.1.1.2  mrg     {
   1963  1.1.1.2  mrg       fprintf (file, "%s[", (m_kind == VR_ANTI_RANGE) ? "~" : "");
   1964  1.1.1.2  mrg       dump_bound_with_infinite_markers (file, min ());
   1965  1.1.1.2  mrg       fprintf (file, ", ");
   1966  1.1.1.2  mrg       dump_bound_with_infinite_markers (file, max ());
   1967      1.1  mrg       fprintf (file, "]");
   1968  1.1.1.2  mrg       return;
   1969      1.1  mrg     }
   1970  1.1.1.2  mrg   for (unsigned i = 0; i < m_num_ranges; ++i)
   1971      1.1  mrg     {
   1972  1.1.1.2  mrg       tree lb = m_base[i * 2];
   1973  1.1.1.2  mrg       tree ub = m_base[i * 2 + 1];
   1974  1.1.1.2  mrg       fprintf (file, "[");
   1975  1.1.1.2  mrg       dump_bound_with_infinite_markers (file, lb);
   1976  1.1.1.2  mrg       fprintf (file, ", ");
   1977  1.1.1.2  mrg       dump_bound_with_infinite_markers (file, ub);
   1978  1.1.1.2  mrg       fprintf (file, "]");
   1979      1.1  mrg     }
   1980      1.1  mrg }
   1981      1.1  mrg 
   1982      1.1  mrg void
   1983  1.1.1.2  mrg irange::debug () const
   1984      1.1  mrg {
   1985      1.1  mrg   dump (stderr);
   1986  1.1.1.2  mrg   fprintf (stderr, "\n");
   1987      1.1  mrg }
   1988      1.1  mrg 
   1989      1.1  mrg void
   1990  1.1.1.2  mrg dump_value_range (FILE *file, const irange *vr)
   1991      1.1  mrg {
   1992  1.1.1.2  mrg   vr->dump (file);
   1993  1.1.1.2  mrg }
   1994  1.1.1.2  mrg 
   1995  1.1.1.2  mrg DEBUG_FUNCTION void
   1996  1.1.1.2  mrg debug (const irange *vr)
   1997  1.1.1.2  mrg {
   1998  1.1.1.2  mrg   dump_value_range (stderr, vr);
   1999  1.1.1.2  mrg   fprintf (stderr, "\n");
   2000  1.1.1.2  mrg }
   2001  1.1.1.2  mrg 
   2002  1.1.1.2  mrg DEBUG_FUNCTION void
   2003  1.1.1.2  mrg debug (const irange &vr)
   2004  1.1.1.2  mrg {
   2005  1.1.1.2  mrg   debug (&vr);
   2006      1.1  mrg }
   2007      1.1  mrg 
   2008      1.1  mrg DEBUG_FUNCTION void
   2009      1.1  mrg debug (const value_range *vr)
   2010      1.1  mrg {
   2011      1.1  mrg   dump_value_range (stderr, vr);
   2012  1.1.1.2  mrg   fprintf (stderr, "\n");
   2013      1.1  mrg }
   2014      1.1  mrg 
   2015      1.1  mrg DEBUG_FUNCTION void
   2016      1.1  mrg debug (const value_range &vr)
   2017      1.1  mrg {
   2018      1.1  mrg   dump_value_range (stderr, &vr);
   2019  1.1.1.2  mrg   fprintf (stderr, "\n");
   2020      1.1  mrg }
   2021      1.1  mrg 
   2022      1.1  mrg /* Create two value-ranges in *VR0 and *VR1 from the anti-range *AR
   2023      1.1  mrg    so that *VR0 U *VR1 == *AR.  Returns true if that is possible,
   2024      1.1  mrg    false otherwise.  If *AR can be represented with a single range
   2025      1.1  mrg    *VR1 will be VR_UNDEFINED.  */
   2026      1.1  mrg 
   2027      1.1  mrg bool
   2028      1.1  mrg ranges_from_anti_range (const value_range *ar,
   2029      1.1  mrg 			value_range *vr0, value_range *vr1)
   2030      1.1  mrg {
   2031      1.1  mrg   tree type = ar->type ();
   2032      1.1  mrg 
   2033      1.1  mrg   vr0->set_undefined ();
   2034      1.1  mrg   vr1->set_undefined ();
   2035      1.1  mrg 
   2036      1.1  mrg   /* As a future improvement, we could handle ~[0, A] as: [-INF, -1] U
   2037      1.1  mrg      [A+1, +INF].  Not sure if this helps in practice, though.  */
   2038      1.1  mrg 
   2039      1.1  mrg   if (ar->kind () != VR_ANTI_RANGE
   2040      1.1  mrg       || TREE_CODE (ar->min ()) != INTEGER_CST
   2041      1.1  mrg       || TREE_CODE (ar->max ()) != INTEGER_CST
   2042      1.1  mrg       || !vrp_val_min (type)
   2043      1.1  mrg       || !vrp_val_max (type))
   2044      1.1  mrg     return false;
   2045      1.1  mrg 
   2046      1.1  mrg   if (tree_int_cst_lt (vrp_val_min (type), ar->min ()))
   2047      1.1  mrg     vr0->set (vrp_val_min (type),
   2048      1.1  mrg 	      wide_int_to_tree (type, wi::to_wide (ar->min ()) - 1));
   2049      1.1  mrg   if (tree_int_cst_lt (ar->max (), vrp_val_max (type)))
   2050      1.1  mrg     vr1->set (wide_int_to_tree (type, wi::to_wide (ar->max ()) + 1),
   2051      1.1  mrg 	      vrp_val_max (type));
   2052      1.1  mrg   if (vr0->undefined_p ())
   2053      1.1  mrg     {
   2054      1.1  mrg       *vr0 = *vr1;
   2055      1.1  mrg       vr1->set_undefined ();
   2056      1.1  mrg     }
   2057      1.1  mrg 
   2058      1.1  mrg   return !vr0->undefined_p ();
   2059      1.1  mrg }
   2060      1.1  mrg 
   2061      1.1  mrg bool
   2062  1.1.1.2  mrg range_has_numeric_bounds_p (const irange *vr)
   2063      1.1  mrg {
   2064  1.1.1.2  mrg   return (!vr->undefined_p ()
   2065      1.1  mrg 	  && TREE_CODE (vr->min ()) == INTEGER_CST
   2066      1.1  mrg 	  && TREE_CODE (vr->max ()) == INTEGER_CST);
   2067      1.1  mrg }
   2068      1.1  mrg 
   2069      1.1  mrg /* Return whether VAL is equal to the maximum value of its type.
   2070      1.1  mrg    We can't do a simple equality comparison with TYPE_MAX_VALUE because
   2071      1.1  mrg    C typedefs and Ada subtypes can produce types whose TYPE_MAX_VALUE
   2072      1.1  mrg    is not == to the integer constant with the same value in the type.  */
   2073      1.1  mrg 
   2074      1.1  mrg bool
   2075      1.1  mrg vrp_val_is_max (const_tree val)
   2076      1.1  mrg {
   2077      1.1  mrg   tree type_max = vrp_val_max (TREE_TYPE (val));
   2078      1.1  mrg   return (val == type_max
   2079      1.1  mrg 	  || (type_max != NULL_TREE
   2080      1.1  mrg 	      && operand_equal_p (val, type_max, 0)));
   2081      1.1  mrg }
   2082      1.1  mrg 
   2083      1.1  mrg /* Return whether VAL is equal to the minimum value of its type.  */
   2084      1.1  mrg 
   2085      1.1  mrg bool
   2086      1.1  mrg vrp_val_is_min (const_tree val)
   2087      1.1  mrg {
   2088      1.1  mrg   tree type_min = vrp_val_min (TREE_TYPE (val));
   2089      1.1  mrg   return (val == type_min
   2090      1.1  mrg 	  || (type_min != NULL_TREE
   2091      1.1  mrg 	      && operand_equal_p (val, type_min, 0)));
   2092      1.1  mrg }
   2093      1.1  mrg 
   2094      1.1  mrg /* Return true, if VAL1 and VAL2 are equal values for VRP purposes.  */
   2095      1.1  mrg 
   2096      1.1  mrg bool
   2097      1.1  mrg vrp_operand_equal_p (const_tree val1, const_tree val2)
   2098      1.1  mrg {
   2099      1.1  mrg   if (val1 == val2)
   2100      1.1  mrg     return true;
   2101      1.1  mrg   if (!val1 || !val2 || !operand_equal_p (val1, val2, 0))
   2102      1.1  mrg     return false;
   2103      1.1  mrg   return true;
   2104      1.1  mrg }
   2105  1.1.1.2  mrg 
   2106  1.1.1.2  mrg // ?? These stubs are for ipa-prop.cc which use a value_range in a
   2107  1.1.1.2  mrg // hash_traits.  hash-traits.h defines an extern of gt_ggc_mx (T &)
   2108  1.1.1.2  mrg // instead of picking up the gt_ggc_mx (T *) version.
   2109  1.1.1.2  mrg void
   2110  1.1.1.2  mrg gt_pch_nx (int_range<1> *&x)
   2111  1.1.1.2  mrg {
   2112  1.1.1.2  mrg   return gt_pch_nx ((irange *) x);
   2113  1.1.1.2  mrg }
   2114  1.1.1.2  mrg 
   2115  1.1.1.2  mrg void
   2116  1.1.1.2  mrg gt_ggc_mx (int_range<1> *&x)
   2117  1.1.1.2  mrg {
   2118  1.1.1.2  mrg   return gt_ggc_mx ((irange *) x);
   2119  1.1.1.2  mrg }
   2120  1.1.1.2  mrg 
   2121  1.1.1.2  mrg #define DEFINE_INT_RANGE_INSTANCE(N)					\
   2122  1.1.1.2  mrg   template int_range<N>::int_range(tree, tree, value_range_kind);	\
   2123  1.1.1.2  mrg   template int_range<N>::int_range(tree_node *,				\
   2124  1.1.1.2  mrg 				   const wide_int &,			\
   2125  1.1.1.2  mrg 				   const wide_int &,			\
   2126  1.1.1.2  mrg 				   value_range_kind);			\
   2127  1.1.1.2  mrg   template int_range<N>::int_range(tree);				\
   2128  1.1.1.2  mrg   template int_range<N>::int_range(const irange &);		\
   2129  1.1.1.2  mrg   template int_range<N>::int_range(const int_range &);			\
   2130  1.1.1.2  mrg   template int_range<N>& int_range<N>::operator= (const int_range &);
   2131  1.1.1.2  mrg 
   2132  1.1.1.2  mrg DEFINE_INT_RANGE_INSTANCE(1)
   2133  1.1.1.2  mrg DEFINE_INT_RANGE_INSTANCE(2)
   2134  1.1.1.2  mrg DEFINE_INT_RANGE_INSTANCE(3)
   2135  1.1.1.2  mrg DEFINE_INT_RANGE_INSTANCE(255)
   2136  1.1.1.2  mrg 
   2137  1.1.1.2  mrg #if CHECKING_P
   2138  1.1.1.2  mrg #include "selftest.h"
   2139  1.1.1.2  mrg 
   2140  1.1.1.2  mrg namespace selftest
   2141  1.1.1.2  mrg {
   2142  1.1.1.2  mrg #define INT(N) build_int_cst (integer_type_node, (N))
   2143  1.1.1.2  mrg #define UINT(N) build_int_cstu (unsigned_type_node, (N))
   2144  1.1.1.2  mrg #define UINT128(N) build_int_cstu (u128_type, (N))
   2145  1.1.1.2  mrg #define UCHAR(N) build_int_cstu (unsigned_char_type_node, (N))
   2146  1.1.1.2  mrg #define SCHAR(N) build_int_cst (signed_char_type_node, (N))
   2147  1.1.1.2  mrg 
   2148  1.1.1.2  mrg static int_range<3>
   2149  1.1.1.2  mrg build_range3 (int a, int b, int c, int d, int e, int f)
   2150  1.1.1.2  mrg {
   2151  1.1.1.2  mrg   int_range<3> i1 (INT (a), INT (b));
   2152  1.1.1.2  mrg   int_range<3> i2 (INT (c), INT (d));
   2153  1.1.1.2  mrg   int_range<3> i3 (INT (e), INT (f));
   2154  1.1.1.2  mrg   i1.union_ (i2);
   2155  1.1.1.2  mrg   i1.union_ (i3);
   2156  1.1.1.2  mrg   return i1;
   2157  1.1.1.2  mrg }
   2158  1.1.1.2  mrg 
   2159  1.1.1.2  mrg static void
   2160  1.1.1.2  mrg range_tests_irange3 ()
   2161  1.1.1.2  mrg {
   2162  1.1.1.2  mrg   typedef int_range<3> int_range3;
   2163  1.1.1.2  mrg   int_range3 r0, r1, r2;
   2164  1.1.1.2  mrg   int_range3 i1, i2, i3;
   2165  1.1.1.2  mrg 
   2166  1.1.1.2  mrg   // ([10,20] U [5,8]) U [1,3] ==> [1,3][5,8][10,20].
   2167  1.1.1.2  mrg   r0 = int_range3 (INT (10), INT (20));
   2168  1.1.1.2  mrg   r1 = int_range3 (INT (5), INT (8));
   2169  1.1.1.2  mrg   r0.union_ (r1);
   2170  1.1.1.2  mrg   r1 = int_range3 (INT (1), INT (3));
   2171  1.1.1.2  mrg   r0.union_ (r1);
   2172  1.1.1.2  mrg   ASSERT_TRUE (r0 == build_range3 (1, 3, 5, 8, 10, 20));
   2173  1.1.1.2  mrg 
   2174  1.1.1.2  mrg   // [1,3][5,8][10,20] U [-5,0] => [-5,3][5,8][10,20].
   2175  1.1.1.2  mrg   r1 = int_range3 (INT (-5), INT (0));
   2176  1.1.1.2  mrg   r0.union_ (r1);
   2177  1.1.1.2  mrg   ASSERT_TRUE (r0 == build_range3 (-5, 3, 5, 8, 10, 20));
   2178  1.1.1.2  mrg 
   2179  1.1.1.2  mrg   // [10,20][30,40] U [50,60] ==> [10,20][30,40][50,60].
   2180  1.1.1.2  mrg   r1 = int_range3 (INT (50), INT (60));
   2181  1.1.1.2  mrg   r0 = int_range3 (INT (10), INT (20));
   2182  1.1.1.2  mrg   r0.union_ (int_range3 (INT (30), INT (40)));
   2183  1.1.1.2  mrg   r0.union_ (r1);
   2184  1.1.1.2  mrg   ASSERT_TRUE (r0 == build_range3 (10, 20, 30, 40, 50, 60));
   2185  1.1.1.2  mrg   // [10,20][30,40][50,60] U [70, 80] ==> [10,20][30,40][50,60][70,80].
   2186  1.1.1.2  mrg   r1 = int_range3 (INT (70), INT (80));
   2187  1.1.1.2  mrg   r0.union_ (r1);
   2188  1.1.1.2  mrg 
   2189  1.1.1.2  mrg   r2 = build_range3 (10, 20, 30, 40, 50, 60);
   2190  1.1.1.2  mrg   r2.union_ (int_range3 (INT (70), INT (80)));
   2191  1.1.1.2  mrg   ASSERT_TRUE (r0 == r2);
   2192  1.1.1.2  mrg 
   2193  1.1.1.2  mrg   // [10,20][30,40][50,60] U [6,35] => [6,40][50,60].
   2194  1.1.1.2  mrg   r0 = build_range3 (10, 20, 30, 40, 50, 60);
   2195  1.1.1.2  mrg   r1 = int_range3 (INT (6), INT (35));
   2196  1.1.1.2  mrg   r0.union_ (r1);
   2197  1.1.1.2  mrg   r1 = int_range3 (INT (6), INT (40));
   2198  1.1.1.2  mrg   r1.union_ (int_range3 (INT (50), INT (60)));
   2199  1.1.1.2  mrg   ASSERT_TRUE (r0 == r1);
   2200  1.1.1.2  mrg 
   2201  1.1.1.2  mrg   // [10,20][30,40][50,60] U [6,60] => [6,60].
   2202  1.1.1.2  mrg   r0 = build_range3 (10, 20, 30, 40, 50, 60);
   2203  1.1.1.2  mrg   r1 = int_range3 (INT (6), INT (60));
   2204  1.1.1.2  mrg   r0.union_ (r1);
   2205  1.1.1.2  mrg   ASSERT_TRUE (r0 == int_range3 (INT (6), INT (60)));
   2206  1.1.1.2  mrg 
   2207  1.1.1.2  mrg   // [10,20][30,40][50,60] U [6,70] => [6,70].
   2208  1.1.1.2  mrg   r0 = build_range3 (10, 20, 30, 40, 50, 60);
   2209  1.1.1.2  mrg   r1 = int_range3 (INT (6), INT (70));
   2210  1.1.1.2  mrg   r0.union_ (r1);
   2211  1.1.1.2  mrg   ASSERT_TRUE (r0 == int_range3 (INT (6), INT (70)));
   2212  1.1.1.2  mrg 
   2213  1.1.1.2  mrg   // [10,20][30,40][50,60] U [35,70] => [10,20][30,70].
   2214  1.1.1.2  mrg   r0 = build_range3 (10, 20, 30, 40, 50, 60);
   2215  1.1.1.2  mrg   r1 = int_range3 (INT (35), INT (70));
   2216  1.1.1.2  mrg   r0.union_ (r1);
   2217  1.1.1.2  mrg   r1 = int_range3 (INT (10), INT (20));
   2218  1.1.1.2  mrg   r1.union_ (int_range3 (INT (30), INT (70)));
   2219  1.1.1.2  mrg   ASSERT_TRUE (r0 == r1);
   2220  1.1.1.2  mrg 
   2221  1.1.1.2  mrg   // [10,20][30,40][50,60] U [15,35] => [10,40][50,60].
   2222  1.1.1.2  mrg   r0 = build_range3 (10, 20, 30, 40, 50, 60);
   2223  1.1.1.2  mrg   r1 = int_range3 (INT (15), INT (35));
   2224  1.1.1.2  mrg   r0.union_ (r1);
   2225  1.1.1.2  mrg   r1 = int_range3 (INT (10), INT (40));
   2226  1.1.1.2  mrg   r1.union_ (int_range3 (INT (50), INT (60)));
   2227  1.1.1.2  mrg   ASSERT_TRUE (r0 == r1);
   2228  1.1.1.2  mrg 
   2229  1.1.1.2  mrg   // [10,20][30,40][50,60] U [35,35] => [10,20][30,40][50,60].
   2230  1.1.1.2  mrg   r0 = build_range3 (10, 20, 30, 40, 50, 60);
   2231  1.1.1.2  mrg   r1 = int_range3 (INT (35), INT (35));
   2232  1.1.1.2  mrg   r0.union_ (r1);
   2233  1.1.1.2  mrg   ASSERT_TRUE (r0 == build_range3 (10, 20, 30, 40, 50, 60));
   2234  1.1.1.2  mrg }
   2235  1.1.1.2  mrg 
   2236  1.1.1.2  mrg static void
   2237  1.1.1.2  mrg range_tests_int_range_max ()
   2238  1.1.1.2  mrg {
   2239  1.1.1.2  mrg   int_range_max big;
   2240  1.1.1.2  mrg   unsigned int nrange;
   2241  1.1.1.2  mrg 
   2242  1.1.1.2  mrg   // Build a huge multi-range range.
   2243  1.1.1.2  mrg   for (nrange = 0; nrange < 50; ++nrange)
   2244  1.1.1.2  mrg     {
   2245  1.1.1.2  mrg       int_range<1> tmp (INT (nrange*10), INT (nrange*10 + 5));
   2246  1.1.1.2  mrg       big.union_ (tmp);
   2247  1.1.1.2  mrg     }
   2248  1.1.1.2  mrg   ASSERT_TRUE (big.num_pairs () == nrange);
   2249  1.1.1.2  mrg 
   2250  1.1.1.2  mrg   // Verify that we can copy it without loosing precision.
   2251  1.1.1.2  mrg   int_range_max copy (big);
   2252  1.1.1.2  mrg   ASSERT_TRUE (copy.num_pairs () == nrange);
   2253  1.1.1.2  mrg 
   2254  1.1.1.2  mrg   // Inverting it should produce one more sub-range.
   2255  1.1.1.2  mrg   big.invert ();
   2256  1.1.1.2  mrg   ASSERT_TRUE (big.num_pairs () == nrange + 1);
   2257  1.1.1.2  mrg 
   2258  1.1.1.2  mrg   int_range<1> tmp (INT (5), INT (37));
   2259  1.1.1.2  mrg   big.intersect (tmp);
   2260  1.1.1.2  mrg   ASSERT_TRUE (big.num_pairs () == 4);
   2261  1.1.1.2  mrg 
   2262  1.1.1.2  mrg   // Test that [10,10][20,20] does NOT contain 15.
   2263  1.1.1.2  mrg   {
   2264  1.1.1.2  mrg     int_range_max i1 (build_int_cst (integer_type_node, 10),
   2265  1.1.1.2  mrg 		      build_int_cst (integer_type_node, 10));
   2266  1.1.1.2  mrg     int_range_max i2 (build_int_cst (integer_type_node, 20),
   2267  1.1.1.2  mrg 		      build_int_cst (integer_type_node, 20));
   2268  1.1.1.2  mrg     i1.union_ (i2);
   2269  1.1.1.2  mrg     ASSERT_FALSE (i1.contains_p (build_int_cst (integer_type_node, 15)));
   2270  1.1.1.2  mrg   }
   2271  1.1.1.2  mrg }
   2272  1.1.1.2  mrg 
   2273  1.1.1.2  mrg static void
   2274  1.1.1.2  mrg range_tests_legacy ()
   2275  1.1.1.2  mrg {
   2276  1.1.1.2  mrg   // Test truncating copy to int_range<1>.
   2277  1.1.1.2  mrg   int_range<3> big = build_range3 (10, 20, 30, 40, 50, 60);
   2278  1.1.1.2  mrg   int_range<1> small = big;
   2279  1.1.1.2  mrg   ASSERT_TRUE (small == int_range<1> (INT (10), INT (60)));
   2280  1.1.1.2  mrg 
   2281  1.1.1.2  mrg   // Test truncating copy to int_range<2>.
   2282  1.1.1.2  mrg   int_range<2> medium = big;
   2283  1.1.1.2  mrg   ASSERT_TRUE (!medium.undefined_p ());
   2284  1.1.1.2  mrg 
   2285  1.1.1.2  mrg   // Test that a truncating copy of [MIN,20][22,40][80,MAX]
   2286  1.1.1.2  mrg   // ends up as a conservative anti-range of ~[21,21].
   2287  1.1.1.2  mrg   big = int_range<3> (vrp_val_min (integer_type_node), INT (20));
   2288  1.1.1.2  mrg   big.union_ (int_range<1> (INT (22), INT (40)));
   2289  1.1.1.2  mrg   big.union_ (int_range<1> (INT (80), vrp_val_max (integer_type_node)));
   2290  1.1.1.2  mrg   small = big;
   2291  1.1.1.2  mrg   ASSERT_TRUE (small == int_range<1> (INT (21), INT (21), VR_ANTI_RANGE));
   2292  1.1.1.2  mrg 
   2293  1.1.1.2  mrg   // Copying a legacy symbolic to an int_range should normalize the
   2294  1.1.1.2  mrg   // symbolic at copy time.
   2295  1.1.1.2  mrg   {
   2296  1.1.1.2  mrg     tree ssa = make_ssa_name (integer_type_node);
   2297  1.1.1.2  mrg     value_range legacy_range (ssa, INT (25));
   2298  1.1.1.2  mrg     int_range<2> copy = legacy_range;
   2299  1.1.1.2  mrg     ASSERT_TRUE (copy == int_range<2>  (vrp_val_min (integer_type_node),
   2300  1.1.1.2  mrg 					INT (25)));
   2301  1.1.1.2  mrg 
   2302  1.1.1.2  mrg     // Test that copying ~[abc_23, abc_23] to a multi-range yields varying.
   2303  1.1.1.2  mrg     legacy_range = value_range (ssa, ssa, VR_ANTI_RANGE);
   2304  1.1.1.2  mrg     copy = legacy_range;
   2305  1.1.1.2  mrg     ASSERT_TRUE (copy.varying_p ());
   2306  1.1.1.2  mrg   }
   2307  1.1.1.2  mrg 
   2308  1.1.1.2  mrg   // VARYING of different sizes should not be equal.
   2309  1.1.1.2  mrg   tree big_type = build_nonstandard_integer_type (32, 1);
   2310  1.1.1.2  mrg   tree small_type = build_nonstandard_integer_type (16, 1);
   2311  1.1.1.2  mrg   int_range_max r0 (big_type);
   2312  1.1.1.2  mrg   int_range_max r1 (small_type);
   2313  1.1.1.2  mrg   ASSERT_TRUE (r0 != r1);
   2314  1.1.1.2  mrg   value_range vr0 (big_type);
   2315  1.1.1.2  mrg   int_range_max vr1 (small_type);
   2316  1.1.1.2  mrg   ASSERT_TRUE (vr0 != vr1);
   2317  1.1.1.2  mrg }
   2318  1.1.1.2  mrg 
   2319  1.1.1.2  mrg // Simulate -fstrict-enums where the domain of a type is less than the
   2320  1.1.1.2  mrg // underlying type.
   2321  1.1.1.2  mrg 
   2322  1.1.1.2  mrg static void
   2323  1.1.1.2  mrg range_tests_strict_enum ()
   2324  1.1.1.2  mrg {
   2325  1.1.1.2  mrg   // The enum can only hold [0, 3].
   2326  1.1.1.2  mrg   tree rtype = copy_node (unsigned_type_node);
   2327  1.1.1.2  mrg   TYPE_MIN_VALUE (rtype) = build_int_cstu (rtype, 0);
   2328  1.1.1.2  mrg   TYPE_MAX_VALUE (rtype) = build_int_cstu (rtype, 3);
   2329  1.1.1.2  mrg 
   2330  1.1.1.2  mrg   // Test that even though vr1 covers the strict enum domain ([0, 3]),
   2331  1.1.1.2  mrg   // it does not cover the domain of the underlying type.
   2332  1.1.1.2  mrg   int_range<1> vr1 (build_int_cstu (rtype, 0), build_int_cstu (rtype, 1));
   2333  1.1.1.2  mrg   int_range<1> vr2 (build_int_cstu (rtype, 2), build_int_cstu (rtype, 3));
   2334  1.1.1.2  mrg   vr1.union_ (vr2);
   2335  1.1.1.2  mrg   ASSERT_TRUE (vr1 == int_range<1> (build_int_cstu (rtype, 0),
   2336  1.1.1.2  mrg 				    build_int_cstu (rtype, 3)));
   2337  1.1.1.2  mrg   ASSERT_FALSE (vr1.varying_p ());
   2338  1.1.1.2  mrg 
   2339  1.1.1.2  mrg   // Test that copying to a multi-range does not change things.
   2340  1.1.1.2  mrg   int_range<2> ir1 (vr1);
   2341  1.1.1.2  mrg   ASSERT_TRUE (ir1 == vr1);
   2342  1.1.1.2  mrg   ASSERT_FALSE (ir1.varying_p ());
   2343  1.1.1.2  mrg 
   2344  1.1.1.2  mrg   // The same test as above, but using TYPE_{MIN,MAX}_VALUE instead of [0,3].
   2345  1.1.1.2  mrg   vr1 = int_range<1> (TYPE_MIN_VALUE (rtype), TYPE_MAX_VALUE (rtype));
   2346  1.1.1.2  mrg   ir1 = vr1;
   2347  1.1.1.2  mrg   ASSERT_TRUE (ir1 == vr1);
   2348  1.1.1.2  mrg   ASSERT_FALSE (ir1.varying_p ());
   2349  1.1.1.2  mrg }
   2350  1.1.1.2  mrg 
   2351  1.1.1.2  mrg static void
   2352  1.1.1.2  mrg range_tests_misc ()
   2353  1.1.1.2  mrg {
   2354  1.1.1.2  mrg   tree u128_type = build_nonstandard_integer_type (128, /*unsigned=*/1);
   2355  1.1.1.2  mrg   int_range<1> i1, i2, i3;
   2356  1.1.1.2  mrg   int_range<1> r0, r1, rold;
   2357  1.1.1.2  mrg 
   2358  1.1.1.2  mrg   // Test 1-bit signed integer union.
   2359  1.1.1.2  mrg   // [-1,-1] U [0,0] = VARYING.
   2360  1.1.1.2  mrg   tree one_bit_type = build_nonstandard_integer_type (1, 0);
   2361  1.1.1.2  mrg   tree one_bit_min = vrp_val_min (one_bit_type);
   2362  1.1.1.2  mrg   tree one_bit_max = vrp_val_max (one_bit_type);
   2363  1.1.1.2  mrg   {
   2364  1.1.1.2  mrg     int_range<2> min (one_bit_min, one_bit_min);
   2365  1.1.1.2  mrg     int_range<2> max (one_bit_max, one_bit_max);
   2366  1.1.1.2  mrg     max.union_ (min);
   2367  1.1.1.2  mrg     ASSERT_TRUE (max.varying_p ());
   2368  1.1.1.2  mrg   }
   2369  1.1.1.2  mrg 
   2370  1.1.1.2  mrg   // Test inversion of 1-bit signed integers.
   2371  1.1.1.2  mrg   {
   2372  1.1.1.2  mrg     int_range<2> min (one_bit_min, one_bit_min);
   2373  1.1.1.2  mrg     int_range<2> max (one_bit_max, one_bit_max);
   2374  1.1.1.2  mrg     int_range<2> t;
   2375  1.1.1.2  mrg     t = min;
   2376  1.1.1.2  mrg     t.invert ();
   2377  1.1.1.2  mrg     ASSERT_TRUE (t == max);
   2378  1.1.1.2  mrg     t = max;
   2379  1.1.1.2  mrg     t.invert ();
   2380  1.1.1.2  mrg     ASSERT_TRUE (t == min);
   2381  1.1.1.2  mrg   }
   2382  1.1.1.2  mrg 
   2383  1.1.1.2  mrg   // Test that NOT(255) is [0..254] in 8-bit land.
   2384  1.1.1.2  mrg   int_range<1> not_255 (UCHAR (255), UCHAR (255), VR_ANTI_RANGE);
   2385  1.1.1.2  mrg   ASSERT_TRUE (not_255 == int_range<1> (UCHAR (0), UCHAR (254)));
   2386  1.1.1.2  mrg 
   2387  1.1.1.2  mrg   // Test that NOT(0) is [1..255] in 8-bit land.
   2388  1.1.1.2  mrg   int_range<1> not_zero = range_nonzero (unsigned_char_type_node);
   2389  1.1.1.2  mrg   ASSERT_TRUE (not_zero == int_range<1> (UCHAR (1), UCHAR (255)));
   2390  1.1.1.2  mrg 
   2391  1.1.1.2  mrg   // Check that [0,127][0x..ffffff80,0x..ffffff]
   2392  1.1.1.2  mrg   //  => ~[128, 0x..ffffff7f].
   2393  1.1.1.2  mrg   r0 = int_range<1> (UINT128 (0), UINT128 (127));
   2394  1.1.1.2  mrg   tree high = build_minus_one_cst (u128_type);
   2395  1.1.1.2  mrg   // low = -1 - 127 => 0x..ffffff80.
   2396  1.1.1.2  mrg   tree low = fold_build2 (MINUS_EXPR, u128_type, high, UINT128(127));
   2397  1.1.1.2  mrg   r1 = int_range<1> (low, high); // [0x..ffffff80, 0x..ffffffff]
   2398  1.1.1.2  mrg   // r0 = [0,127][0x..ffffff80,0x..fffffff].
   2399  1.1.1.2  mrg   r0.union_ (r1);
   2400  1.1.1.2  mrg   // r1 = [128, 0x..ffffff7f].
   2401  1.1.1.2  mrg   r1 = int_range<1> (UINT128(128),
   2402  1.1.1.2  mrg 		     fold_build2 (MINUS_EXPR, u128_type,
   2403  1.1.1.2  mrg 				  build_minus_one_cst (u128_type),
   2404  1.1.1.2  mrg 				  UINT128(128)));
   2405  1.1.1.2  mrg   r0.invert ();
   2406  1.1.1.2  mrg   ASSERT_TRUE (r0 == r1);
   2407  1.1.1.2  mrg 
   2408  1.1.1.2  mrg   r0.set_varying (integer_type_node);
   2409  1.1.1.2  mrg   tree minint = wide_int_to_tree (integer_type_node, r0.lower_bound ());
   2410  1.1.1.2  mrg   tree maxint = wide_int_to_tree (integer_type_node, r0.upper_bound ());
   2411  1.1.1.2  mrg 
   2412  1.1.1.2  mrg   r0.set_varying (short_integer_type_node);
   2413  1.1.1.2  mrg 
   2414  1.1.1.2  mrg   r0.set_varying (unsigned_type_node);
   2415  1.1.1.2  mrg   tree maxuint = wide_int_to_tree (unsigned_type_node, r0.upper_bound ());
   2416  1.1.1.2  mrg 
   2417  1.1.1.2  mrg   // Check that ~[0,5] => [6,MAX] for unsigned int.
   2418  1.1.1.2  mrg   r0 = int_range<1> (UINT (0), UINT (5));
   2419  1.1.1.2  mrg   r0.invert ();
   2420  1.1.1.2  mrg   ASSERT_TRUE (r0 == int_range<1> (UINT(6), maxuint));
   2421  1.1.1.2  mrg 
   2422  1.1.1.2  mrg   // Check that ~[10,MAX] => [0,9] for unsigned int.
   2423  1.1.1.2  mrg   r0 = int_range<1> (UINT(10), maxuint);
   2424  1.1.1.2  mrg   r0.invert ();
   2425  1.1.1.2  mrg   ASSERT_TRUE (r0 == int_range<1> (UINT (0), UINT (9)));
   2426  1.1.1.2  mrg 
   2427  1.1.1.2  mrg   // Check that ~[0,5] => [6,MAX] for unsigned 128-bit numbers.
   2428  1.1.1.2  mrg   r0 = int_range<1> (UINT128 (0), UINT128 (5), VR_ANTI_RANGE);
   2429  1.1.1.2  mrg   r1 = int_range<1> (UINT128(6), build_minus_one_cst (u128_type));
   2430  1.1.1.2  mrg   ASSERT_TRUE (r0 == r1);
   2431  1.1.1.2  mrg 
   2432  1.1.1.2  mrg   // Check that [~5] is really [-MIN,4][6,MAX].
   2433  1.1.1.2  mrg   r0 = int_range<1> (INT (5), INT (5), VR_ANTI_RANGE);
   2434  1.1.1.2  mrg   r1 = int_range<1> (minint, INT (4));
   2435  1.1.1.2  mrg   r1.union_ (int_range<1> (INT (6), maxint));
   2436  1.1.1.2  mrg   ASSERT_FALSE (r1.undefined_p ());
   2437  1.1.1.2  mrg   ASSERT_TRUE (r0 == r1);
   2438  1.1.1.2  mrg 
   2439  1.1.1.2  mrg   r1 = int_range<1> (INT (5), INT (5));
   2440  1.1.1.2  mrg   int_range<1> r2 (r1);
   2441  1.1.1.2  mrg   ASSERT_TRUE (r1 == r2);
   2442  1.1.1.2  mrg 
   2443  1.1.1.2  mrg   r1 = int_range<1> (INT (5), INT (10));
   2444  1.1.1.2  mrg 
   2445  1.1.1.2  mrg   r1 = int_range<1> (integer_type_node,
   2446  1.1.1.2  mrg 		     wi::to_wide (INT (5)), wi::to_wide (INT (10)));
   2447  1.1.1.2  mrg   ASSERT_TRUE (r1.contains_p (INT (7)));
   2448  1.1.1.2  mrg 
   2449  1.1.1.2  mrg   r1 = int_range<1> (SCHAR (0), SCHAR (20));
   2450  1.1.1.2  mrg   ASSERT_TRUE (r1.contains_p (SCHAR(15)));
   2451  1.1.1.2  mrg   ASSERT_FALSE (r1.contains_p (SCHAR(300)));
   2452  1.1.1.2  mrg 
   2453  1.1.1.2  mrg   // NOT([10,20]) ==> [-MIN,9][21,MAX].
   2454  1.1.1.2  mrg   r0 = r1 = int_range<1> (INT (10), INT (20));
   2455  1.1.1.2  mrg   r2 = int_range<1> (minint, INT(9));
   2456  1.1.1.2  mrg   r2.union_ (int_range<1> (INT(21), maxint));
   2457  1.1.1.2  mrg   ASSERT_FALSE (r2.undefined_p ());
   2458  1.1.1.2  mrg   r1.invert ();
   2459  1.1.1.2  mrg   ASSERT_TRUE (r1 == r2);
   2460  1.1.1.2  mrg   // Test that NOT(NOT(x)) == x.
   2461  1.1.1.2  mrg   r2.invert ();
   2462  1.1.1.2  mrg   ASSERT_TRUE (r0 == r2);
   2463  1.1.1.2  mrg 
   2464  1.1.1.2  mrg   // Test that booleans and their inverse work as expected.
   2465  1.1.1.2  mrg   r0 = range_zero (boolean_type_node);
   2466  1.1.1.2  mrg   ASSERT_TRUE (r0 == int_range<1> (build_zero_cst (boolean_type_node),
   2467  1.1.1.2  mrg 				   build_zero_cst (boolean_type_node)));
   2468  1.1.1.2  mrg   r0.invert ();
   2469  1.1.1.2  mrg   ASSERT_TRUE (r0 == int_range<1> (build_one_cst (boolean_type_node),
   2470  1.1.1.2  mrg 				   build_one_cst (boolean_type_node)));
   2471  1.1.1.2  mrg 
   2472  1.1.1.2  mrg   // Make sure NULL and non-NULL of pointer types work, and that
   2473  1.1.1.2  mrg   // inverses of them are consistent.
   2474  1.1.1.2  mrg   tree voidp = build_pointer_type (void_type_node);
   2475  1.1.1.2  mrg   r0 = range_zero (voidp);
   2476  1.1.1.2  mrg   r1 = r0;
   2477  1.1.1.2  mrg   r0.invert ();
   2478  1.1.1.2  mrg   r0.invert ();
   2479  1.1.1.2  mrg   ASSERT_TRUE (r0 == r1);
   2480  1.1.1.2  mrg 
   2481  1.1.1.2  mrg   // [10,20] U [15, 30] => [10, 30].
   2482  1.1.1.2  mrg   r0 = int_range<1> (INT (10), INT (20));
   2483  1.1.1.2  mrg   r1 = int_range<1> (INT (15), INT (30));
   2484  1.1.1.2  mrg   r0.union_ (r1);
   2485  1.1.1.2  mrg   ASSERT_TRUE (r0 == int_range<1> (INT (10), INT (30)));
   2486  1.1.1.2  mrg 
   2487  1.1.1.2  mrg   // [15,40] U [] => [15,40].
   2488  1.1.1.2  mrg   r0 = int_range<1> (INT (15), INT (40));
   2489  1.1.1.2  mrg   r1.set_undefined ();
   2490  1.1.1.2  mrg   r0.union_ (r1);
   2491  1.1.1.2  mrg   ASSERT_TRUE (r0 == int_range<1> (INT (15), INT (40)));
   2492  1.1.1.2  mrg 
   2493  1.1.1.2  mrg   // [10,20] U [10,10] => [10,20].
   2494  1.1.1.2  mrg   r0 = int_range<1> (INT (10), INT (20));
   2495  1.1.1.2  mrg   r1 = int_range<1> (INT (10), INT (10));
   2496  1.1.1.2  mrg   r0.union_ (r1);
   2497  1.1.1.2  mrg   ASSERT_TRUE (r0 == int_range<1> (INT (10), INT (20)));
   2498  1.1.1.2  mrg 
   2499  1.1.1.2  mrg   // [10,20] U [9,9] => [9,20].
   2500  1.1.1.2  mrg   r0 = int_range<1> (INT (10), INT (20));
   2501  1.1.1.2  mrg   r1 = int_range<1> (INT (9), INT (9));
   2502  1.1.1.2  mrg   r0.union_ (r1);
   2503  1.1.1.2  mrg   ASSERT_TRUE (r0 == int_range<1> (INT (9), INT (20)));
   2504  1.1.1.2  mrg 
   2505  1.1.1.2  mrg   // [10,20] ^ [15,30] => [15,20].
   2506  1.1.1.2  mrg   r0 = int_range<1> (INT (10), INT (20));
   2507  1.1.1.2  mrg   r1 = int_range<1> (INT (15), INT (30));
   2508  1.1.1.2  mrg   r0.intersect (r1);
   2509  1.1.1.2  mrg   ASSERT_TRUE (r0 == int_range<1> (INT (15), INT (20)));
   2510  1.1.1.2  mrg 
   2511  1.1.1.2  mrg   // Test the internal sanity of wide_int's wrt HWIs.
   2512  1.1.1.2  mrg   ASSERT_TRUE (wi::max_value (TYPE_PRECISION (boolean_type_node),
   2513  1.1.1.2  mrg 			      TYPE_SIGN (boolean_type_node))
   2514  1.1.1.2  mrg 	       == wi::uhwi (1, TYPE_PRECISION (boolean_type_node)));
   2515  1.1.1.2  mrg 
   2516  1.1.1.2  mrg   // Test zero_p().
   2517  1.1.1.2  mrg   r0 = int_range<1> (INT (0), INT (0));
   2518  1.1.1.2  mrg   ASSERT_TRUE (r0.zero_p ());
   2519  1.1.1.2  mrg 
   2520  1.1.1.2  mrg   // Test nonzero_p().
   2521  1.1.1.2  mrg   r0 = int_range<1> (INT (0), INT (0));
   2522  1.1.1.2  mrg   r0.invert ();
   2523  1.1.1.2  mrg   ASSERT_TRUE (r0.nonzero_p ());
   2524  1.1.1.2  mrg 
   2525  1.1.1.2  mrg   // test legacy interaction
   2526  1.1.1.2  mrg   // r0 = ~[1,1]
   2527  1.1.1.2  mrg   r0 = int_range<1> (UINT (1), UINT (1), VR_ANTI_RANGE);
   2528  1.1.1.2  mrg   // r1 = ~[3,3]
   2529  1.1.1.2  mrg   r1 = int_range<1> (UINT (3), UINT (3), VR_ANTI_RANGE);
   2530  1.1.1.2  mrg 
   2531  1.1.1.2  mrg   // vv = [0,0][2,2][4, MAX]
   2532  1.1.1.2  mrg   int_range<3> vv = r0;
   2533  1.1.1.2  mrg   vv.intersect (r1);
   2534  1.1.1.2  mrg 
   2535  1.1.1.2  mrg   ASSERT_TRUE (vv.contains_p (UINT (2)));
   2536  1.1.1.2  mrg   ASSERT_TRUE (vv.num_pairs () == 3);
   2537  1.1.1.2  mrg 
   2538  1.1.1.2  mrg   // create r0 as legacy [1,1]
   2539  1.1.1.2  mrg   r0 = int_range<1> (UINT (1), UINT (1));
   2540  1.1.1.2  mrg   // And union it with  [0,0][2,2][4,MAX] multi range
   2541  1.1.1.2  mrg   r0.union_ (vv);
   2542  1.1.1.2  mrg   // The result should be [0,2][4,MAX], or ~[3,3]  but it must contain 2
   2543  1.1.1.2  mrg   ASSERT_TRUE (r0.contains_p (UINT (2)));
   2544  1.1.1.2  mrg }
   2545  1.1.1.2  mrg 
   2546  1.1.1.2  mrg void
   2547  1.1.1.2  mrg range_tests ()
   2548  1.1.1.2  mrg {
   2549  1.1.1.2  mrg   range_tests_legacy ();
   2550  1.1.1.2  mrg   range_tests_irange3 ();
   2551  1.1.1.2  mrg   range_tests_int_range_max ();
   2552  1.1.1.2  mrg   range_tests_strict_enum ();
   2553  1.1.1.2  mrg   range_tests_misc ();
   2554  1.1.1.2  mrg }
   2555  1.1.1.2  mrg 
   2556  1.1.1.2  mrg } // namespace selftest
   2557  1.1.1.2  mrg 
   2558  1.1.1.2  mrg #endif // CHECKING_P
   2559