1*0bfacb9bSmrg /* Support routines for value ranges.
2*0bfacb9bSmrg    Copyright (C) 2019-2020 Free Software Foundation, Inc.
3*0bfacb9bSmrg 
4*0bfacb9bSmrg This file is part of GCC.
5*0bfacb9bSmrg 
6*0bfacb9bSmrg GCC is free software; you can redistribute it and/or modify
7*0bfacb9bSmrg it under the terms of the GNU General Public License as published by
8*0bfacb9bSmrg the Free Software Foundation; either version 3, or (at your option)
9*0bfacb9bSmrg any later version.
10*0bfacb9bSmrg 
11*0bfacb9bSmrg GCC is distributed in the hope that it will be useful,
12*0bfacb9bSmrg but WITHOUT ANY WARRANTY; without even the implied warranty of
13*0bfacb9bSmrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14*0bfacb9bSmrg GNU General Public License for more details.
15*0bfacb9bSmrg 
16*0bfacb9bSmrg You should have received a copy of the GNU General Public License
17*0bfacb9bSmrg along with GCC; see the file COPYING3.  If not see
18*0bfacb9bSmrg <http://www.gnu.org/licenses/>.  */
19*0bfacb9bSmrg 
20*0bfacb9bSmrg #include "config.h"
21*0bfacb9bSmrg #include "system.h"
22*0bfacb9bSmrg #include "coretypes.h"
23*0bfacb9bSmrg #include "backend.h"
24*0bfacb9bSmrg #include "tree.h"
25*0bfacb9bSmrg #include "gimple.h"
26*0bfacb9bSmrg #include "ssa.h"
27*0bfacb9bSmrg #include "tree-pretty-print.h"
28*0bfacb9bSmrg #include "fold-const.h"
29*0bfacb9bSmrg 
value_range(tree min,tree max,value_range_kind kind)30*0bfacb9bSmrg value_range::value_range (tree min, tree max, value_range_kind kind)
31*0bfacb9bSmrg {
32*0bfacb9bSmrg   set (min, max, kind);
33*0bfacb9bSmrg }
34*0bfacb9bSmrg 
value_range(tree type)35*0bfacb9bSmrg value_range::value_range (tree type)
36*0bfacb9bSmrg {
37*0bfacb9bSmrg   set_varying (type);
38*0bfacb9bSmrg }
39*0bfacb9bSmrg 
value_range(tree type,const wide_int & wmin,const wide_int & wmax,enum value_range_kind kind)40*0bfacb9bSmrg value_range::value_range (tree type,
41*0bfacb9bSmrg 			  const wide_int &wmin, const wide_int &wmax,
42*0bfacb9bSmrg 			  enum value_range_kind kind)
43*0bfacb9bSmrg {
44*0bfacb9bSmrg   tree min = wide_int_to_tree (type, wmin);
45*0bfacb9bSmrg   tree max = wide_int_to_tree (type, wmax);
46*0bfacb9bSmrg   gcc_checking_assert (kind == VR_RANGE || kind == VR_ANTI_RANGE);
47*0bfacb9bSmrg   set (min, max, kind);
48*0bfacb9bSmrg }
49*0bfacb9bSmrg 
50*0bfacb9bSmrg void
set_undefined()51*0bfacb9bSmrg value_range::set_undefined ()
52*0bfacb9bSmrg {
53*0bfacb9bSmrg   m_kind = VR_UNDEFINED;
54*0bfacb9bSmrg   m_min = m_max = NULL;
55*0bfacb9bSmrg }
56*0bfacb9bSmrg 
57*0bfacb9bSmrg void
set_varying(tree type)58*0bfacb9bSmrg value_range::set_varying (tree type)
59*0bfacb9bSmrg {
60*0bfacb9bSmrg   m_kind = VR_VARYING;
61*0bfacb9bSmrg   if (supports_type_p (type))
62*0bfacb9bSmrg     {
63*0bfacb9bSmrg       m_min = vrp_val_min (type);
64*0bfacb9bSmrg       m_max = vrp_val_max (type);
65*0bfacb9bSmrg     }
66*0bfacb9bSmrg   else
67*0bfacb9bSmrg     /* We can't do anything range-wise with these types.  */
68*0bfacb9bSmrg     m_min = m_max = error_mark_node;
69*0bfacb9bSmrg }
70*0bfacb9bSmrg 
71*0bfacb9bSmrg /* Set value range to the canonical form of {VRTYPE, MIN, MAX, EQUIV}.
72*0bfacb9bSmrg    This means adjusting VRTYPE, MIN and MAX representing the case of a
73*0bfacb9bSmrg    wrapping range with MAX < MIN covering [MIN, type_max] U [type_min, MAX]
74*0bfacb9bSmrg    as anti-rage ~[MAX+1, MIN-1].  Likewise for wrapping anti-ranges.
75*0bfacb9bSmrg    In corner cases where MAX+1 or MIN-1 wraps this will fall back
76*0bfacb9bSmrg    to varying.
77*0bfacb9bSmrg    This routine exists to ease canonicalization in the case where we
78*0bfacb9bSmrg    extract ranges from var + CST op limit.  */
79*0bfacb9bSmrg 
80*0bfacb9bSmrg void
set(tree min,tree max,value_range_kind kind)81*0bfacb9bSmrg value_range::set (tree min, tree max, value_range_kind kind)
82*0bfacb9bSmrg {
83*0bfacb9bSmrg   /* Use the canonical setters for VR_UNDEFINED and VR_VARYING.  */
84*0bfacb9bSmrg   if (kind == VR_UNDEFINED)
85*0bfacb9bSmrg     {
86*0bfacb9bSmrg       set_undefined ();
87*0bfacb9bSmrg       return;
88*0bfacb9bSmrg     }
89*0bfacb9bSmrg 
90*0bfacb9bSmrg   if (kind != VR_VARYING
91*0bfacb9bSmrg       && (POLY_INT_CST_P (min) || POLY_INT_CST_P (max)))
92*0bfacb9bSmrg     {
93*0bfacb9bSmrg       tree typ = TREE_TYPE (min);
94*0bfacb9bSmrg       gcc_checking_assert (useless_type_conversion_p (typ, TREE_TYPE (max)));
95*0bfacb9bSmrg       set_varying (typ);
96*0bfacb9bSmrg       return;
97*0bfacb9bSmrg     }
98*0bfacb9bSmrg 
99*0bfacb9bSmrg   if (kind == VR_VARYING)
100*0bfacb9bSmrg     {
101*0bfacb9bSmrg       gcc_assert (TREE_TYPE (min) == TREE_TYPE (max));
102*0bfacb9bSmrg       tree typ = TREE_TYPE (min);
103*0bfacb9bSmrg       if (supports_type_p (typ))
104*0bfacb9bSmrg 	{
105*0bfacb9bSmrg 	  gcc_assert (vrp_val_min (typ));
106*0bfacb9bSmrg 	  gcc_assert (vrp_val_max (typ));
107*0bfacb9bSmrg 	}
108*0bfacb9bSmrg       set_varying (typ);
109*0bfacb9bSmrg       return;
110*0bfacb9bSmrg     }
111*0bfacb9bSmrg 
112*0bfacb9bSmrg   /* Nothing to canonicalize for symbolic ranges.  */
113*0bfacb9bSmrg   if (TREE_CODE (min) != INTEGER_CST
114*0bfacb9bSmrg       || TREE_CODE (max) != INTEGER_CST)
115*0bfacb9bSmrg     {
116*0bfacb9bSmrg       m_kind = kind;
117*0bfacb9bSmrg       m_min = min;
118*0bfacb9bSmrg       m_max = max;
119*0bfacb9bSmrg       return;
120*0bfacb9bSmrg     }
121*0bfacb9bSmrg 
122*0bfacb9bSmrg   /* Wrong order for min and max, to swap them and the VR type we need
123*0bfacb9bSmrg      to adjust them.  */
124*0bfacb9bSmrg   if (tree_int_cst_lt (max, min))
125*0bfacb9bSmrg     {
126*0bfacb9bSmrg       tree one, tmp;
127*0bfacb9bSmrg 
128*0bfacb9bSmrg       /* For one bit precision if max < min, then the swapped
129*0bfacb9bSmrg 	 range covers all values, so for VR_RANGE it is varying and
130*0bfacb9bSmrg 	 for VR_ANTI_RANGE empty range, so drop to varying as well.  */
131*0bfacb9bSmrg       if (TYPE_PRECISION (TREE_TYPE (min)) == 1)
132*0bfacb9bSmrg 	{
133*0bfacb9bSmrg 	  set_varying (TREE_TYPE (min));
134*0bfacb9bSmrg 	  return;
135*0bfacb9bSmrg 	}
136*0bfacb9bSmrg 
137*0bfacb9bSmrg       one = build_int_cst (TREE_TYPE (min), 1);
138*0bfacb9bSmrg       tmp = int_const_binop (PLUS_EXPR, max, one);
139*0bfacb9bSmrg       max = int_const_binop (MINUS_EXPR, min, one);
140*0bfacb9bSmrg       min = tmp;
141*0bfacb9bSmrg 
142*0bfacb9bSmrg       /* There's one corner case, if we had [C+1, C] before we now have
143*0bfacb9bSmrg 	 that again.  But this represents an empty value range, so drop
144*0bfacb9bSmrg 	 to varying in this case.  */
145*0bfacb9bSmrg       if (tree_int_cst_lt (max, min))
146*0bfacb9bSmrg 	{
147*0bfacb9bSmrg 	  set_varying (TREE_TYPE (min));
148*0bfacb9bSmrg 	  return;
149*0bfacb9bSmrg 	}
150*0bfacb9bSmrg 
151*0bfacb9bSmrg       kind = kind == VR_RANGE ? VR_ANTI_RANGE : VR_RANGE;
152*0bfacb9bSmrg     }
153*0bfacb9bSmrg 
154*0bfacb9bSmrg   tree type = TREE_TYPE (min);
155*0bfacb9bSmrg 
156*0bfacb9bSmrg   /* Anti-ranges that can be represented as ranges should be so.  */
157*0bfacb9bSmrg   if (kind == VR_ANTI_RANGE)
158*0bfacb9bSmrg     {
159*0bfacb9bSmrg       /* For -fstrict-enums we may receive out-of-range ranges so consider
160*0bfacb9bSmrg          values < -INF and values > INF as -INF/INF as well.  */
161*0bfacb9bSmrg       bool is_min = vrp_val_is_min (min);
162*0bfacb9bSmrg       bool is_max = vrp_val_is_max (max);
163*0bfacb9bSmrg 
164*0bfacb9bSmrg       if (is_min && is_max)
165*0bfacb9bSmrg 	{
166*0bfacb9bSmrg 	  /* We cannot deal with empty ranges, drop to varying.
167*0bfacb9bSmrg 	     ???  This could be VR_UNDEFINED instead.  */
168*0bfacb9bSmrg 	  set_varying (type);
169*0bfacb9bSmrg 	  return;
170*0bfacb9bSmrg 	}
171*0bfacb9bSmrg       else if (TYPE_PRECISION (TREE_TYPE (min)) == 1
172*0bfacb9bSmrg 	       && (is_min || is_max))
173*0bfacb9bSmrg 	{
174*0bfacb9bSmrg 	  /* Non-empty boolean ranges can always be represented
175*0bfacb9bSmrg 	     as a singleton range.  */
176*0bfacb9bSmrg 	  if (is_min)
177*0bfacb9bSmrg 	    min = max = vrp_val_max (TREE_TYPE (min));
178*0bfacb9bSmrg 	  else
179*0bfacb9bSmrg 	    min = max = vrp_val_min (TREE_TYPE (min));
180*0bfacb9bSmrg 	  kind = VR_RANGE;
181*0bfacb9bSmrg 	}
182*0bfacb9bSmrg       else if (is_min)
183*0bfacb9bSmrg         {
184*0bfacb9bSmrg 	  tree one = build_int_cst (TREE_TYPE (max), 1);
185*0bfacb9bSmrg 	  min = int_const_binop (PLUS_EXPR, max, one);
186*0bfacb9bSmrg 	  max = vrp_val_max (TREE_TYPE (max));
187*0bfacb9bSmrg 	  kind = VR_RANGE;
188*0bfacb9bSmrg         }
189*0bfacb9bSmrg       else if (is_max)
190*0bfacb9bSmrg         {
191*0bfacb9bSmrg 	  tree one = build_int_cst (TREE_TYPE (min), 1);
192*0bfacb9bSmrg 	  max = int_const_binop (MINUS_EXPR, min, one);
193*0bfacb9bSmrg 	  min = vrp_val_min (TREE_TYPE (min));
194*0bfacb9bSmrg 	  kind = VR_RANGE;
195*0bfacb9bSmrg         }
196*0bfacb9bSmrg     }
197*0bfacb9bSmrg 
198*0bfacb9bSmrg   /* Normalize [MIN, MAX] into VARYING and ~[MIN, MAX] into UNDEFINED.
199*0bfacb9bSmrg 
200*0bfacb9bSmrg      Avoid using TYPE_{MIN,MAX}_VALUE because -fstrict-enums can
201*0bfacb9bSmrg      restrict those to a subset of what actually fits in the type.
202*0bfacb9bSmrg      Instead use the extremes of the type precision which will allow
203*0bfacb9bSmrg      compare_range_with_value() to check if a value is inside a range,
204*0bfacb9bSmrg      whereas if we used TYPE_*_VAL, said function would just punt
205*0bfacb9bSmrg      upon seeing a VARYING.  */
206*0bfacb9bSmrg   unsigned prec = TYPE_PRECISION (type);
207*0bfacb9bSmrg   signop sign = TYPE_SIGN (type);
208*0bfacb9bSmrg   if (wi::eq_p (wi::to_wide (min), wi::min_value (prec, sign))
209*0bfacb9bSmrg       && wi::eq_p (wi::to_wide (max), wi::max_value (prec, sign)))
210*0bfacb9bSmrg     {
211*0bfacb9bSmrg       if (kind == VR_RANGE)
212*0bfacb9bSmrg 	set_varying (type);
213*0bfacb9bSmrg       else if (kind == VR_ANTI_RANGE)
214*0bfacb9bSmrg 	set_undefined ();
215*0bfacb9bSmrg       else
216*0bfacb9bSmrg 	gcc_unreachable ();
217*0bfacb9bSmrg       return;
218*0bfacb9bSmrg     }
219*0bfacb9bSmrg 
220*0bfacb9bSmrg   /* Do not drop [-INF(OVF), +INF(OVF)] to varying.  (OVF) has to be sticky
221*0bfacb9bSmrg      to make sure VRP iteration terminates, otherwise we can get into
222*0bfacb9bSmrg      oscillations.  */
223*0bfacb9bSmrg 
224*0bfacb9bSmrg   m_kind = kind;
225*0bfacb9bSmrg   m_min = min;
226*0bfacb9bSmrg   m_max = max;
227*0bfacb9bSmrg   if (flag_checking)
228*0bfacb9bSmrg     check ();
229*0bfacb9bSmrg }
230*0bfacb9bSmrg 
231*0bfacb9bSmrg void
set(tree val)232*0bfacb9bSmrg value_range::set (tree val)
233*0bfacb9bSmrg {
234*0bfacb9bSmrg   gcc_assert (TREE_CODE (val) == SSA_NAME || is_gimple_min_invariant (val));
235*0bfacb9bSmrg   if (TREE_OVERFLOW_P (val))
236*0bfacb9bSmrg     val = drop_tree_overflow (val);
237*0bfacb9bSmrg   set (val, val);
238*0bfacb9bSmrg }
239*0bfacb9bSmrg 
240*0bfacb9bSmrg /* Set value range VR to a nonzero range of type TYPE.  */
241*0bfacb9bSmrg 
242*0bfacb9bSmrg void
set_nonzero(tree type)243*0bfacb9bSmrg value_range::set_nonzero (tree type)
244*0bfacb9bSmrg {
245*0bfacb9bSmrg   tree zero = build_int_cst (type, 0);
246*0bfacb9bSmrg   set (zero, zero, VR_ANTI_RANGE);
247*0bfacb9bSmrg }
248*0bfacb9bSmrg 
249*0bfacb9bSmrg /* Set value range VR to a ZERO range of type TYPE.  */
250*0bfacb9bSmrg 
251*0bfacb9bSmrg void
set_zero(tree type)252*0bfacb9bSmrg value_range::set_zero (tree type)
253*0bfacb9bSmrg {
254*0bfacb9bSmrg   set (build_int_cst (type, 0));
255*0bfacb9bSmrg }
256*0bfacb9bSmrg 
257*0bfacb9bSmrg /* Check the validity of the range.  */
258*0bfacb9bSmrg 
259*0bfacb9bSmrg void
check()260*0bfacb9bSmrg value_range::check ()
261*0bfacb9bSmrg {
262*0bfacb9bSmrg   switch (m_kind)
263*0bfacb9bSmrg     {
264*0bfacb9bSmrg     case VR_RANGE:
265*0bfacb9bSmrg     case VR_ANTI_RANGE:
266*0bfacb9bSmrg       {
267*0bfacb9bSmrg 	gcc_assert (m_min && m_max);
268*0bfacb9bSmrg 	gcc_assert (!TREE_OVERFLOW_P (m_min) && !TREE_OVERFLOW_P (m_max));
269*0bfacb9bSmrg 
270*0bfacb9bSmrg 	/* Creating ~[-MIN, +MAX] is stupid because that would be
271*0bfacb9bSmrg 	   the empty set.  */
272*0bfacb9bSmrg 	if (INTEGRAL_TYPE_P (TREE_TYPE (m_min)) && m_kind == VR_ANTI_RANGE)
273*0bfacb9bSmrg 	  gcc_assert (!vrp_val_is_min (m_min) || !vrp_val_is_max (m_max));
274*0bfacb9bSmrg 
275*0bfacb9bSmrg 	int cmp = compare_values (m_min, m_max);
276*0bfacb9bSmrg 	gcc_assert (cmp == 0 || cmp == -1 || cmp == -2);
277*0bfacb9bSmrg 	break;
278*0bfacb9bSmrg       }
279*0bfacb9bSmrg     case VR_UNDEFINED:
280*0bfacb9bSmrg       gcc_assert (!min () && !max ());
281*0bfacb9bSmrg       break;
282*0bfacb9bSmrg     case VR_VARYING:
283*0bfacb9bSmrg       gcc_assert (m_min && m_max);
284*0bfacb9bSmrg       break;
285*0bfacb9bSmrg     default:
286*0bfacb9bSmrg       gcc_unreachable ();
287*0bfacb9bSmrg     }
288*0bfacb9bSmrg }
289*0bfacb9bSmrg 
290*0bfacb9bSmrg /* Return the number of sub-ranges in a range.  */
291*0bfacb9bSmrg 
292*0bfacb9bSmrg unsigned
num_pairs() const293*0bfacb9bSmrg value_range::num_pairs () const
294*0bfacb9bSmrg {
295*0bfacb9bSmrg   if (undefined_p ())
296*0bfacb9bSmrg     return 0;
297*0bfacb9bSmrg   if (varying_p ())
298*0bfacb9bSmrg     return 1;
299*0bfacb9bSmrg   if (symbolic_p ())
300*0bfacb9bSmrg     {
301*0bfacb9bSmrg       value_range numeric_range (*this);
302*0bfacb9bSmrg       numeric_range.normalize_symbolics ();
303*0bfacb9bSmrg       return numeric_range.num_pairs ();
304*0bfacb9bSmrg     }
305*0bfacb9bSmrg   if (m_kind == VR_ANTI_RANGE)
306*0bfacb9bSmrg     {
307*0bfacb9bSmrg       // ~[MIN, X] has one sub-range of [X+1, MAX], and
308*0bfacb9bSmrg       // ~[X, MAX] has one sub-range of [MIN, X-1].
309*0bfacb9bSmrg       if (vrp_val_is_min (m_min) || vrp_val_is_max (m_max))
310*0bfacb9bSmrg 	return 1;
311*0bfacb9bSmrg       return 2;
312*0bfacb9bSmrg     }
313*0bfacb9bSmrg   return 1;
314*0bfacb9bSmrg }
315*0bfacb9bSmrg 
316*0bfacb9bSmrg /* Return the lower bound for a sub-range.  PAIR is the sub-range in
317*0bfacb9bSmrg    question.  */
318*0bfacb9bSmrg 
319*0bfacb9bSmrg wide_int
lower_bound(unsigned pair) const320*0bfacb9bSmrg value_range::lower_bound (unsigned pair) const
321*0bfacb9bSmrg {
322*0bfacb9bSmrg   if (symbolic_p ())
323*0bfacb9bSmrg     {
324*0bfacb9bSmrg       value_range numeric_range (*this);
325*0bfacb9bSmrg       numeric_range.normalize_symbolics ();
326*0bfacb9bSmrg       return numeric_range.lower_bound (pair);
327*0bfacb9bSmrg     }
328*0bfacb9bSmrg 
329*0bfacb9bSmrg   gcc_checking_assert (!undefined_p ());
330*0bfacb9bSmrg   gcc_checking_assert (pair + 1 <= num_pairs ());
331*0bfacb9bSmrg   tree t = NULL;
332*0bfacb9bSmrg   if (m_kind == VR_ANTI_RANGE)
333*0bfacb9bSmrg     {
334*0bfacb9bSmrg       tree typ = type ();
335*0bfacb9bSmrg       if (pair == 1 || vrp_val_is_min (m_min))
336*0bfacb9bSmrg 	t = wide_int_to_tree (typ, wi::to_wide (m_max) + 1);
337*0bfacb9bSmrg       else
338*0bfacb9bSmrg 	t = vrp_val_min (typ);
339*0bfacb9bSmrg     }
340*0bfacb9bSmrg   else
341*0bfacb9bSmrg     t = m_min;
342*0bfacb9bSmrg   return wi::to_wide (t);
343*0bfacb9bSmrg }
344*0bfacb9bSmrg 
345*0bfacb9bSmrg /* Return the upper bound for a sub-range.  PAIR is the sub-range in
346*0bfacb9bSmrg    question.  */
347*0bfacb9bSmrg 
348*0bfacb9bSmrg wide_int
upper_bound(unsigned pair) const349*0bfacb9bSmrg value_range::upper_bound (unsigned pair) const
350*0bfacb9bSmrg {
351*0bfacb9bSmrg   if (symbolic_p ())
352*0bfacb9bSmrg     {
353*0bfacb9bSmrg       value_range numeric_range (*this);
354*0bfacb9bSmrg       numeric_range.normalize_symbolics ();
355*0bfacb9bSmrg       return numeric_range.upper_bound (pair);
356*0bfacb9bSmrg     }
357*0bfacb9bSmrg 
358*0bfacb9bSmrg   gcc_checking_assert (!undefined_p ());
359*0bfacb9bSmrg   gcc_checking_assert (pair + 1 <= num_pairs ());
360*0bfacb9bSmrg   tree t = NULL;
361*0bfacb9bSmrg   if (m_kind == VR_ANTI_RANGE)
362*0bfacb9bSmrg     {
363*0bfacb9bSmrg       tree typ = type ();
364*0bfacb9bSmrg       if (pair == 1 || vrp_val_is_min (m_min))
365*0bfacb9bSmrg 	t = vrp_val_max (typ);
366*0bfacb9bSmrg       else
367*0bfacb9bSmrg 	t = wide_int_to_tree (typ, wi::to_wide (m_min) - 1);
368*0bfacb9bSmrg     }
369*0bfacb9bSmrg   else
370*0bfacb9bSmrg     t = m_max;
371*0bfacb9bSmrg   return wi::to_wide (t);
372*0bfacb9bSmrg }
373*0bfacb9bSmrg 
374*0bfacb9bSmrg /* Return the highest bound in a range.  */
375*0bfacb9bSmrg 
376*0bfacb9bSmrg wide_int
upper_bound() const377*0bfacb9bSmrg value_range::upper_bound () const
378*0bfacb9bSmrg {
379*0bfacb9bSmrg   unsigned pairs = num_pairs ();
380*0bfacb9bSmrg   gcc_checking_assert (pairs > 0);
381*0bfacb9bSmrg   return upper_bound (pairs - 1);
382*0bfacb9bSmrg }
383*0bfacb9bSmrg 
384*0bfacb9bSmrg bool
equal_p(const value_range & other) const385*0bfacb9bSmrg value_range::equal_p (const value_range &other) const
386*0bfacb9bSmrg {
387*0bfacb9bSmrg   /* Ignore types for undefined.  All undefines are equal.  */
388*0bfacb9bSmrg   if (undefined_p ())
389*0bfacb9bSmrg     return m_kind == other.m_kind;
390*0bfacb9bSmrg 
391*0bfacb9bSmrg   return (m_kind == other.m_kind
392*0bfacb9bSmrg 	  && vrp_operand_equal_p (m_min, other.m_min)
393*0bfacb9bSmrg 	  && vrp_operand_equal_p (m_max, other.m_max));
394*0bfacb9bSmrg }
395*0bfacb9bSmrg 
396*0bfacb9bSmrg bool
operator ==(const value_range & r) const397*0bfacb9bSmrg value_range::operator== (const value_range &r) const
398*0bfacb9bSmrg {
399*0bfacb9bSmrg   return equal_p (r);
400*0bfacb9bSmrg }
401*0bfacb9bSmrg 
402*0bfacb9bSmrg /* If range is a singleton, place it in RESULT and return TRUE.
403*0bfacb9bSmrg    Note: A singleton can be any gimple invariant, not just constants.
404*0bfacb9bSmrg    So, [&x, &x] counts as a singleton.  */
405*0bfacb9bSmrg /* Return TRUE if this is a symbolic range.  */
406*0bfacb9bSmrg 
407*0bfacb9bSmrg bool
symbolic_p() const408*0bfacb9bSmrg value_range::symbolic_p () const
409*0bfacb9bSmrg {
410*0bfacb9bSmrg   return (!varying_p ()
411*0bfacb9bSmrg 	  && !undefined_p ()
412*0bfacb9bSmrg 	  && (!is_gimple_min_invariant (m_min)
413*0bfacb9bSmrg 	      || !is_gimple_min_invariant (m_max)));
414*0bfacb9bSmrg }
415*0bfacb9bSmrg 
416*0bfacb9bSmrg /* NOTE: This is not the inverse of symbolic_p because the range
417*0bfacb9bSmrg    could also be varying or undefined.  Ideally they should be inverse
418*0bfacb9bSmrg    of each other, with varying only applying to symbolics.  Varying of
419*0bfacb9bSmrg    constants would be represented as [-MIN, +MAX].  */
420*0bfacb9bSmrg 
421*0bfacb9bSmrg bool
constant_p() const422*0bfacb9bSmrg value_range::constant_p () const
423*0bfacb9bSmrg {
424*0bfacb9bSmrg   return (!varying_p ()
425*0bfacb9bSmrg 	  && !undefined_p ()
426*0bfacb9bSmrg 	  && TREE_CODE (m_min) == INTEGER_CST
427*0bfacb9bSmrg 	  && TREE_CODE (m_max) == INTEGER_CST);
428*0bfacb9bSmrg }
429*0bfacb9bSmrg 
430*0bfacb9bSmrg bool
singleton_p(tree * result) const431*0bfacb9bSmrg value_range::singleton_p (tree *result) const
432*0bfacb9bSmrg {
433*0bfacb9bSmrg   if (m_kind == VR_ANTI_RANGE)
434*0bfacb9bSmrg     {
435*0bfacb9bSmrg       if (nonzero_p ())
436*0bfacb9bSmrg 	{
437*0bfacb9bSmrg 	  if (TYPE_PRECISION (type ()) == 1)
438*0bfacb9bSmrg 	    {
439*0bfacb9bSmrg 	      if (result)
440*0bfacb9bSmrg 		*result = m_max;
441*0bfacb9bSmrg 	      return true;
442*0bfacb9bSmrg 	    }
443*0bfacb9bSmrg 	  return false;
444*0bfacb9bSmrg 	}
445*0bfacb9bSmrg       if (num_pairs () == 1)
446*0bfacb9bSmrg 	{
447*0bfacb9bSmrg 	  value_range vr0, vr1;
448*0bfacb9bSmrg 	  ranges_from_anti_range (this, &vr0, &vr1);
449*0bfacb9bSmrg 	  return vr0.singleton_p (result);
450*0bfacb9bSmrg 	}
451*0bfacb9bSmrg     }
452*0bfacb9bSmrg   if (m_kind == VR_RANGE
453*0bfacb9bSmrg       && vrp_operand_equal_p (min (), max ())
454*0bfacb9bSmrg       && is_gimple_min_invariant (min ()))
455*0bfacb9bSmrg     {
456*0bfacb9bSmrg       if (result)
457*0bfacb9bSmrg         *result = min ();
458*0bfacb9bSmrg       return true;
459*0bfacb9bSmrg     }
460*0bfacb9bSmrg   return false;
461*0bfacb9bSmrg }
462*0bfacb9bSmrg 
463*0bfacb9bSmrg /* Return 1 if VAL is inside value range.
464*0bfacb9bSmrg           0 if VAL is not inside value range.
465*0bfacb9bSmrg 	 -2 if we cannot tell either way.
466*0bfacb9bSmrg 
467*0bfacb9bSmrg    Benchmark compile/20001226-1.c compilation time after changing this
468*0bfacb9bSmrg    function.  */
469*0bfacb9bSmrg 
470*0bfacb9bSmrg int
value_inside_range(tree val) const471*0bfacb9bSmrg value_range::value_inside_range (tree val) const
472*0bfacb9bSmrg {
473*0bfacb9bSmrg   int cmp1, cmp2;
474*0bfacb9bSmrg 
475*0bfacb9bSmrg   if (varying_p ())
476*0bfacb9bSmrg     return 1;
477*0bfacb9bSmrg 
478*0bfacb9bSmrg   if (undefined_p ())
479*0bfacb9bSmrg     return 0;
480*0bfacb9bSmrg 
481*0bfacb9bSmrg   cmp1 = operand_less_p (val, m_min);
482*0bfacb9bSmrg   if (cmp1 == -2)
483*0bfacb9bSmrg     return -2;
484*0bfacb9bSmrg   if (cmp1 == 1)
485*0bfacb9bSmrg     return m_kind != VR_RANGE;
486*0bfacb9bSmrg 
487*0bfacb9bSmrg   cmp2 = operand_less_p (m_max, val);
488*0bfacb9bSmrg   if (cmp2 == -2)
489*0bfacb9bSmrg     return -2;
490*0bfacb9bSmrg 
491*0bfacb9bSmrg   if (m_kind == VR_RANGE)
492*0bfacb9bSmrg     return !cmp2;
493*0bfacb9bSmrg   else
494*0bfacb9bSmrg     return !!cmp2;
495*0bfacb9bSmrg }
496*0bfacb9bSmrg 
497*0bfacb9bSmrg /* Return TRUE if it is possible that range contains VAL.  */
498*0bfacb9bSmrg 
499*0bfacb9bSmrg bool
may_contain_p(tree val) const500*0bfacb9bSmrg value_range::may_contain_p (tree val) const
501*0bfacb9bSmrg {
502*0bfacb9bSmrg   return value_inside_range (val) != 0;
503*0bfacb9bSmrg }
504*0bfacb9bSmrg 
505*0bfacb9bSmrg /* Return TRUE if range contains INTEGER_CST.  */
506*0bfacb9bSmrg 
507*0bfacb9bSmrg bool
contains_p(tree cst) const508*0bfacb9bSmrg value_range::contains_p (tree cst) const
509*0bfacb9bSmrg {
510*0bfacb9bSmrg   gcc_checking_assert (TREE_CODE (cst) == INTEGER_CST);
511*0bfacb9bSmrg   if (symbolic_p ())
512*0bfacb9bSmrg     {
513*0bfacb9bSmrg       value_range numeric_range (*this);
514*0bfacb9bSmrg       numeric_range.normalize_symbolics ();
515*0bfacb9bSmrg       return numeric_range.contains_p (cst);
516*0bfacb9bSmrg     }
517*0bfacb9bSmrg   return value_inside_range (cst) == 1;
518*0bfacb9bSmrg }
519*0bfacb9bSmrg 
520*0bfacb9bSmrg /* Normalize addresses into constants.  */
521*0bfacb9bSmrg 
522*0bfacb9bSmrg void
normalize_addresses()523*0bfacb9bSmrg value_range::normalize_addresses ()
524*0bfacb9bSmrg {
525*0bfacb9bSmrg   if (undefined_p ())
526*0bfacb9bSmrg     return;
527*0bfacb9bSmrg 
528*0bfacb9bSmrg   if (!POINTER_TYPE_P (type ()) || range_has_numeric_bounds_p (this))
529*0bfacb9bSmrg     return;
530*0bfacb9bSmrg 
531*0bfacb9bSmrg   if (!range_includes_zero_p (this))
532*0bfacb9bSmrg     {
533*0bfacb9bSmrg       gcc_checking_assert (TREE_CODE (m_min) == ADDR_EXPR
534*0bfacb9bSmrg 			   || TREE_CODE (m_max) == ADDR_EXPR);
535*0bfacb9bSmrg       set_nonzero (type ());
536*0bfacb9bSmrg       return;
537*0bfacb9bSmrg     }
538*0bfacb9bSmrg   set_varying (type ());
539*0bfacb9bSmrg }
540*0bfacb9bSmrg 
541*0bfacb9bSmrg /* Normalize symbolics and addresses into constants.  */
542*0bfacb9bSmrg 
543*0bfacb9bSmrg void
normalize_symbolics()544*0bfacb9bSmrg value_range::normalize_symbolics ()
545*0bfacb9bSmrg {
546*0bfacb9bSmrg   if (varying_p () || undefined_p ())
547*0bfacb9bSmrg     return;
548*0bfacb9bSmrg 
549*0bfacb9bSmrg   tree ttype = type ();
550*0bfacb9bSmrg   bool min_symbolic = !is_gimple_min_invariant (min ());
551*0bfacb9bSmrg   bool max_symbolic = !is_gimple_min_invariant (max ());
552*0bfacb9bSmrg   if (!min_symbolic && !max_symbolic)
553*0bfacb9bSmrg     {
554*0bfacb9bSmrg       normalize_addresses ();
555*0bfacb9bSmrg       return;
556*0bfacb9bSmrg     }
557*0bfacb9bSmrg 
558*0bfacb9bSmrg   // [SYM, SYM] -> VARYING
559*0bfacb9bSmrg   if (min_symbolic && max_symbolic)
560*0bfacb9bSmrg     {
561*0bfacb9bSmrg       set_varying (ttype);
562*0bfacb9bSmrg       return;
563*0bfacb9bSmrg     }
564*0bfacb9bSmrg   if (kind () == VR_RANGE)
565*0bfacb9bSmrg     {
566*0bfacb9bSmrg       // [SYM, NUM] -> [-MIN, NUM]
567*0bfacb9bSmrg       if (min_symbolic)
568*0bfacb9bSmrg 	{
569*0bfacb9bSmrg 	  set (vrp_val_min (ttype), max ());
570*0bfacb9bSmrg 	  return;
571*0bfacb9bSmrg 	}
572*0bfacb9bSmrg       // [NUM, SYM] -> [NUM, +MAX]
573*0bfacb9bSmrg       set (min (), vrp_val_max (ttype));
574*0bfacb9bSmrg       return;
575*0bfacb9bSmrg     }
576*0bfacb9bSmrg   gcc_checking_assert (kind () == VR_ANTI_RANGE);
577*0bfacb9bSmrg   // ~[SYM, NUM] -> [NUM + 1, +MAX]
578*0bfacb9bSmrg   if (min_symbolic)
579*0bfacb9bSmrg     {
580*0bfacb9bSmrg       if (!vrp_val_is_max (max ()))
581*0bfacb9bSmrg 	{
582*0bfacb9bSmrg 	  tree n = wide_int_to_tree (ttype, wi::to_wide (max ()) + 1);
583*0bfacb9bSmrg 	  set (n, vrp_val_max (ttype));
584*0bfacb9bSmrg 	  return;
585*0bfacb9bSmrg 	}
586*0bfacb9bSmrg       set_varying (ttype);
587*0bfacb9bSmrg       return;
588*0bfacb9bSmrg     }
589*0bfacb9bSmrg   // ~[NUM, SYM] -> [-MIN, NUM - 1]
590*0bfacb9bSmrg   if (!vrp_val_is_min (min ()))
591*0bfacb9bSmrg     {
592*0bfacb9bSmrg       tree n = wide_int_to_tree (ttype, wi::to_wide (min ()) - 1);
593*0bfacb9bSmrg       set (vrp_val_min (ttype), n);
594*0bfacb9bSmrg       return;
595*0bfacb9bSmrg     }
596*0bfacb9bSmrg   set_varying (ttype);
597*0bfacb9bSmrg }
598*0bfacb9bSmrg 
599*0bfacb9bSmrg /* Intersect the two value-ranges { *VR0TYPE, *VR0MIN, *VR0MAX } and
600*0bfacb9bSmrg    { VR1TYPE, VR0MIN, VR0MAX } and store the result
601*0bfacb9bSmrg    in { *VR0TYPE, *VR0MIN, *VR0MAX }.  This may not be the smallest
602*0bfacb9bSmrg    possible such range.  The resulting range is not canonicalized.  */
603*0bfacb9bSmrg 
604*0bfacb9bSmrg static void
intersect_ranges(enum value_range_kind * vr0type,tree * vr0min,tree * vr0max,enum value_range_kind vr1type,tree vr1min,tree vr1max)605*0bfacb9bSmrg intersect_ranges (enum value_range_kind *vr0type,
606*0bfacb9bSmrg 		  tree *vr0min, tree *vr0max,
607*0bfacb9bSmrg 		  enum value_range_kind vr1type,
608*0bfacb9bSmrg 		  tree vr1min, tree vr1max)
609*0bfacb9bSmrg {
610*0bfacb9bSmrg   bool mineq = vrp_operand_equal_p (*vr0min, vr1min);
611*0bfacb9bSmrg   bool maxeq = vrp_operand_equal_p (*vr0max, vr1max);
612*0bfacb9bSmrg 
613*0bfacb9bSmrg   /* [] is vr0, () is vr1 in the following classification comments.  */
614*0bfacb9bSmrg   if (mineq && maxeq)
615*0bfacb9bSmrg     {
616*0bfacb9bSmrg       /* [(  )] */
617*0bfacb9bSmrg       if (*vr0type == vr1type)
618*0bfacb9bSmrg 	/* Nothing to do for equal ranges.  */
619*0bfacb9bSmrg 	;
620*0bfacb9bSmrg       else if ((*vr0type == VR_RANGE
621*0bfacb9bSmrg 		&& vr1type == VR_ANTI_RANGE)
622*0bfacb9bSmrg 	       || (*vr0type == VR_ANTI_RANGE
623*0bfacb9bSmrg 		   && vr1type == VR_RANGE))
624*0bfacb9bSmrg 	{
625*0bfacb9bSmrg 	  /* For anti-range with range intersection the result is empty.  */
626*0bfacb9bSmrg 	  *vr0type = VR_UNDEFINED;
627*0bfacb9bSmrg 	  *vr0min = NULL_TREE;
628*0bfacb9bSmrg 	  *vr0max = NULL_TREE;
629*0bfacb9bSmrg 	}
630*0bfacb9bSmrg       else
631*0bfacb9bSmrg 	gcc_unreachable ();
632*0bfacb9bSmrg     }
633*0bfacb9bSmrg   else if (operand_less_p (*vr0max, vr1min) == 1
634*0bfacb9bSmrg 	   || operand_less_p (vr1max, *vr0min) == 1)
635*0bfacb9bSmrg     {
636*0bfacb9bSmrg       /* [ ] ( ) or ( ) [ ]
637*0bfacb9bSmrg 	 If the ranges have an empty intersection, the result of the
638*0bfacb9bSmrg 	 intersect operation is the range for intersecting an
639*0bfacb9bSmrg 	 anti-range with a range or empty when intersecting two ranges.  */
640*0bfacb9bSmrg       if (*vr0type == VR_RANGE
641*0bfacb9bSmrg 	  && vr1type == VR_ANTI_RANGE)
642*0bfacb9bSmrg 	;
643*0bfacb9bSmrg       else if (*vr0type == VR_ANTI_RANGE
644*0bfacb9bSmrg 	       && vr1type == VR_RANGE)
645*0bfacb9bSmrg 	{
646*0bfacb9bSmrg 	  *vr0type = vr1type;
647*0bfacb9bSmrg 	  *vr0min = vr1min;
648*0bfacb9bSmrg 	  *vr0max = vr1max;
649*0bfacb9bSmrg 	}
650*0bfacb9bSmrg       else if (*vr0type == VR_RANGE
651*0bfacb9bSmrg 	       && vr1type == VR_RANGE)
652*0bfacb9bSmrg 	{
653*0bfacb9bSmrg 	  *vr0type = VR_UNDEFINED;
654*0bfacb9bSmrg 	  *vr0min = NULL_TREE;
655*0bfacb9bSmrg 	  *vr0max = NULL_TREE;
656*0bfacb9bSmrg 	}
657*0bfacb9bSmrg       else if (*vr0type == VR_ANTI_RANGE
658*0bfacb9bSmrg 	       && vr1type == VR_ANTI_RANGE)
659*0bfacb9bSmrg 	{
660*0bfacb9bSmrg 	  /* If the anti-ranges are adjacent to each other merge them.  */
661*0bfacb9bSmrg 	  if (TREE_CODE (*vr0max) == INTEGER_CST
662*0bfacb9bSmrg 	      && TREE_CODE (vr1min) == INTEGER_CST
663*0bfacb9bSmrg 	      && operand_less_p (*vr0max, vr1min) == 1
664*0bfacb9bSmrg 	      && integer_onep (int_const_binop (MINUS_EXPR,
665*0bfacb9bSmrg 						vr1min, *vr0max)))
666*0bfacb9bSmrg 	    *vr0max = vr1max;
667*0bfacb9bSmrg 	  else if (TREE_CODE (vr1max) == INTEGER_CST
668*0bfacb9bSmrg 		   && TREE_CODE (*vr0min) == INTEGER_CST
669*0bfacb9bSmrg 		   && operand_less_p (vr1max, *vr0min) == 1
670*0bfacb9bSmrg 		   && integer_onep (int_const_binop (MINUS_EXPR,
671*0bfacb9bSmrg 						     *vr0min, vr1max)))
672*0bfacb9bSmrg 	    *vr0min = vr1min;
673*0bfacb9bSmrg 	  /* Else arbitrarily take VR0.  */
674*0bfacb9bSmrg 	}
675*0bfacb9bSmrg     }
676*0bfacb9bSmrg   else if ((maxeq || operand_less_p (vr1max, *vr0max) == 1)
677*0bfacb9bSmrg 	   && (mineq || operand_less_p (*vr0min, vr1min) == 1))
678*0bfacb9bSmrg     {
679*0bfacb9bSmrg       /* [ (  ) ] or [(  ) ] or [ (  )] */
680*0bfacb9bSmrg       if (*vr0type == VR_RANGE
681*0bfacb9bSmrg 	  && vr1type == VR_RANGE)
682*0bfacb9bSmrg 	{
683*0bfacb9bSmrg 	  /* If both are ranges the result is the inner one.  */
684*0bfacb9bSmrg 	  *vr0type = vr1type;
685*0bfacb9bSmrg 	  *vr0min = vr1min;
686*0bfacb9bSmrg 	  *vr0max = vr1max;
687*0bfacb9bSmrg 	}
688*0bfacb9bSmrg       else if (*vr0type == VR_RANGE
689*0bfacb9bSmrg 	       && vr1type == VR_ANTI_RANGE)
690*0bfacb9bSmrg 	{
691*0bfacb9bSmrg 	  /* Choose the right gap if the left one is empty.  */
692*0bfacb9bSmrg 	  if (mineq)
693*0bfacb9bSmrg 	    {
694*0bfacb9bSmrg 	      if (TREE_CODE (vr1max) != INTEGER_CST)
695*0bfacb9bSmrg 		*vr0min = vr1max;
696*0bfacb9bSmrg 	      else if (TYPE_PRECISION (TREE_TYPE (vr1max)) == 1
697*0bfacb9bSmrg 		       && !TYPE_UNSIGNED (TREE_TYPE (vr1max)))
698*0bfacb9bSmrg 		*vr0min
699*0bfacb9bSmrg 		  = int_const_binop (MINUS_EXPR, vr1max,
700*0bfacb9bSmrg 				     build_int_cst (TREE_TYPE (vr1max), -1));
701*0bfacb9bSmrg 	      else
702*0bfacb9bSmrg 		*vr0min
703*0bfacb9bSmrg 		  = int_const_binop (PLUS_EXPR, vr1max,
704*0bfacb9bSmrg 				     build_int_cst (TREE_TYPE (vr1max), 1));
705*0bfacb9bSmrg 	    }
706*0bfacb9bSmrg 	  /* Choose the left gap if the right one is empty.  */
707*0bfacb9bSmrg 	  else if (maxeq)
708*0bfacb9bSmrg 	    {
709*0bfacb9bSmrg 	      if (TREE_CODE (vr1min) != INTEGER_CST)
710*0bfacb9bSmrg 		*vr0max = vr1min;
711*0bfacb9bSmrg 	      else if (TYPE_PRECISION (TREE_TYPE (vr1min)) == 1
712*0bfacb9bSmrg 		       && !TYPE_UNSIGNED (TREE_TYPE (vr1min)))
713*0bfacb9bSmrg 		*vr0max
714*0bfacb9bSmrg 		  = int_const_binop (PLUS_EXPR, vr1min,
715*0bfacb9bSmrg 				     build_int_cst (TREE_TYPE (vr1min), -1));
716*0bfacb9bSmrg 	      else
717*0bfacb9bSmrg 		*vr0max
718*0bfacb9bSmrg 		  = int_const_binop (MINUS_EXPR, vr1min,
719*0bfacb9bSmrg 				     build_int_cst (TREE_TYPE (vr1min), 1));
720*0bfacb9bSmrg 	    }
721*0bfacb9bSmrg 	  /* Choose the anti-range if the range is effectively varying.  */
722*0bfacb9bSmrg 	  else if (vrp_val_is_min (*vr0min)
723*0bfacb9bSmrg 		   && vrp_val_is_max (*vr0max))
724*0bfacb9bSmrg 	    {
725*0bfacb9bSmrg 	      *vr0type = vr1type;
726*0bfacb9bSmrg 	      *vr0min = vr1min;
727*0bfacb9bSmrg 	      *vr0max = vr1max;
728*0bfacb9bSmrg 	    }
729*0bfacb9bSmrg 	  /* Else choose the range.  */
730*0bfacb9bSmrg 	}
731*0bfacb9bSmrg       else if (*vr0type == VR_ANTI_RANGE
732*0bfacb9bSmrg 	       && vr1type == VR_ANTI_RANGE)
733*0bfacb9bSmrg 	/* If both are anti-ranges the result is the outer one.  */
734*0bfacb9bSmrg 	;
735*0bfacb9bSmrg       else if (*vr0type == VR_ANTI_RANGE
736*0bfacb9bSmrg 	       && vr1type == VR_RANGE)
737*0bfacb9bSmrg 	{
738*0bfacb9bSmrg 	  /* The intersection is empty.  */
739*0bfacb9bSmrg 	  *vr0type = VR_UNDEFINED;
740*0bfacb9bSmrg 	  *vr0min = NULL_TREE;
741*0bfacb9bSmrg 	  *vr0max = NULL_TREE;
742*0bfacb9bSmrg 	}
743*0bfacb9bSmrg       else
744*0bfacb9bSmrg 	gcc_unreachable ();
745*0bfacb9bSmrg     }
746*0bfacb9bSmrg   else if ((maxeq || operand_less_p (*vr0max, vr1max) == 1)
747*0bfacb9bSmrg 	   && (mineq || operand_less_p (vr1min, *vr0min) == 1))
748*0bfacb9bSmrg     {
749*0bfacb9bSmrg       /* ( [  ] ) or ([  ] ) or ( [  ]) */
750*0bfacb9bSmrg       if (*vr0type == VR_RANGE
751*0bfacb9bSmrg 	  && vr1type == VR_RANGE)
752*0bfacb9bSmrg 	/* Choose the inner range.  */
753*0bfacb9bSmrg 	;
754*0bfacb9bSmrg       else if (*vr0type == VR_ANTI_RANGE
755*0bfacb9bSmrg 	       && vr1type == VR_RANGE)
756*0bfacb9bSmrg 	{
757*0bfacb9bSmrg 	  /* Choose the right gap if the left is empty.  */
758*0bfacb9bSmrg 	  if (mineq)
759*0bfacb9bSmrg 	    {
760*0bfacb9bSmrg 	      *vr0type = VR_RANGE;
761*0bfacb9bSmrg 	      if (TREE_CODE (*vr0max) != INTEGER_CST)
762*0bfacb9bSmrg 		*vr0min = *vr0max;
763*0bfacb9bSmrg 	      else if (TYPE_PRECISION (TREE_TYPE (*vr0max)) == 1
764*0bfacb9bSmrg 		       && !TYPE_UNSIGNED (TREE_TYPE (*vr0max)))
765*0bfacb9bSmrg 		*vr0min
766*0bfacb9bSmrg 		  = int_const_binop (MINUS_EXPR, *vr0max,
767*0bfacb9bSmrg 				     build_int_cst (TREE_TYPE (*vr0max), -1));
768*0bfacb9bSmrg 	      else
769*0bfacb9bSmrg 		*vr0min
770*0bfacb9bSmrg 		  = int_const_binop (PLUS_EXPR, *vr0max,
771*0bfacb9bSmrg 				     build_int_cst (TREE_TYPE (*vr0max), 1));
772*0bfacb9bSmrg 	      *vr0max = vr1max;
773*0bfacb9bSmrg 	    }
774*0bfacb9bSmrg 	  /* Choose the left gap if the right is empty.  */
775*0bfacb9bSmrg 	  else if (maxeq)
776*0bfacb9bSmrg 	    {
777*0bfacb9bSmrg 	      *vr0type = VR_RANGE;
778*0bfacb9bSmrg 	      if (TREE_CODE (*vr0min) != INTEGER_CST)
779*0bfacb9bSmrg 		*vr0max = *vr0min;
780*0bfacb9bSmrg 	      else if (TYPE_PRECISION (TREE_TYPE (*vr0min)) == 1
781*0bfacb9bSmrg 		       && !TYPE_UNSIGNED (TREE_TYPE (*vr0min)))
782*0bfacb9bSmrg 		*vr0max
783*0bfacb9bSmrg 		  = int_const_binop (PLUS_EXPR, *vr0min,
784*0bfacb9bSmrg 				     build_int_cst (TREE_TYPE (*vr0min), -1));
785*0bfacb9bSmrg 	      else
786*0bfacb9bSmrg 		*vr0max
787*0bfacb9bSmrg 		  = int_const_binop (MINUS_EXPR, *vr0min,
788*0bfacb9bSmrg 				     build_int_cst (TREE_TYPE (*vr0min), 1));
789*0bfacb9bSmrg 	      *vr0min = vr1min;
790*0bfacb9bSmrg 	    }
791*0bfacb9bSmrg 	  /* Choose the anti-range if the range is effectively varying.  */
792*0bfacb9bSmrg 	  else if (vrp_val_is_min (vr1min)
793*0bfacb9bSmrg 		   && vrp_val_is_max (vr1max))
794*0bfacb9bSmrg 	    ;
795*0bfacb9bSmrg 	  /* Choose the anti-range if it is ~[0,0], that range is special
796*0bfacb9bSmrg 	     enough to special case when vr1's range is relatively wide.
797*0bfacb9bSmrg 	     At least for types bigger than int - this covers pointers
798*0bfacb9bSmrg 	     and arguments to functions like ctz.  */
799*0bfacb9bSmrg 	  else if (*vr0min == *vr0max
800*0bfacb9bSmrg 		   && integer_zerop (*vr0min)
801*0bfacb9bSmrg 		   && ((TYPE_PRECISION (TREE_TYPE (*vr0min))
802*0bfacb9bSmrg 			>= TYPE_PRECISION (integer_type_node))
803*0bfacb9bSmrg 		       || POINTER_TYPE_P (TREE_TYPE (*vr0min)))
804*0bfacb9bSmrg 		   && TREE_CODE (vr1max) == INTEGER_CST
805*0bfacb9bSmrg 		   && TREE_CODE (vr1min) == INTEGER_CST
806*0bfacb9bSmrg 		   && (wi::clz (wi::to_wide (vr1max) - wi::to_wide (vr1min))
807*0bfacb9bSmrg 		       < TYPE_PRECISION (TREE_TYPE (*vr0min)) / 2))
808*0bfacb9bSmrg 	    ;
809*0bfacb9bSmrg 	  /* Else choose the range.  */
810*0bfacb9bSmrg 	  else
811*0bfacb9bSmrg 	    {
812*0bfacb9bSmrg 	      *vr0type = vr1type;
813*0bfacb9bSmrg 	      *vr0min = vr1min;
814*0bfacb9bSmrg 	      *vr0max = vr1max;
815*0bfacb9bSmrg 	    }
816*0bfacb9bSmrg 	}
817*0bfacb9bSmrg       else if (*vr0type == VR_ANTI_RANGE
818*0bfacb9bSmrg 	       && vr1type == VR_ANTI_RANGE)
819*0bfacb9bSmrg 	{
820*0bfacb9bSmrg 	  /* If both are anti-ranges the result is the outer one.  */
821*0bfacb9bSmrg 	  *vr0type = vr1type;
822*0bfacb9bSmrg 	  *vr0min = vr1min;
823*0bfacb9bSmrg 	  *vr0max = vr1max;
824*0bfacb9bSmrg 	}
825*0bfacb9bSmrg       else if (vr1type == VR_ANTI_RANGE
826*0bfacb9bSmrg 	       && *vr0type == VR_RANGE)
827*0bfacb9bSmrg 	{
828*0bfacb9bSmrg 	  /* The intersection is empty.  */
829*0bfacb9bSmrg 	  *vr0type = VR_UNDEFINED;
830*0bfacb9bSmrg 	  *vr0min = NULL_TREE;
831*0bfacb9bSmrg 	  *vr0max = NULL_TREE;
832*0bfacb9bSmrg 	}
833*0bfacb9bSmrg       else
834*0bfacb9bSmrg 	gcc_unreachable ();
835*0bfacb9bSmrg     }
836*0bfacb9bSmrg   else if ((operand_less_p (vr1min, *vr0max) == 1
837*0bfacb9bSmrg 	    || operand_equal_p (vr1min, *vr0max, 0))
838*0bfacb9bSmrg 	   && operand_less_p (*vr0min, vr1min) == 1
839*0bfacb9bSmrg 	   && operand_less_p (*vr0max, vr1max) == 1)
840*0bfacb9bSmrg     {
841*0bfacb9bSmrg       /* [  (  ]  ) or [  ](  ) */
842*0bfacb9bSmrg       if (*vr0type == VR_ANTI_RANGE
843*0bfacb9bSmrg 	  && vr1type == VR_ANTI_RANGE)
844*0bfacb9bSmrg 	*vr0max = vr1max;
845*0bfacb9bSmrg       else if (*vr0type == VR_RANGE
846*0bfacb9bSmrg 	       && vr1type == VR_RANGE)
847*0bfacb9bSmrg 	*vr0min = vr1min;
848*0bfacb9bSmrg       else if (*vr0type == VR_RANGE
849*0bfacb9bSmrg 	       && vr1type == VR_ANTI_RANGE)
850*0bfacb9bSmrg 	{
851*0bfacb9bSmrg 	  if (TREE_CODE (vr1min) == INTEGER_CST)
852*0bfacb9bSmrg 	    *vr0max = int_const_binop (MINUS_EXPR, vr1min,
853*0bfacb9bSmrg 				       build_int_cst (TREE_TYPE (vr1min), 1));
854*0bfacb9bSmrg 	  else
855*0bfacb9bSmrg 	    *vr0max = vr1min;
856*0bfacb9bSmrg 	}
857*0bfacb9bSmrg       else if (*vr0type == VR_ANTI_RANGE
858*0bfacb9bSmrg 	       && vr1type == VR_RANGE)
859*0bfacb9bSmrg 	{
860*0bfacb9bSmrg 	  *vr0type = VR_RANGE;
861*0bfacb9bSmrg 	  if (TREE_CODE (*vr0max) == INTEGER_CST)
862*0bfacb9bSmrg 	    *vr0min = int_const_binop (PLUS_EXPR, *vr0max,
863*0bfacb9bSmrg 				       build_int_cst (TREE_TYPE (*vr0max), 1));
864*0bfacb9bSmrg 	  else
865*0bfacb9bSmrg 	    *vr0min = *vr0max;
866*0bfacb9bSmrg 	  *vr0max = vr1max;
867*0bfacb9bSmrg 	}
868*0bfacb9bSmrg       else
869*0bfacb9bSmrg 	gcc_unreachable ();
870*0bfacb9bSmrg     }
871*0bfacb9bSmrg   else if ((operand_less_p (*vr0min, vr1max) == 1
872*0bfacb9bSmrg 	    || operand_equal_p (*vr0min, vr1max, 0))
873*0bfacb9bSmrg 	   && operand_less_p (vr1min, *vr0min) == 1
874*0bfacb9bSmrg 	   && operand_less_p (vr1max, *vr0max) == 1)
875*0bfacb9bSmrg     {
876*0bfacb9bSmrg       /* (  [  )  ] or (  )[  ] */
877*0bfacb9bSmrg       if (*vr0type == VR_ANTI_RANGE
878*0bfacb9bSmrg 	  && vr1type == VR_ANTI_RANGE)
879*0bfacb9bSmrg 	*vr0min = vr1min;
880*0bfacb9bSmrg       else if (*vr0type == VR_RANGE
881*0bfacb9bSmrg 	       && vr1type == VR_RANGE)
882*0bfacb9bSmrg 	*vr0max = vr1max;
883*0bfacb9bSmrg       else if (*vr0type == VR_RANGE
884*0bfacb9bSmrg 	       && vr1type == VR_ANTI_RANGE)
885*0bfacb9bSmrg 	{
886*0bfacb9bSmrg 	  if (TREE_CODE (vr1max) == INTEGER_CST)
887*0bfacb9bSmrg 	    *vr0min = int_const_binop (PLUS_EXPR, vr1max,
888*0bfacb9bSmrg 				       build_int_cst (TREE_TYPE (vr1max), 1));
889*0bfacb9bSmrg 	  else
890*0bfacb9bSmrg 	    *vr0min = vr1max;
891*0bfacb9bSmrg 	}
892*0bfacb9bSmrg       else if (*vr0type == VR_ANTI_RANGE
893*0bfacb9bSmrg 	       && vr1type == VR_RANGE)
894*0bfacb9bSmrg 	{
895*0bfacb9bSmrg 	  *vr0type = VR_RANGE;
896*0bfacb9bSmrg 	  if (TREE_CODE (*vr0min) == INTEGER_CST)
897*0bfacb9bSmrg 	    *vr0max = int_const_binop (MINUS_EXPR, *vr0min,
898*0bfacb9bSmrg 				       build_int_cst (TREE_TYPE (*vr0min), 1));
899*0bfacb9bSmrg 	  else
900*0bfacb9bSmrg 	    *vr0max = *vr0min;
901*0bfacb9bSmrg 	  *vr0min = vr1min;
902*0bfacb9bSmrg 	}
903*0bfacb9bSmrg       else
904*0bfacb9bSmrg 	gcc_unreachable ();
905*0bfacb9bSmrg     }
906*0bfacb9bSmrg 
907*0bfacb9bSmrg   /* If we know the intersection is empty, there's no need to
908*0bfacb9bSmrg      conservatively add anything else to the set.  */
909*0bfacb9bSmrg   if (*vr0type == VR_UNDEFINED)
910*0bfacb9bSmrg     return;
911*0bfacb9bSmrg 
912*0bfacb9bSmrg   /* As a fallback simply use { *VRTYPE, *VR0MIN, *VR0MAX } as
913*0bfacb9bSmrg      result for the intersection.  That's always a conservative
914*0bfacb9bSmrg      correct estimate unless VR1 is a constant singleton range
915*0bfacb9bSmrg      in which case we choose that.  */
916*0bfacb9bSmrg   if (vr1type == VR_RANGE
917*0bfacb9bSmrg       && is_gimple_min_invariant (vr1min)
918*0bfacb9bSmrg       && vrp_operand_equal_p (vr1min, vr1max))
919*0bfacb9bSmrg     {
920*0bfacb9bSmrg       *vr0type = vr1type;
921*0bfacb9bSmrg       *vr0min = vr1min;
922*0bfacb9bSmrg       *vr0max = vr1max;
923*0bfacb9bSmrg     }
924*0bfacb9bSmrg }
925*0bfacb9bSmrg 
926*0bfacb9bSmrg /* Helper for the intersection operation for value ranges.  Given two
927*0bfacb9bSmrg    value ranges VR0 and VR1, return the intersection of the two
928*0bfacb9bSmrg    ranges.  This may not be the smallest possible such range.  */
929*0bfacb9bSmrg 
930*0bfacb9bSmrg value_range
intersect_helper(const value_range * vr0,const value_range * vr1)931*0bfacb9bSmrg value_range::intersect_helper (const value_range *vr0, const value_range *vr1)
932*0bfacb9bSmrg {
933*0bfacb9bSmrg   /* If either range is VR_VARYING the other one wins.  */
934*0bfacb9bSmrg   if (vr1->varying_p ())
935*0bfacb9bSmrg     return *vr0;
936*0bfacb9bSmrg   if (vr0->varying_p ())
937*0bfacb9bSmrg     return *vr1;
938*0bfacb9bSmrg 
939*0bfacb9bSmrg   /* When either range is VR_UNDEFINED the resulting range is
940*0bfacb9bSmrg      VR_UNDEFINED, too.  */
941*0bfacb9bSmrg   if (vr0->undefined_p ())
942*0bfacb9bSmrg     return *vr0;
943*0bfacb9bSmrg   if (vr1->undefined_p ())
944*0bfacb9bSmrg     return *vr1;
945*0bfacb9bSmrg 
946*0bfacb9bSmrg   value_range_kind vr0kind = vr0->kind ();
947*0bfacb9bSmrg   tree vr0min = vr0->min ();
948*0bfacb9bSmrg   tree vr0max = vr0->max ();
949*0bfacb9bSmrg   intersect_ranges (&vr0kind, &vr0min, &vr0max,
950*0bfacb9bSmrg 		    vr1->kind (), vr1->min (), vr1->max ());
951*0bfacb9bSmrg   /* Make sure to canonicalize the result though as the inversion of a
952*0bfacb9bSmrg      VR_RANGE can still be a VR_RANGE.  Work on a temporary so we can
953*0bfacb9bSmrg      fall back to vr0 when this turns things to varying.  */
954*0bfacb9bSmrg   value_range tem;
955*0bfacb9bSmrg   if (vr0kind == VR_UNDEFINED)
956*0bfacb9bSmrg     tem.set_undefined ();
957*0bfacb9bSmrg   else if (vr0kind == VR_VARYING)
958*0bfacb9bSmrg     tem.set_varying (vr0->type ());
959*0bfacb9bSmrg   else
960*0bfacb9bSmrg     tem.set (vr0min, vr0max, vr0kind);
961*0bfacb9bSmrg   /* If that failed, use the saved original VR0.  */
962*0bfacb9bSmrg   if (tem.varying_p ())
963*0bfacb9bSmrg     return *vr0;
964*0bfacb9bSmrg 
965*0bfacb9bSmrg   return tem;
966*0bfacb9bSmrg }
967*0bfacb9bSmrg 
968*0bfacb9bSmrg /* Union the two value-ranges { *VR0TYPE, *VR0MIN, *VR0MAX } and
969*0bfacb9bSmrg    { VR1TYPE, VR0MIN, VR0MAX } and store the result
970*0bfacb9bSmrg    in { *VR0TYPE, *VR0MIN, *VR0MAX }.  This may not be the smallest
971*0bfacb9bSmrg    possible such range.  The resulting range is not canonicalized.  */
972*0bfacb9bSmrg 
973*0bfacb9bSmrg static void
union_ranges(enum value_range_kind * vr0type,tree * vr0min,tree * vr0max,enum value_range_kind vr1type,tree vr1min,tree vr1max)974*0bfacb9bSmrg union_ranges (enum value_range_kind *vr0type,
975*0bfacb9bSmrg 	      tree *vr0min, tree *vr0max,
976*0bfacb9bSmrg 	      enum value_range_kind vr1type,
977*0bfacb9bSmrg 	      tree vr1min, tree vr1max)
978*0bfacb9bSmrg {
979*0bfacb9bSmrg   int cmpmin = compare_values (*vr0min, vr1min);
980*0bfacb9bSmrg   int cmpmax = compare_values (*vr0max, vr1max);
981*0bfacb9bSmrg   bool mineq = cmpmin == 0;
982*0bfacb9bSmrg   bool maxeq = cmpmax == 0;
983*0bfacb9bSmrg 
984*0bfacb9bSmrg   /* [] is vr0, () is vr1 in the following classification comments.  */
985*0bfacb9bSmrg   if (mineq && maxeq)
986*0bfacb9bSmrg     {
987*0bfacb9bSmrg       /* [(  )] */
988*0bfacb9bSmrg       if (*vr0type == vr1type)
989*0bfacb9bSmrg 	/* Nothing to do for equal ranges.  */
990*0bfacb9bSmrg 	;
991*0bfacb9bSmrg       else if ((*vr0type == VR_RANGE
992*0bfacb9bSmrg 		&& vr1type == VR_ANTI_RANGE)
993*0bfacb9bSmrg 	       || (*vr0type == VR_ANTI_RANGE
994*0bfacb9bSmrg 		   && vr1type == VR_RANGE))
995*0bfacb9bSmrg 	{
996*0bfacb9bSmrg 	  /* For anti-range with range union the result is varying.  */
997*0bfacb9bSmrg 	  goto give_up;
998*0bfacb9bSmrg 	}
999*0bfacb9bSmrg       else
1000*0bfacb9bSmrg 	gcc_unreachable ();
1001*0bfacb9bSmrg     }
1002*0bfacb9bSmrg   else if (operand_less_p (*vr0max, vr1min) == 1
1003*0bfacb9bSmrg 	   || operand_less_p (vr1max, *vr0min) == 1)
1004*0bfacb9bSmrg     {
1005*0bfacb9bSmrg       /* [ ] ( ) or ( ) [ ]
1006*0bfacb9bSmrg 	 If the ranges have an empty intersection, result of the union
1007*0bfacb9bSmrg 	 operation is the anti-range or if both are anti-ranges
1008*0bfacb9bSmrg 	 it covers all.  */
1009*0bfacb9bSmrg       if (*vr0type == VR_ANTI_RANGE
1010*0bfacb9bSmrg 	  && vr1type == VR_ANTI_RANGE)
1011*0bfacb9bSmrg 	goto give_up;
1012*0bfacb9bSmrg       else if (*vr0type == VR_ANTI_RANGE
1013*0bfacb9bSmrg 	       && vr1type == VR_RANGE)
1014*0bfacb9bSmrg 	;
1015*0bfacb9bSmrg       else if (*vr0type == VR_RANGE
1016*0bfacb9bSmrg 	       && vr1type == VR_ANTI_RANGE)
1017*0bfacb9bSmrg 	{
1018*0bfacb9bSmrg 	  *vr0type = vr1type;
1019*0bfacb9bSmrg 	  *vr0min = vr1min;
1020*0bfacb9bSmrg 	  *vr0max = vr1max;
1021*0bfacb9bSmrg 	}
1022*0bfacb9bSmrg       else if (*vr0type == VR_RANGE
1023*0bfacb9bSmrg 	       && vr1type == VR_RANGE)
1024*0bfacb9bSmrg 	{
1025*0bfacb9bSmrg 	  /* The result is the convex hull of both ranges.  */
1026*0bfacb9bSmrg 	  if (operand_less_p (*vr0max, vr1min) == 1)
1027*0bfacb9bSmrg 	    {
1028*0bfacb9bSmrg 	      /* If the result can be an anti-range, create one.  */
1029*0bfacb9bSmrg 	      if (TREE_CODE (*vr0max) == INTEGER_CST
1030*0bfacb9bSmrg 		  && TREE_CODE (vr1min) == INTEGER_CST
1031*0bfacb9bSmrg 		  && vrp_val_is_min (*vr0min)
1032*0bfacb9bSmrg 		  && vrp_val_is_max (vr1max))
1033*0bfacb9bSmrg 		{
1034*0bfacb9bSmrg 		  tree min = int_const_binop (PLUS_EXPR,
1035*0bfacb9bSmrg 					      *vr0max,
1036*0bfacb9bSmrg 					      build_int_cst (TREE_TYPE (*vr0max), 1));
1037*0bfacb9bSmrg 		  tree max = int_const_binop (MINUS_EXPR,
1038*0bfacb9bSmrg 					      vr1min,
1039*0bfacb9bSmrg 					      build_int_cst (TREE_TYPE (vr1min), 1));
1040*0bfacb9bSmrg 		  if (!operand_less_p (max, min))
1041*0bfacb9bSmrg 		    {
1042*0bfacb9bSmrg 		      *vr0type = VR_ANTI_RANGE;
1043*0bfacb9bSmrg 		      *vr0min = min;
1044*0bfacb9bSmrg 		      *vr0max = max;
1045*0bfacb9bSmrg 		    }
1046*0bfacb9bSmrg 		  else
1047*0bfacb9bSmrg 		    *vr0max = vr1max;
1048*0bfacb9bSmrg 		}
1049*0bfacb9bSmrg 	      else
1050*0bfacb9bSmrg 		*vr0max = vr1max;
1051*0bfacb9bSmrg 	    }
1052*0bfacb9bSmrg 	  else
1053*0bfacb9bSmrg 	    {
1054*0bfacb9bSmrg 	      /* If the result can be an anti-range, create one.  */
1055*0bfacb9bSmrg 	      if (TREE_CODE (vr1max) == INTEGER_CST
1056*0bfacb9bSmrg 		  && TREE_CODE (*vr0min) == INTEGER_CST
1057*0bfacb9bSmrg 		  && vrp_val_is_min (vr1min)
1058*0bfacb9bSmrg 		  && vrp_val_is_max (*vr0max))
1059*0bfacb9bSmrg 		{
1060*0bfacb9bSmrg 		  tree min = int_const_binop (PLUS_EXPR,
1061*0bfacb9bSmrg 					      vr1max,
1062*0bfacb9bSmrg 					      build_int_cst (TREE_TYPE (vr1max), 1));
1063*0bfacb9bSmrg 		  tree max = int_const_binop (MINUS_EXPR,
1064*0bfacb9bSmrg 					      *vr0min,
1065*0bfacb9bSmrg 					      build_int_cst (TREE_TYPE (*vr0min), 1));
1066*0bfacb9bSmrg 		  if (!operand_less_p (max, min))
1067*0bfacb9bSmrg 		    {
1068*0bfacb9bSmrg 		      *vr0type = VR_ANTI_RANGE;
1069*0bfacb9bSmrg 		      *vr0min = min;
1070*0bfacb9bSmrg 		      *vr0max = max;
1071*0bfacb9bSmrg 		    }
1072*0bfacb9bSmrg 		  else
1073*0bfacb9bSmrg 		    *vr0min = vr1min;
1074*0bfacb9bSmrg 		}
1075*0bfacb9bSmrg 	      else
1076*0bfacb9bSmrg 		*vr0min = vr1min;
1077*0bfacb9bSmrg 	    }
1078*0bfacb9bSmrg 	}
1079*0bfacb9bSmrg       else
1080*0bfacb9bSmrg 	gcc_unreachable ();
1081*0bfacb9bSmrg     }
1082*0bfacb9bSmrg   else if ((maxeq || cmpmax == 1)
1083*0bfacb9bSmrg 	   && (mineq || cmpmin == -1))
1084*0bfacb9bSmrg     {
1085*0bfacb9bSmrg       /* [ (  ) ] or [(  ) ] or [ (  )] */
1086*0bfacb9bSmrg       if (*vr0type == VR_RANGE
1087*0bfacb9bSmrg 	  && vr1type == VR_RANGE)
1088*0bfacb9bSmrg 	;
1089*0bfacb9bSmrg       else if (*vr0type == VR_ANTI_RANGE
1090*0bfacb9bSmrg 	       && vr1type == VR_ANTI_RANGE)
1091*0bfacb9bSmrg 	{
1092*0bfacb9bSmrg 	  *vr0type = vr1type;
1093*0bfacb9bSmrg 	  *vr0min = vr1min;
1094*0bfacb9bSmrg 	  *vr0max = vr1max;
1095*0bfacb9bSmrg 	}
1096*0bfacb9bSmrg       else if (*vr0type == VR_ANTI_RANGE
1097*0bfacb9bSmrg 	       && vr1type == VR_RANGE)
1098*0bfacb9bSmrg 	{
1099*0bfacb9bSmrg 	  /* Arbitrarily choose the right or left gap.  */
1100*0bfacb9bSmrg 	  if (!mineq && TREE_CODE (vr1min) == INTEGER_CST)
1101*0bfacb9bSmrg 	    *vr0max = int_const_binop (MINUS_EXPR, vr1min,
1102*0bfacb9bSmrg 				       build_int_cst (TREE_TYPE (vr1min), 1));
1103*0bfacb9bSmrg 	  else if (!maxeq && TREE_CODE (vr1max) == INTEGER_CST)
1104*0bfacb9bSmrg 	    *vr0min = int_const_binop (PLUS_EXPR, vr1max,
1105*0bfacb9bSmrg 				       build_int_cst (TREE_TYPE (vr1max), 1));
1106*0bfacb9bSmrg 	  else
1107*0bfacb9bSmrg 	    goto give_up;
1108*0bfacb9bSmrg 	}
1109*0bfacb9bSmrg       else if (*vr0type == VR_RANGE
1110*0bfacb9bSmrg 	       && vr1type == VR_ANTI_RANGE)
1111*0bfacb9bSmrg 	/* The result covers everything.  */
1112*0bfacb9bSmrg 	goto give_up;
1113*0bfacb9bSmrg       else
1114*0bfacb9bSmrg 	gcc_unreachable ();
1115*0bfacb9bSmrg     }
1116*0bfacb9bSmrg   else if ((maxeq || cmpmax == -1)
1117*0bfacb9bSmrg 	   && (mineq || cmpmin == 1))
1118*0bfacb9bSmrg     {
1119*0bfacb9bSmrg       /* ( [  ] ) or ([  ] ) or ( [  ]) */
1120*0bfacb9bSmrg       if (*vr0type == VR_RANGE
1121*0bfacb9bSmrg 	  && vr1type == VR_RANGE)
1122*0bfacb9bSmrg 	{
1123*0bfacb9bSmrg 	  *vr0type = vr1type;
1124*0bfacb9bSmrg 	  *vr0min = vr1min;
1125*0bfacb9bSmrg 	  *vr0max = vr1max;
1126*0bfacb9bSmrg 	}
1127*0bfacb9bSmrg       else if (*vr0type == VR_ANTI_RANGE
1128*0bfacb9bSmrg 	       && vr1type == VR_ANTI_RANGE)
1129*0bfacb9bSmrg 	;
1130*0bfacb9bSmrg       else if (*vr0type == VR_RANGE
1131*0bfacb9bSmrg 	       && vr1type == VR_ANTI_RANGE)
1132*0bfacb9bSmrg 	{
1133*0bfacb9bSmrg 	  *vr0type = VR_ANTI_RANGE;
1134*0bfacb9bSmrg 	  if (!mineq && TREE_CODE (*vr0min) == INTEGER_CST)
1135*0bfacb9bSmrg 	    {
1136*0bfacb9bSmrg 	      *vr0max = int_const_binop (MINUS_EXPR, *vr0min,
1137*0bfacb9bSmrg 					 build_int_cst (TREE_TYPE (*vr0min), 1));
1138*0bfacb9bSmrg 	      *vr0min = vr1min;
1139*0bfacb9bSmrg 	    }
1140*0bfacb9bSmrg 	  else if (!maxeq && TREE_CODE (*vr0max) == INTEGER_CST)
1141*0bfacb9bSmrg 	    {
1142*0bfacb9bSmrg 	      *vr0min = int_const_binop (PLUS_EXPR, *vr0max,
1143*0bfacb9bSmrg 					 build_int_cst (TREE_TYPE (*vr0max), 1));
1144*0bfacb9bSmrg 	      *vr0max = vr1max;
1145*0bfacb9bSmrg 	    }
1146*0bfacb9bSmrg 	  else
1147*0bfacb9bSmrg 	    goto give_up;
1148*0bfacb9bSmrg 	}
1149*0bfacb9bSmrg       else if (*vr0type == VR_ANTI_RANGE
1150*0bfacb9bSmrg 	       && vr1type == VR_RANGE)
1151*0bfacb9bSmrg 	/* The result covers everything.  */
1152*0bfacb9bSmrg 	goto give_up;
1153*0bfacb9bSmrg       else
1154*0bfacb9bSmrg 	gcc_unreachable ();
1155*0bfacb9bSmrg     }
1156*0bfacb9bSmrg   else if (cmpmin == -1
1157*0bfacb9bSmrg 	   && cmpmax == -1
1158*0bfacb9bSmrg 	   && (operand_less_p (vr1min, *vr0max) == 1
1159*0bfacb9bSmrg 	       || operand_equal_p (vr1min, *vr0max, 0)))
1160*0bfacb9bSmrg     {
1161*0bfacb9bSmrg       /* [  (  ]  ) or [   ](   ) */
1162*0bfacb9bSmrg       if (*vr0type == VR_RANGE
1163*0bfacb9bSmrg 	  && vr1type == VR_RANGE)
1164*0bfacb9bSmrg 	*vr0max = vr1max;
1165*0bfacb9bSmrg       else if (*vr0type == VR_ANTI_RANGE
1166*0bfacb9bSmrg 	       && vr1type == VR_ANTI_RANGE)
1167*0bfacb9bSmrg 	*vr0min = vr1min;
1168*0bfacb9bSmrg       else if (*vr0type == VR_ANTI_RANGE
1169*0bfacb9bSmrg 	       && vr1type == VR_RANGE)
1170*0bfacb9bSmrg 	{
1171*0bfacb9bSmrg 	  if (TREE_CODE (vr1min) == INTEGER_CST)
1172*0bfacb9bSmrg 	    *vr0max = int_const_binop (MINUS_EXPR, vr1min,
1173*0bfacb9bSmrg 				       build_int_cst (TREE_TYPE (vr1min), 1));
1174*0bfacb9bSmrg 	  else
1175*0bfacb9bSmrg 	    goto give_up;
1176*0bfacb9bSmrg 	}
1177*0bfacb9bSmrg       else if (*vr0type == VR_RANGE
1178*0bfacb9bSmrg 	       && vr1type == VR_ANTI_RANGE)
1179*0bfacb9bSmrg 	{
1180*0bfacb9bSmrg 	  if (TREE_CODE (*vr0max) == INTEGER_CST)
1181*0bfacb9bSmrg 	    {
1182*0bfacb9bSmrg 	      *vr0type = vr1type;
1183*0bfacb9bSmrg 	      *vr0min = int_const_binop (PLUS_EXPR, *vr0max,
1184*0bfacb9bSmrg 					 build_int_cst (TREE_TYPE (*vr0max), 1));
1185*0bfacb9bSmrg 	      *vr0max = vr1max;
1186*0bfacb9bSmrg 	    }
1187*0bfacb9bSmrg 	  else
1188*0bfacb9bSmrg 	    goto give_up;
1189*0bfacb9bSmrg 	}
1190*0bfacb9bSmrg       else
1191*0bfacb9bSmrg 	gcc_unreachable ();
1192*0bfacb9bSmrg     }
1193*0bfacb9bSmrg   else if (cmpmin == 1
1194*0bfacb9bSmrg 	   && cmpmax == 1
1195*0bfacb9bSmrg 	   && (operand_less_p (*vr0min, vr1max) == 1
1196*0bfacb9bSmrg 	       || operand_equal_p (*vr0min, vr1max, 0)))
1197*0bfacb9bSmrg     {
1198*0bfacb9bSmrg       /* (  [  )  ] or (   )[   ] */
1199*0bfacb9bSmrg       if (*vr0type == VR_RANGE
1200*0bfacb9bSmrg 	  && vr1type == VR_RANGE)
1201*0bfacb9bSmrg 	*vr0min = vr1min;
1202*0bfacb9bSmrg       else if (*vr0type == VR_ANTI_RANGE
1203*0bfacb9bSmrg 	       && vr1type == VR_ANTI_RANGE)
1204*0bfacb9bSmrg 	*vr0max = vr1max;
1205*0bfacb9bSmrg       else if (*vr0type == VR_ANTI_RANGE
1206*0bfacb9bSmrg 	       && vr1type == VR_RANGE)
1207*0bfacb9bSmrg 	{
1208*0bfacb9bSmrg 	  if (TREE_CODE (vr1max) == INTEGER_CST)
1209*0bfacb9bSmrg 	    *vr0min = int_const_binop (PLUS_EXPR, vr1max,
1210*0bfacb9bSmrg 				       build_int_cst (TREE_TYPE (vr1max), 1));
1211*0bfacb9bSmrg 	  else
1212*0bfacb9bSmrg 	    goto give_up;
1213*0bfacb9bSmrg 	}
1214*0bfacb9bSmrg       else if (*vr0type == VR_RANGE
1215*0bfacb9bSmrg 	       && vr1type == VR_ANTI_RANGE)
1216*0bfacb9bSmrg 	{
1217*0bfacb9bSmrg 	  if (TREE_CODE (*vr0min) == INTEGER_CST)
1218*0bfacb9bSmrg 	    {
1219*0bfacb9bSmrg 	      *vr0type = vr1type;
1220*0bfacb9bSmrg 	      *vr0max = int_const_binop (MINUS_EXPR, *vr0min,
1221*0bfacb9bSmrg 					 build_int_cst (TREE_TYPE (*vr0min), 1));
1222*0bfacb9bSmrg 	      *vr0min = vr1min;
1223*0bfacb9bSmrg 	    }
1224*0bfacb9bSmrg 	  else
1225*0bfacb9bSmrg 	    goto give_up;
1226*0bfacb9bSmrg 	}
1227*0bfacb9bSmrg       else
1228*0bfacb9bSmrg 	gcc_unreachable ();
1229*0bfacb9bSmrg     }
1230*0bfacb9bSmrg   else
1231*0bfacb9bSmrg     goto give_up;
1232*0bfacb9bSmrg 
1233*0bfacb9bSmrg   return;
1234*0bfacb9bSmrg 
1235*0bfacb9bSmrg give_up:
1236*0bfacb9bSmrg   *vr0type = VR_VARYING;
1237*0bfacb9bSmrg   *vr0min = NULL_TREE;
1238*0bfacb9bSmrg   *vr0max = NULL_TREE;
1239*0bfacb9bSmrg }
1240*0bfacb9bSmrg 
1241*0bfacb9bSmrg /* Helper for meet operation for value ranges.  Given two value ranges VR0 and
1242*0bfacb9bSmrg    VR1, return a range that contains both VR0 and VR1.  This may not be the
1243*0bfacb9bSmrg    smallest possible such range.  */
1244*0bfacb9bSmrg 
1245*0bfacb9bSmrg value_range
union_helper(const value_range * vr0,const value_range * vr1)1246*0bfacb9bSmrg value_range::union_helper (const value_range *vr0, const value_range *vr1)
1247*0bfacb9bSmrg {
1248*0bfacb9bSmrg   /* VR0 has the resulting range if VR1 is undefined or VR0 is varying.  */
1249*0bfacb9bSmrg   if (vr1->undefined_p ()
1250*0bfacb9bSmrg       || vr0->varying_p ())
1251*0bfacb9bSmrg     return *vr0;
1252*0bfacb9bSmrg 
1253*0bfacb9bSmrg   /* VR1 has the resulting range if VR0 is undefined or VR1 is varying.  */
1254*0bfacb9bSmrg   if (vr0->undefined_p ()
1255*0bfacb9bSmrg       || vr1->varying_p ())
1256*0bfacb9bSmrg     return *vr1;
1257*0bfacb9bSmrg 
1258*0bfacb9bSmrg   value_range_kind vr0kind = vr0->kind ();
1259*0bfacb9bSmrg   tree vr0min = vr0->min ();
1260*0bfacb9bSmrg   tree vr0max = vr0->max ();
1261*0bfacb9bSmrg   union_ranges (&vr0kind, &vr0min, &vr0max,
1262*0bfacb9bSmrg 		vr1->kind (), vr1->min (), vr1->max ());
1263*0bfacb9bSmrg 
1264*0bfacb9bSmrg   /* Work on a temporary so we can still use vr0 when union returns varying.  */
1265*0bfacb9bSmrg   value_range tem;
1266*0bfacb9bSmrg   if (vr0kind == VR_UNDEFINED)
1267*0bfacb9bSmrg     tem.set_undefined ();
1268*0bfacb9bSmrg   else if (vr0kind == VR_VARYING)
1269*0bfacb9bSmrg     tem.set_varying (vr0->type ());
1270*0bfacb9bSmrg   else
1271*0bfacb9bSmrg     tem.set (vr0min, vr0max, vr0kind);
1272*0bfacb9bSmrg 
1273*0bfacb9bSmrg   /* Failed to find an efficient meet.  Before giving up and setting
1274*0bfacb9bSmrg      the result to VARYING, see if we can at least derive a useful
1275*0bfacb9bSmrg      anti-range.  */
1276*0bfacb9bSmrg   if (tem.varying_p ()
1277*0bfacb9bSmrg       && range_includes_zero_p (vr0) == 0
1278*0bfacb9bSmrg       && range_includes_zero_p (vr1) == 0)
1279*0bfacb9bSmrg     {
1280*0bfacb9bSmrg       tem.set_nonzero (vr0->type ());
1281*0bfacb9bSmrg       return tem;
1282*0bfacb9bSmrg     }
1283*0bfacb9bSmrg 
1284*0bfacb9bSmrg   return tem;
1285*0bfacb9bSmrg }
1286*0bfacb9bSmrg 
1287*0bfacb9bSmrg /* Meet operation for value ranges.  Given two value ranges VR0 and
1288*0bfacb9bSmrg    VR1, store in VR0 a range that contains both VR0 and VR1.  This
1289*0bfacb9bSmrg    may not be the smallest possible such range.  */
1290*0bfacb9bSmrg 
1291*0bfacb9bSmrg void
union_(const value_range * other)1292*0bfacb9bSmrg value_range::union_ (const value_range *other)
1293*0bfacb9bSmrg {
1294*0bfacb9bSmrg   if (dump_file && (dump_flags & TDF_DETAILS))
1295*0bfacb9bSmrg     {
1296*0bfacb9bSmrg       fprintf (dump_file, "Meeting\n  ");
1297*0bfacb9bSmrg       dump_value_range (dump_file, this);
1298*0bfacb9bSmrg       fprintf (dump_file, "\nand\n  ");
1299*0bfacb9bSmrg       dump_value_range (dump_file, other);
1300*0bfacb9bSmrg       fprintf (dump_file, "\n");
1301*0bfacb9bSmrg     }
1302*0bfacb9bSmrg 
1303*0bfacb9bSmrg   *this = union_helper (this, other);
1304*0bfacb9bSmrg 
1305*0bfacb9bSmrg   if (dump_file && (dump_flags & TDF_DETAILS))
1306*0bfacb9bSmrg     {
1307*0bfacb9bSmrg       fprintf (dump_file, "to\n  ");
1308*0bfacb9bSmrg       dump_value_range (dump_file, this);
1309*0bfacb9bSmrg       fprintf (dump_file, "\n");
1310*0bfacb9bSmrg     }
1311*0bfacb9bSmrg }
1312*0bfacb9bSmrg 
1313*0bfacb9bSmrg /* Range union, but for references.  */
1314*0bfacb9bSmrg 
1315*0bfacb9bSmrg void
union_(const value_range & r)1316*0bfacb9bSmrg value_range::union_ (const value_range &r)
1317*0bfacb9bSmrg {
1318*0bfacb9bSmrg   /* Disable details for now, because it makes the ranger dump
1319*0bfacb9bSmrg      unnecessarily verbose.  */
1320*0bfacb9bSmrg   bool details = dump_flags & TDF_DETAILS;
1321*0bfacb9bSmrg   if (details)
1322*0bfacb9bSmrg     dump_flags &= ~TDF_DETAILS;
1323*0bfacb9bSmrg   union_ (&r);
1324*0bfacb9bSmrg   if (details)
1325*0bfacb9bSmrg     dump_flags |= TDF_DETAILS;
1326*0bfacb9bSmrg }
1327*0bfacb9bSmrg 
1328*0bfacb9bSmrg void
intersect(const value_range * other)1329*0bfacb9bSmrg value_range::intersect (const value_range *other)
1330*0bfacb9bSmrg {
1331*0bfacb9bSmrg   if (dump_file && (dump_flags & TDF_DETAILS))
1332*0bfacb9bSmrg     {
1333*0bfacb9bSmrg       fprintf (dump_file, "Intersecting\n  ");
1334*0bfacb9bSmrg       dump_value_range (dump_file, this);
1335*0bfacb9bSmrg       fprintf (dump_file, "\nand\n  ");
1336*0bfacb9bSmrg       dump_value_range (dump_file, other);
1337*0bfacb9bSmrg       fprintf (dump_file, "\n");
1338*0bfacb9bSmrg     }
1339*0bfacb9bSmrg 
1340*0bfacb9bSmrg   *this = intersect_helper (this, other);
1341*0bfacb9bSmrg 
1342*0bfacb9bSmrg   if (dump_file && (dump_flags & TDF_DETAILS))
1343*0bfacb9bSmrg     {
1344*0bfacb9bSmrg       fprintf (dump_file, "to\n  ");
1345*0bfacb9bSmrg       dump_value_range (dump_file, this);
1346*0bfacb9bSmrg       fprintf (dump_file, "\n");
1347*0bfacb9bSmrg     }
1348*0bfacb9bSmrg }
1349*0bfacb9bSmrg 
1350*0bfacb9bSmrg /* Range intersect, but for references.  */
1351*0bfacb9bSmrg 
1352*0bfacb9bSmrg void
intersect(const value_range & r)1353*0bfacb9bSmrg value_range::intersect (const value_range &r)
1354*0bfacb9bSmrg {
1355*0bfacb9bSmrg   /* Disable details for now, because it makes the ranger dump
1356*0bfacb9bSmrg      unnecessarily verbose.  */
1357*0bfacb9bSmrg   bool details = dump_flags & TDF_DETAILS;
1358*0bfacb9bSmrg   if (details)
1359*0bfacb9bSmrg     dump_flags &= ~TDF_DETAILS;
1360*0bfacb9bSmrg   intersect (&r);
1361*0bfacb9bSmrg   if (details)
1362*0bfacb9bSmrg     dump_flags |= TDF_DETAILS;
1363*0bfacb9bSmrg }
1364*0bfacb9bSmrg 
1365*0bfacb9bSmrg /* Return the inverse of a range.  */
1366*0bfacb9bSmrg 
1367*0bfacb9bSmrg void
invert()1368*0bfacb9bSmrg value_range::invert ()
1369*0bfacb9bSmrg {
1370*0bfacb9bSmrg   /* We can't just invert VR_RANGE and VR_ANTI_RANGE because we may
1371*0bfacb9bSmrg      create non-canonical ranges.  Use the constructors instead.  */
1372*0bfacb9bSmrg   if (m_kind == VR_RANGE)
1373*0bfacb9bSmrg     *this = value_range (m_min, m_max, VR_ANTI_RANGE);
1374*0bfacb9bSmrg   else if (m_kind == VR_ANTI_RANGE)
1375*0bfacb9bSmrg     *this = value_range (m_min, m_max);
1376*0bfacb9bSmrg   else
1377*0bfacb9bSmrg     gcc_unreachable ();
1378*0bfacb9bSmrg }
1379*0bfacb9bSmrg 
1380*0bfacb9bSmrg void
dump(FILE * file) const1381*0bfacb9bSmrg value_range::dump (FILE *file) const
1382*0bfacb9bSmrg {
1383*0bfacb9bSmrg   if (undefined_p ())
1384*0bfacb9bSmrg     fprintf (file, "UNDEFINED");
1385*0bfacb9bSmrg   else if (m_kind == VR_RANGE || m_kind == VR_ANTI_RANGE)
1386*0bfacb9bSmrg     {
1387*0bfacb9bSmrg       tree ttype = type ();
1388*0bfacb9bSmrg 
1389*0bfacb9bSmrg       print_generic_expr (file, ttype);
1390*0bfacb9bSmrg       fprintf (file, " ");
1391*0bfacb9bSmrg 
1392*0bfacb9bSmrg       fprintf (file, "%s[", (m_kind == VR_ANTI_RANGE) ? "~" : "");
1393*0bfacb9bSmrg 
1394*0bfacb9bSmrg       if (INTEGRAL_TYPE_P (ttype)
1395*0bfacb9bSmrg 	  && !TYPE_UNSIGNED (ttype)
1396*0bfacb9bSmrg 	  && vrp_val_is_min (min ())
1397*0bfacb9bSmrg 	  && TYPE_PRECISION (ttype) != 1)
1398*0bfacb9bSmrg 	fprintf (file, "-INF");
1399*0bfacb9bSmrg       else
1400*0bfacb9bSmrg 	print_generic_expr (file, min ());
1401*0bfacb9bSmrg 
1402*0bfacb9bSmrg       fprintf (file, ", ");
1403*0bfacb9bSmrg 
1404*0bfacb9bSmrg       if (supports_type_p (ttype)
1405*0bfacb9bSmrg 	  && vrp_val_is_max (max ())
1406*0bfacb9bSmrg 	  && TYPE_PRECISION (ttype) != 1)
1407*0bfacb9bSmrg 	fprintf (file, "+INF");
1408*0bfacb9bSmrg       else
1409*0bfacb9bSmrg 	print_generic_expr (file, max ());
1410*0bfacb9bSmrg 
1411*0bfacb9bSmrg       fprintf (file, "]");
1412*0bfacb9bSmrg     }
1413*0bfacb9bSmrg   else if (varying_p ())
1414*0bfacb9bSmrg     {
1415*0bfacb9bSmrg       print_generic_expr (file, type ());
1416*0bfacb9bSmrg       fprintf (file, " VARYING");
1417*0bfacb9bSmrg     }
1418*0bfacb9bSmrg   else
1419*0bfacb9bSmrg     gcc_unreachable ();
1420*0bfacb9bSmrg }
1421*0bfacb9bSmrg 
1422*0bfacb9bSmrg void
dump() const1423*0bfacb9bSmrg value_range::dump () const
1424*0bfacb9bSmrg {
1425*0bfacb9bSmrg   dump (stderr);
1426*0bfacb9bSmrg }
1427*0bfacb9bSmrg 
1428*0bfacb9bSmrg void
dump_value_range(FILE * file,const value_range * vr)1429*0bfacb9bSmrg dump_value_range (FILE *file, const value_range *vr)
1430*0bfacb9bSmrg {
1431*0bfacb9bSmrg   if (!vr)
1432*0bfacb9bSmrg     fprintf (file, "[]");
1433*0bfacb9bSmrg   else
1434*0bfacb9bSmrg     vr->dump (file);
1435*0bfacb9bSmrg }
1436*0bfacb9bSmrg 
1437*0bfacb9bSmrg DEBUG_FUNCTION void
debug(const value_range * vr)1438*0bfacb9bSmrg debug (const value_range *vr)
1439*0bfacb9bSmrg {
1440*0bfacb9bSmrg   dump_value_range (stderr, vr);
1441*0bfacb9bSmrg }
1442*0bfacb9bSmrg 
1443*0bfacb9bSmrg DEBUG_FUNCTION void
debug(const value_range & vr)1444*0bfacb9bSmrg debug (const value_range &vr)
1445*0bfacb9bSmrg {
1446*0bfacb9bSmrg   dump_value_range (stderr, &vr);
1447*0bfacb9bSmrg }
1448*0bfacb9bSmrg 
1449*0bfacb9bSmrg /* Create two value-ranges in *VR0 and *VR1 from the anti-range *AR
1450*0bfacb9bSmrg    so that *VR0 U *VR1 == *AR.  Returns true if that is possible,
1451*0bfacb9bSmrg    false otherwise.  If *AR can be represented with a single range
1452*0bfacb9bSmrg    *VR1 will be VR_UNDEFINED.  */
1453*0bfacb9bSmrg 
1454*0bfacb9bSmrg bool
ranges_from_anti_range(const value_range * ar,value_range * vr0,value_range * vr1)1455*0bfacb9bSmrg ranges_from_anti_range (const value_range *ar,
1456*0bfacb9bSmrg 			value_range *vr0, value_range *vr1)
1457*0bfacb9bSmrg {
1458*0bfacb9bSmrg   tree type = ar->type ();
1459*0bfacb9bSmrg 
1460*0bfacb9bSmrg   vr0->set_undefined ();
1461*0bfacb9bSmrg   vr1->set_undefined ();
1462*0bfacb9bSmrg 
1463*0bfacb9bSmrg   /* As a future improvement, we could handle ~[0, A] as: [-INF, -1] U
1464*0bfacb9bSmrg      [A+1, +INF].  Not sure if this helps in practice, though.  */
1465*0bfacb9bSmrg 
1466*0bfacb9bSmrg   if (ar->kind () != VR_ANTI_RANGE
1467*0bfacb9bSmrg       || TREE_CODE (ar->min ()) != INTEGER_CST
1468*0bfacb9bSmrg       || TREE_CODE (ar->max ()) != INTEGER_CST
1469*0bfacb9bSmrg       || !vrp_val_min (type)
1470*0bfacb9bSmrg       || !vrp_val_max (type))
1471*0bfacb9bSmrg     return false;
1472*0bfacb9bSmrg 
1473*0bfacb9bSmrg   if (tree_int_cst_lt (vrp_val_min (type), ar->min ()))
1474*0bfacb9bSmrg     vr0->set (vrp_val_min (type),
1475*0bfacb9bSmrg 	      wide_int_to_tree (type, wi::to_wide (ar->min ()) - 1));
1476*0bfacb9bSmrg   if (tree_int_cst_lt (ar->max (), vrp_val_max (type)))
1477*0bfacb9bSmrg     vr1->set (wide_int_to_tree (type, wi::to_wide (ar->max ()) + 1),
1478*0bfacb9bSmrg 	      vrp_val_max (type));
1479*0bfacb9bSmrg   if (vr0->undefined_p ())
1480*0bfacb9bSmrg     {
1481*0bfacb9bSmrg       *vr0 = *vr1;
1482*0bfacb9bSmrg       vr1->set_undefined ();
1483*0bfacb9bSmrg     }
1484*0bfacb9bSmrg 
1485*0bfacb9bSmrg   return !vr0->undefined_p ();
1486*0bfacb9bSmrg }
1487*0bfacb9bSmrg 
1488*0bfacb9bSmrg bool
range_has_numeric_bounds_p(const value_range * vr)1489*0bfacb9bSmrg range_has_numeric_bounds_p (const value_range *vr)
1490*0bfacb9bSmrg {
1491*0bfacb9bSmrg   return (vr->min ()
1492*0bfacb9bSmrg 	  && TREE_CODE (vr->min ()) == INTEGER_CST
1493*0bfacb9bSmrg 	  && TREE_CODE (vr->max ()) == INTEGER_CST);
1494*0bfacb9bSmrg }
1495*0bfacb9bSmrg 
1496*0bfacb9bSmrg /* Return the maximum value for TYPE.  */
1497*0bfacb9bSmrg 
1498*0bfacb9bSmrg tree
vrp_val_max(const_tree type)1499*0bfacb9bSmrg vrp_val_max (const_tree type)
1500*0bfacb9bSmrg {
1501*0bfacb9bSmrg   if (INTEGRAL_TYPE_P (type))
1502*0bfacb9bSmrg     return TYPE_MAX_VALUE (type);
1503*0bfacb9bSmrg   if (POINTER_TYPE_P (type))
1504*0bfacb9bSmrg     {
1505*0bfacb9bSmrg       wide_int max = wi::max_value (TYPE_PRECISION (type), TYPE_SIGN (type));
1506*0bfacb9bSmrg       return wide_int_to_tree (const_cast<tree> (type), max);
1507*0bfacb9bSmrg     }
1508*0bfacb9bSmrg   return NULL_TREE;
1509*0bfacb9bSmrg }
1510*0bfacb9bSmrg 
1511*0bfacb9bSmrg /* Return the minimum value for TYPE.  */
1512*0bfacb9bSmrg 
1513*0bfacb9bSmrg tree
vrp_val_min(const_tree type)1514*0bfacb9bSmrg vrp_val_min (const_tree type)
1515*0bfacb9bSmrg {
1516*0bfacb9bSmrg   if (INTEGRAL_TYPE_P (type))
1517*0bfacb9bSmrg     return TYPE_MIN_VALUE (type);
1518*0bfacb9bSmrg   if (POINTER_TYPE_P (type))
1519*0bfacb9bSmrg     return build_zero_cst (const_cast<tree> (type));
1520*0bfacb9bSmrg   return NULL_TREE;
1521*0bfacb9bSmrg }
1522*0bfacb9bSmrg 
1523*0bfacb9bSmrg /* Return whether VAL is equal to the maximum value of its type.
1524*0bfacb9bSmrg    We can't do a simple equality comparison with TYPE_MAX_VALUE because
1525*0bfacb9bSmrg    C typedefs and Ada subtypes can produce types whose TYPE_MAX_VALUE
1526*0bfacb9bSmrg    is not == to the integer constant with the same value in the type.  */
1527*0bfacb9bSmrg 
1528*0bfacb9bSmrg bool
vrp_val_is_max(const_tree val)1529*0bfacb9bSmrg vrp_val_is_max (const_tree val)
1530*0bfacb9bSmrg {
1531*0bfacb9bSmrg   tree type_max = vrp_val_max (TREE_TYPE (val));
1532*0bfacb9bSmrg   return (val == type_max
1533*0bfacb9bSmrg 	  || (type_max != NULL_TREE
1534*0bfacb9bSmrg 	      && operand_equal_p (val, type_max, 0)));
1535*0bfacb9bSmrg }
1536*0bfacb9bSmrg 
1537*0bfacb9bSmrg /* Return whether VAL is equal to the minimum value of its type.  */
1538*0bfacb9bSmrg 
1539*0bfacb9bSmrg bool
vrp_val_is_min(const_tree val)1540*0bfacb9bSmrg vrp_val_is_min (const_tree val)
1541*0bfacb9bSmrg {
1542*0bfacb9bSmrg   tree type_min = vrp_val_min (TREE_TYPE (val));
1543*0bfacb9bSmrg   return (val == type_min
1544*0bfacb9bSmrg 	  || (type_min != NULL_TREE
1545*0bfacb9bSmrg 	      && operand_equal_p (val, type_min, 0)));
1546*0bfacb9bSmrg }
1547*0bfacb9bSmrg 
1548*0bfacb9bSmrg /* Return true, if VAL1 and VAL2 are equal values for VRP purposes.  */
1549*0bfacb9bSmrg 
1550*0bfacb9bSmrg bool
vrp_operand_equal_p(const_tree val1,const_tree val2)1551*0bfacb9bSmrg vrp_operand_equal_p (const_tree val1, const_tree val2)
1552*0bfacb9bSmrg {
1553*0bfacb9bSmrg   if (val1 == val2)
1554*0bfacb9bSmrg     return true;
1555*0bfacb9bSmrg   if (!val1 || !val2 || !operand_equal_p (val1, val2, 0))
1556*0bfacb9bSmrg     return false;
1557*0bfacb9bSmrg   return true;
1558*0bfacb9bSmrg }
1559