]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/value-range.h
bitint: Fix up lowering of COMPLEX_EXPR [PR115544]
[thirdparty/gcc.git] / gcc / value-range.h
1 /* Support routines for value ranges.
2 Copyright (C) 2019-2024 Free Software Foundation, Inc.
3 Contributed by Aldy Hernandez <aldyh@redhat.com> and
4 Andrew Macleod <amacleod@redhat.com>.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
21
22 #ifndef GCC_VALUE_RANGE_H
23 #define GCC_VALUE_RANGE_H
24
25 class irange;
26
27 // Types of value ranges.
28 enum value_range_kind
29 {
30 /* Empty range. */
31 VR_UNDEFINED,
32 /* Range spans the entire domain. */
33 VR_VARYING,
34 /* Range is [MIN, MAX]. */
35 VR_RANGE,
36 /* Range is ~[MIN, MAX]. */
37 VR_ANTI_RANGE,
38 /* Range is a NAN. */
39 VR_NAN,
40 /* Range is a nice guy. */
41 VR_LAST
42 };
43
44 // Discriminator between different vrange types.
45
46 enum value_range_discriminator
47 {
48 // Range holds an integer or pointer.
49 VR_IRANGE,
50 // Pointer range.
51 VR_PRANGE,
52 // Floating point range.
53 VR_FRANGE,
54 // Range holds an unsupported type.
55 VR_UNKNOWN
56 };
57
58 // Abstract class for ranges of any of the supported types.
59 //
60 // To query what types ranger and the entire ecosystem can support,
61 // use Value_Range::supports_type_p(tree type). This is a static
62 // method available independently of any vrange object.
63 //
64 // To query what a given vrange variant can support, use:
65 // irange::supports_p ()
66 // frange::supports_p ()
67 // etc
68 //
69 // To query what a range object can support, use:
70 // void foo (vrange &v, irange &i, frange &f)
71 // {
72 // if (v.supports_type_p (type)) ...
73 // if (i.supports_type_p (type)) ...
74 // if (f.supports_type_p (type)) ...
75 // }
76
77 class vrange
78 {
79 template <typename T> friend bool is_a (vrange &);
80 friend class Value_Range;
81 friend void streamer_write_vrange (struct output_block *, const vrange &);
82 friend class range_op_handler;
83 public:
84 virtual void accept (const class vrange_visitor &v) const = 0;
85 virtual void set (tree, tree, value_range_kind = VR_RANGE) = 0;
86 virtual tree type () const = 0;
87 virtual bool supports_type_p (const_tree type) const = 0;
88 virtual void set_varying (tree type) = 0;
89 virtual void set_undefined () = 0;
90 virtual bool union_ (const vrange &) = 0;
91 virtual bool intersect (const vrange &) = 0;
92 virtual bool singleton_p (tree *result = NULL) const = 0;
93 virtual bool contains_p (tree cst) const = 0;
94 virtual bool zero_p () const = 0;
95 virtual bool nonzero_p () const = 0;
96 virtual void set_nonzero (tree type) = 0;
97 virtual void set_zero (tree type) = 0;
98 virtual void set_nonnegative (tree type) = 0;
99 virtual bool fits_p (const vrange &r) const = 0;
100 virtual ~vrange () { }
101 virtual tree lbound () const = 0;
102 virtual tree ubound () const = 0;
103 virtual void update_bitmask (const class irange_bitmask &);
104 virtual irange_bitmask get_bitmask () const;
105 wide_int get_nonzero_bits () const;
106 void set_nonzero_bits (const wide_int &bits);
107
108 bool varying_p () const;
109 bool undefined_p () const;
110 vrange& operator= (const vrange &);
111 bool operator== (const vrange &) const;
112 bool operator!= (const vrange &r) const { return !(*this == r); }
113 void dump (FILE *) const;
114 protected:
115 vrange (enum value_range_discriminator d) : m_discriminator (d) { }
116 ENUM_BITFIELD(value_range_kind) m_kind : 8;
117 const ENUM_BITFIELD(value_range_discriminator) m_discriminator : 4;
118 };
119
120 namespace inchash
121 {
122 extern void add_vrange (const vrange &, hash &, unsigned flags = 0);
123 }
124
125 // A pair of values representing the known bits in a range. Zero bits
126 // in MASK cover constant values. Set bits in MASK cover unknown
127 // values. VALUE are the known bits.
128 //
129 // Set bits in MASK (no meaningful information) must have their
130 // corresponding bits in VALUE cleared, as this speeds up union and
131 // intersect.
132
133 class irange_bitmask
134 {
135 public:
136 irange_bitmask () { /* uninitialized */ }
137 irange_bitmask (unsigned prec) { set_unknown (prec); }
138 irange_bitmask (const wide_int &value, const wide_int &mask);
139 wide_int value () const { return m_value; }
140 wide_int mask () const { return m_mask; }
141 void set_unknown (unsigned prec);
142 bool unknown_p () const;
143 unsigned get_precision () const;
144 void union_ (const irange_bitmask &src);
145 void intersect (const irange_bitmask &src);
146 bool operator== (const irange_bitmask &src) const;
147 bool operator!= (const irange_bitmask &src) const { return !(*this == src); }
148 void verify_mask () const;
149 void dump (FILE *) const;
150
151 bool member_p (const wide_int &val) const;
152 void adjust_range (irange &r) const;
153
154 // Convenience functions for nonzero bitmask compatibility.
155 wide_int get_nonzero_bits () const;
156 void set_nonzero_bits (const wide_int &bits);
157 private:
158 wide_int m_value;
159 wide_int m_mask;
160 };
161
162 inline void
163 irange_bitmask::set_unknown (unsigned prec)
164 {
165 m_value = wi::zero (prec);
166 m_mask = wi::minus_one (prec);
167 if (flag_checking)
168 verify_mask ();
169 }
170
171 // Return TRUE if THIS does not have any meaningful information.
172
173 inline bool
174 irange_bitmask::unknown_p () const
175 {
176 return m_mask == -1;
177 }
178
179 inline
180 irange_bitmask::irange_bitmask (const wide_int &value, const wide_int &mask)
181 {
182 m_value = value;
183 m_mask = mask;
184 if (flag_checking)
185 verify_mask ();
186 }
187
188 inline unsigned
189 irange_bitmask::get_precision () const
190 {
191 return m_mask.get_precision ();
192 }
193
194 // The following two functions are meant for backwards compatability
195 // with the nonzero bitmask. A cleared bit means the value must be 0.
196 // A set bit means we have no information for the bit.
197
198 // Return the nonzero bits.
199 inline wide_int
200 irange_bitmask::get_nonzero_bits () const
201 {
202 return m_value | m_mask;
203 }
204
205 // Set the bitmask to the nonzero bits in BITS.
206 inline void
207 irange_bitmask::set_nonzero_bits (const wide_int &bits)
208 {
209 m_value = wi::zero (bits.get_precision ());
210 m_mask = bits;
211 if (flag_checking)
212 verify_mask ();
213 }
214
215 // Return TRUE if val could be a valid value with this bitmask.
216
217 inline bool
218 irange_bitmask::member_p (const wide_int &val) const
219 {
220 if (unknown_p ())
221 return true;
222 wide_int res = m_mask & val;
223 if (m_value != 0)
224 res |= ~m_mask & m_value;
225 return res == val;
226 }
227
228 inline bool
229 irange_bitmask::operator== (const irange_bitmask &src) const
230 {
231 bool unknown1 = unknown_p ();
232 bool unknown2 = src.unknown_p ();
233 if (unknown1 || unknown2)
234 return unknown1 == unknown2;
235 return m_value == src.m_value && m_mask == src.m_mask;
236 }
237
238 inline void
239 irange_bitmask::union_ (const irange_bitmask &src)
240 {
241 m_mask = (m_mask | src.m_mask) | (m_value ^ src.m_value);
242 m_value = m_value & src.m_value;
243 if (flag_checking)
244 verify_mask ();
245 }
246
247 inline void
248 irange_bitmask::intersect (const irange_bitmask &src)
249 {
250 // If we have two known bits that are incompatible, the resulting
251 // bit is undefined. It is unclear whether we should set the entire
252 // range to UNDEFINED, or just a subset of it. For now, set the
253 // entire bitmask to unknown (VARYING).
254 if (wi::bit_and (~(m_mask | src.m_mask),
255 m_value ^ src.m_value) != 0)
256 {
257 unsigned prec = m_mask.get_precision ();
258 m_mask = wi::minus_one (prec);
259 m_value = wi::zero (prec);
260 }
261 else
262 {
263 m_mask = m_mask & src.m_mask;
264 m_value = m_value | src.m_value;
265 }
266 if (flag_checking)
267 verify_mask ();
268 }
269
270 // An integer range without any storage.
271
272 class irange : public vrange
273 {
274 friend class irange_storage;
275 friend class vrange_printer;
276 public:
277 // In-place setters.
278 void set (tree type, const wide_int &, const wide_int &,
279 value_range_kind = VR_RANGE);
280 virtual void set_nonzero (tree type) override;
281 virtual void set_zero (tree type) override;
282 virtual void set_nonnegative (tree type) override;
283 virtual void set_varying (tree type) override;
284 virtual void set_undefined () override;
285
286 // Range types.
287 static bool supports_p (const_tree type);
288 virtual bool supports_type_p (const_tree type) const override;
289 virtual tree type () const override;
290
291 // Iteration over sub-ranges.
292 unsigned num_pairs () const;
293 wide_int lower_bound (unsigned = 0) const;
294 wide_int upper_bound (unsigned) const;
295 wide_int upper_bound () const;
296 virtual tree lbound () const override;
297 virtual tree ubound () const override;
298
299 // Predicates.
300 virtual bool zero_p () const override;
301 virtual bool nonzero_p () const override;
302 virtual bool singleton_p (tree *result = NULL) const override;
303 bool singleton_p (wide_int &) const;
304 bool contains_p (const wide_int &) const;
305 bool nonnegative_p () const;
306 bool nonpositive_p () const;
307
308 // In-place operators.
309 virtual bool union_ (const vrange &) override;
310 virtual bool intersect (const vrange &) override;
311 void invert ();
312
313 // Operator overloads.
314 irange& operator= (const irange &);
315 bool operator== (const irange &) const;
316 bool operator!= (const irange &r) const { return !(*this == r); }
317
318 // Misc methods.
319 virtual bool fits_p (const vrange &r) const override;
320 virtual void accept (const vrange_visitor &v) const override;
321
322 virtual void update_bitmask (const class irange_bitmask &) override;
323 virtual irange_bitmask get_bitmask () const override;
324
325 protected:
326 void maybe_resize (int needed);
327 virtual void set (tree, tree, value_range_kind = VR_RANGE) override;
328 virtual bool contains_p (tree cst) const override;
329 irange (wide_int *, unsigned nranges, bool resizable);
330
331 // In-place operators.
332 bool irange_contains_p (const irange &) const;
333 bool irange_single_pair_union (const irange &r);
334
335 void normalize_kind ();
336
337 void verify_range ();
338
339 // Hard limit on max ranges allowed.
340 static const int HARD_MAX_RANGES = 255;
341 private:
342 bool varying_compatible_p () const;
343 bool intersect_bitmask (const irange &r);
344 bool union_bitmask (const irange &r);
345 bool set_range_from_bitmask ();
346
347 bool intersect (const wide_int& lb, const wide_int& ub);
348 bool union_append (const irange &r);
349 unsigned char m_num_ranges;
350 bool m_resizable;
351 unsigned char m_max_ranges;
352 tree m_type;
353 irange_bitmask m_bitmask;
354 protected:
355 wide_int *m_base;
356 };
357
358 // Here we describe an irange with N pairs of ranges. The storage for
359 // the pairs is embedded in the class as an array.
360 //
361 // If RESIZABLE is true, the storage will be resized on the heap when
362 // the number of ranges needed goes past N up to a max of
363 // HARD_MAX_RANGES. This new storage is freed upon destruction.
364
365 template<unsigned N, bool RESIZABLE = false>
366 class int_range : public irange
367 {
368 public:
369 int_range ();
370 int_range (tree type, const wide_int &, const wide_int &,
371 value_range_kind = VR_RANGE);
372 int_range (tree type);
373 int_range (const int_range &);
374 int_range (const irange &);
375 ~int_range () final override;
376 int_range& operator= (const int_range &);
377 protected:
378 int_range (tree, tree, value_range_kind = VR_RANGE);
379 private:
380 wide_int m_ranges[N*2];
381 };
382
383 class prange : public vrange
384 {
385 friend class prange_storage;
386 friend class vrange_printer;
387 public:
388 prange ();
389 prange (const prange &);
390 prange (tree type);
391 prange (tree type, const wide_int &, const wide_int &,
392 value_range_kind = VR_RANGE);
393 static bool supports_p (const_tree type);
394 virtual bool supports_type_p (const_tree type) const final override;
395 virtual void accept (const vrange_visitor &v) const final override;
396 virtual void set_undefined () final override;
397 virtual void set_varying (tree type) final override;
398 virtual void set_nonzero (tree type) final override;
399 virtual void set_zero (tree type) final override;
400 virtual void set_nonnegative (tree type) final override;
401 virtual bool contains_p (tree cst) const final override;
402 virtual bool fits_p (const vrange &v) const final override;
403 virtual bool singleton_p (tree *result = NULL) const final override;
404 virtual bool zero_p () const final override;
405 virtual bool nonzero_p () const final override;
406 virtual void set (tree, tree, value_range_kind = VR_RANGE) final override;
407 virtual tree type () const final override;
408 virtual bool union_ (const vrange &v) final override;
409 virtual bool intersect (const vrange &v) final override;
410 virtual tree lbound () const final override;
411 virtual tree ubound () const final override;
412
413 prange& operator= (const prange &);
414 bool operator== (const prange &) const;
415 void set (tree type, const wide_int &, const wide_int &,
416 value_range_kind = VR_RANGE);
417 void invert ();
418 bool contains_p (const wide_int &) const;
419 wide_int lower_bound () const;
420 wide_int upper_bound () const;
421 void verify_range () const;
422 irange_bitmask get_bitmask () const final override;
423 void update_bitmask (const irange_bitmask &) final override;
424 protected:
425 bool varying_compatible_p () const;
426
427 tree m_type;
428 wide_int m_min;
429 wide_int m_max;
430 irange_bitmask m_bitmask;
431 };
432
433 // Unsupported temporaries may be created by ranger before it's known
434 // they're unsupported, or by vr_values::get_value_range.
435
436 class unsupported_range : public vrange
437 {
438 public:
439 unsupported_range ()
440 : vrange (VR_UNKNOWN)
441 {
442 set_undefined ();
443 }
444 unsupported_range (const unsupported_range &src)
445 : vrange (VR_UNKNOWN)
446 {
447 unsupported_range::operator= (src);
448 }
449 void set (tree min, tree, value_range_kind = VR_RANGE) final override;
450 tree type () const final override;
451 bool supports_type_p (const_tree) const final override;
452 void set_varying (tree) final override;
453 void set_undefined () final override;
454 void accept (const vrange_visitor &v) const final override;
455 bool union_ (const vrange &r) final override;
456 bool intersect (const vrange &r) final override;
457 bool singleton_p (tree * = NULL) const final override;
458 bool contains_p (tree) const final override;
459 bool zero_p () const final override;
460 bool nonzero_p () const final override;
461 void set_nonzero (tree type) final override;
462 void set_zero (tree type) final override;
463 void set_nonnegative (tree type) final override;
464 bool fits_p (const vrange &) const final override;
465 unsupported_range& operator= (const unsupported_range &r);
466 tree lbound () const final override;
467 tree ubound () const final override;
468 };
469
470 // The NAN state as an opaque object.
471
472 class nan_state
473 {
474 public:
475 nan_state (bool);
476 nan_state (bool pos_nan, bool neg_nan);
477 bool neg_p () const;
478 bool pos_p () const;
479 private:
480 bool m_pos_nan;
481 bool m_neg_nan;
482 };
483
484 // Set NAN state to +-NAN if NAN_P is true. Otherwise set NAN state
485 // to false.
486
487 inline
488 nan_state::nan_state (bool nan_p)
489 {
490 m_pos_nan = nan_p;
491 m_neg_nan = nan_p;
492 }
493
494 // Constructor initializing the object to +NAN if POS_NAN is set, -NAN
495 // if NEG_NAN is set, or +-NAN if both are set. Otherwise POS_NAN and
496 // NEG_NAN are clear, and the object cannot be a NAN.
497
498 inline
499 nan_state::nan_state (bool pos_nan, bool neg_nan)
500 {
501 m_pos_nan = pos_nan;
502 m_neg_nan = neg_nan;
503 }
504
505 // Return if +NAN is possible.
506
507 inline bool
508 nan_state::pos_p () const
509 {
510 return m_pos_nan;
511 }
512
513 // Return if -NAN is possible.
514
515 inline bool
516 nan_state::neg_p () const
517 {
518 return m_neg_nan;
519 }
520
521 // A floating point range.
522 //
523 // The representation is a type with a couple of endpoints, unioned
524 // with the set of { -NAN, +Nan }.
525
526 class frange : public vrange
527 {
528 friend class frange_storage;
529 friend class vrange_printer;
530 public:
531 frange ();
532 frange (const frange &);
533 frange (tree, tree, value_range_kind = VR_RANGE);
534 frange (tree type);
535 frange (tree type, const REAL_VALUE_TYPE &min, const REAL_VALUE_TYPE &max,
536 value_range_kind = VR_RANGE);
537 static bool supports_p (const_tree type)
538 {
539 // ?? Decimal floats can have multiple representations for the
540 // same number. Supporting them may be as simple as just
541 // disabling them in singleton_p. No clue.
542 return SCALAR_FLOAT_TYPE_P (type) && !DECIMAL_FLOAT_TYPE_P (type);
543 }
544 virtual tree type () const override;
545 void set (tree type, const REAL_VALUE_TYPE &, const REAL_VALUE_TYPE &,
546 value_range_kind = VR_RANGE);
547 void set (tree type, const REAL_VALUE_TYPE &, const REAL_VALUE_TYPE &,
548 const nan_state &, value_range_kind = VR_RANGE);
549 void set_nan (tree type);
550 void set_nan (tree type, bool sign);
551 void set_nan (tree type, const nan_state &);
552 virtual void set_varying (tree type) override;
553 virtual void set_undefined () override;
554 virtual bool union_ (const vrange &) override;
555 virtual bool intersect (const vrange &) override;
556 bool contains_p (const REAL_VALUE_TYPE &) const;
557 virtual bool singleton_p (tree *result = NULL) const override;
558 bool singleton_p (REAL_VALUE_TYPE &r) const;
559 virtual bool supports_type_p (const_tree type) const override;
560 virtual void accept (const vrange_visitor &v) const override;
561 virtual bool zero_p () const override;
562 virtual bool nonzero_p () const override;
563 virtual void set_nonzero (tree type) override;
564 virtual void set_zero (tree type) override;
565 virtual void set_nonnegative (tree type) override;
566 virtual bool fits_p (const vrange &) const override;
567 frange& operator= (const frange &);
568 bool operator== (const frange &) const;
569 bool operator!= (const frange &r) const { return !(*this == r); }
570 const REAL_VALUE_TYPE &lower_bound () const;
571 const REAL_VALUE_TYPE &upper_bound () const;
572 virtual tree lbound () const override;
573 virtual tree ubound () const override;
574 nan_state get_nan_state () const;
575 void update_nan ();
576 void update_nan (bool sign);
577 void update_nan (tree) = delete; // Disallow silent conversion to bool.
578 void update_nan (const nan_state &);
579 void clear_nan ();
580 void flush_denormals_to_zero ();
581
582 // fpclassify like API
583 bool known_isfinite () const;
584 bool known_isnan () const;
585 bool known_isinf () const;
586 bool maybe_isnan () const;
587 bool maybe_isnan (bool sign) const;
588 bool maybe_isinf () const;
589 bool signbit_p (bool &signbit) const;
590 bool nan_signbit_p (bool &signbit) const;
591
592 protected:
593 virtual bool contains_p (tree cst) const override;
594 virtual void set (tree, tree, value_range_kind = VR_RANGE) override;
595
596 private:
597 bool internal_singleton_p (REAL_VALUE_TYPE * = NULL) const;
598 void verify_range ();
599 bool normalize_kind ();
600 bool union_nans (const frange &);
601 bool intersect_nans (const frange &);
602 bool combine_zeros (const frange &, bool union_p);
603
604 tree m_type;
605 REAL_VALUE_TYPE m_min;
606 REAL_VALUE_TYPE m_max;
607 bool m_pos_nan;
608 bool m_neg_nan;
609 };
610
611 inline const REAL_VALUE_TYPE &
612 frange::lower_bound () const
613 {
614 gcc_checking_assert (!undefined_p () && !known_isnan ());
615 return m_min;
616 }
617
618 inline const REAL_VALUE_TYPE &
619 frange::upper_bound () const
620 {
621 gcc_checking_assert (!undefined_p () && !known_isnan ());
622 return m_max;
623 }
624
625 // Return the NAN state.
626
627 inline nan_state
628 frange::get_nan_state () const
629 {
630 return nan_state (m_pos_nan, m_neg_nan);
631 }
632
633 // is_a<> and as_a<> implementation for vrange.
634
635 // Anything we haven't specialized is a hard fail.
636 template <typename T>
637 inline bool
638 is_a (vrange &)
639 {
640 gcc_unreachable ();
641 return false;
642 }
643
644 template <typename T>
645 inline bool
646 is_a (const vrange &v)
647 {
648 // Reuse is_a <vrange> to implement the const version.
649 const T &derived = static_cast<const T &> (v);
650 return is_a <T> (const_cast<T &> (derived));
651 }
652
653 template <typename T>
654 inline T &
655 as_a (vrange &v)
656 {
657 gcc_checking_assert (is_a <T> (v));
658 return static_cast <T &> (v);
659 }
660
661 template <typename T>
662 inline const T &
663 as_a (const vrange &v)
664 {
665 gcc_checking_assert (is_a <T> (v));
666 return static_cast <const T &> (v);
667 }
668
669 // Specializations for the different range types.
670
671 template <>
672 inline bool
673 is_a <irange> (vrange &v)
674 {
675 return v.m_discriminator == VR_IRANGE;
676 }
677
678 template <>
679 inline bool
680 is_a <prange> (vrange &v)
681 {
682 return v.m_discriminator == VR_PRANGE;
683 }
684
685 template <>
686 inline bool
687 is_a <frange> (vrange &v)
688 {
689 return v.m_discriminator == VR_FRANGE;
690 }
691
692 template <>
693 inline bool
694 is_a <unsupported_range> (vrange &v)
695 {
696 return v.m_discriminator == VR_UNKNOWN;
697 }
698
699 // For resizable ranges, resize the range up to HARD_MAX_RANGES if the
700 // NEEDED pairs is greater than the current capacity of the range.
701
702 inline void
703 irange::maybe_resize (int needed)
704 {
705 if (!m_resizable || m_max_ranges == HARD_MAX_RANGES)
706 return;
707
708 if (needed > m_max_ranges)
709 {
710 m_max_ranges = HARD_MAX_RANGES;
711 wide_int *newmem = new wide_int[m_max_ranges * 2];
712 unsigned n = num_pairs () * 2;
713 for (unsigned i = 0; i < n; ++i)
714 newmem[i] = m_base[i];
715 m_base = newmem;
716 }
717 }
718
719 template<unsigned N, bool RESIZABLE>
720 inline
721 int_range<N, RESIZABLE>::~int_range ()
722 {
723 if (RESIZABLE && m_base != m_ranges)
724 delete[] m_base;
725 }
726
727 // This is an "infinite" precision irange for use in temporary
728 // calculations. It starts with a sensible default covering 99% of
729 // uses, and goes up to HARD_MAX_RANGES when needed. Any allocated
730 // storage is freed upon destruction.
731 typedef int_range<3, /*RESIZABLE=*/true> int_range_max;
732
733 class vrange_visitor
734 {
735 public:
736 virtual void visit (const irange &) const { }
737 virtual void visit (const prange &) const { }
738 virtual void visit (const frange &) const { }
739 virtual void visit (const unsupported_range &) const { }
740 };
741
742 typedef int_range<2> value_range;
743
744 // This is an "infinite" precision range object for use in temporary
745 // calculations for any of the handled types. The object can be
746 // transparently used as a vrange.
747 //
748 // Using any of the various constructors initializes the object
749 // appropriately, but the default constructor is uninitialized and
750 // must be initialized either with set_type() or by assigning into it.
751 //
752 // Assigning between incompatible types is allowed. For example if a
753 // temporary holds an irange, you can assign an frange into it, and
754 // all the right things will happen. However, before passing this
755 // object to a function accepting a vrange, the correct type must be
756 // set. If it isn't, you can do so with set_type().
757
758 class Value_Range
759 {
760 public:
761 Value_Range ();
762 Value_Range (const vrange &r);
763 Value_Range (tree type);
764 Value_Range (tree, tree, value_range_kind kind = VR_RANGE);
765 Value_Range (const Value_Range &);
766 ~Value_Range ();
767 void set_type (tree type);
768 vrange& operator= (const vrange &);
769 Value_Range& operator= (const Value_Range &);
770 bool operator== (const Value_Range &r) const;
771 bool operator!= (const Value_Range &r) const;
772 operator vrange &();
773 operator const vrange &() const;
774 void dump (FILE *) const;
775 static bool supports_type_p (const_tree type);
776
777 tree type () { return m_vrange->type (); }
778 bool varying_p () const { return m_vrange->varying_p (); }
779 bool undefined_p () const { return m_vrange->undefined_p (); }
780 void set_varying (tree type) { init (type); m_vrange->set_varying (type); }
781 void set_undefined () { m_vrange->set_undefined (); }
782 bool union_ (const vrange &r) { return m_vrange->union_ (r); }
783 bool intersect (const vrange &r) { return m_vrange->intersect (r); }
784 bool contains_p (tree cst) const { return m_vrange->contains_p (cst); }
785 bool singleton_p (tree *result = NULL) const
786 { return m_vrange->singleton_p (result); }
787 void set_zero (tree type) { init (type); return m_vrange->set_zero (type); }
788 void set_nonzero (tree type)
789 { init (type); return m_vrange->set_nonzero (type); }
790 bool nonzero_p () const { return m_vrange->nonzero_p (); }
791 bool zero_p () const { return m_vrange->zero_p (); }
792 tree lbound () const { return m_vrange->lbound (); }
793 tree ubound () const { return m_vrange->ubound (); }
794 irange_bitmask get_bitmask () const { return m_vrange->get_bitmask (); }
795 void update_bitmask (const class irange_bitmask &bm)
796 { return m_vrange->update_bitmask (bm); }
797 void accept (const vrange_visitor &v) const { m_vrange->accept (v); }
798 private:
799 void init (tree type);
800 void init (const vrange &);
801
802 vrange *m_vrange;
803 union buffer_type {
804 int_range_max ints;
805 frange floats;
806 unsupported_range unsupported;
807 prange pointers;
808 buffer_type () { }
809 ~buffer_type () { }
810 } m_buffer;
811 };
812
813 // The default constructor is uninitialized and must be initialized
814 // with either set_type() or with an assignment into it.
815
816 inline
817 Value_Range::Value_Range ()
818 : m_buffer ()
819 {
820 m_vrange = NULL;
821 }
822
823 // Copy constructor.
824
825 inline
826 Value_Range::Value_Range (const Value_Range &r)
827 {
828 init (*r.m_vrange);
829 }
830
831 // Copy constructor from a vrange.
832
833 inline
834 Value_Range::Value_Range (const vrange &r)
835 {
836 init (r);
837 }
838
839 // Construct an UNDEFINED range that can hold ranges of TYPE. If TYPE
840 // is not supported, default to unsupported_range.
841
842 inline
843 Value_Range::Value_Range (tree type)
844 {
845 init (type);
846 }
847
848 // Construct a range that can hold a range of [MIN, MAX], where MIN
849 // and MAX are trees.
850
851 inline
852 Value_Range::Value_Range (tree min, tree max, value_range_kind kind)
853 {
854 init (TREE_TYPE (min));
855 m_vrange->set (min, max, kind);
856 }
857
858 inline
859 Value_Range::~Value_Range ()
860 {
861 if (m_vrange)
862 m_vrange->~vrange ();
863 }
864
865 // Initialize object to an UNDEFINED range that can hold ranges of
866 // TYPE. Clean-up memory if there was a previous object.
867
868 inline void
869 Value_Range::set_type (tree type)
870 {
871 if (m_vrange)
872 m_vrange->~vrange ();
873 init (type);
874 }
875
876 // Initialize object to an UNDEFINED range that can hold ranges of
877 // TYPE.
878
879 inline void
880 Value_Range::init (tree type)
881 {
882 gcc_checking_assert (TYPE_P (type));
883
884 if (irange::supports_p (type))
885 m_vrange = new (&m_buffer.ints) int_range_max ();
886 else if (prange::supports_p (type))
887 m_vrange = new (&m_buffer.pointers) prange ();
888 else if (frange::supports_p (type))
889 m_vrange = new (&m_buffer.floats) frange ();
890 else
891 m_vrange = new (&m_buffer.unsupported) unsupported_range ();
892 }
893
894 // Initialize object with a copy of R.
895
896 inline void
897 Value_Range::init (const vrange &r)
898 {
899 if (is_a <irange> (r))
900 m_vrange = new (&m_buffer.ints) int_range_max (as_a <irange> (r));
901 else if (is_a <prange> (r))
902 m_vrange = new (&m_buffer.pointers) prange (as_a <prange> (r));
903 else if (is_a <frange> (r))
904 m_vrange = new (&m_buffer.floats) frange (as_a <frange> (r));
905 else
906 m_vrange = new (&m_buffer.unsupported)
907 unsupported_range (as_a <unsupported_range> (r));
908 }
909
910 // Assignment operator. Copying incompatible types is allowed. That
911 // is, assigning an frange to an object holding an irange does the
912 // right thing.
913
914 inline vrange &
915 Value_Range::operator= (const vrange &r)
916 {
917 if (m_vrange)
918 m_vrange->~vrange ();
919 init (r);
920 return *m_vrange;
921 }
922
923 inline Value_Range &
924 Value_Range::operator= (const Value_Range &r)
925 {
926 // No need to call the m_vrange destructor here, as we will do so in
927 // the assignment below.
928 *this = *r.m_vrange;
929 return *this;
930 }
931
932 inline bool
933 Value_Range::operator== (const Value_Range &r) const
934 {
935 return *m_vrange == *r.m_vrange;
936 }
937
938 inline bool
939 Value_Range::operator!= (const Value_Range &r) const
940 {
941 return *m_vrange != *r.m_vrange;
942 }
943
944 inline
945 Value_Range::operator vrange &()
946 {
947 return *m_vrange;
948 }
949
950 inline
951 Value_Range::operator const vrange &() const
952 {
953 return *m_vrange;
954 }
955
956 // Return TRUE if TYPE is supported by the vrange infrastructure.
957
958 inline bool
959 Value_Range::supports_type_p (const_tree type)
960 {
961 return irange::supports_p (type)
962 || prange::supports_p (type)
963 || frange::supports_p (type);
964 }
965
966 extern value_range_kind get_legacy_range (const vrange &, tree &min, tree &max);
967 extern void dump_value_range (FILE *, const vrange *);
968 extern bool vrp_operand_equal_p (const_tree, const_tree);
969 inline REAL_VALUE_TYPE frange_val_min (const_tree type);
970 inline REAL_VALUE_TYPE frange_val_max (const_tree type);
971
972 // Number of sub-ranges in a range.
973
974 inline unsigned
975 irange::num_pairs () const
976 {
977 return m_num_ranges;
978 }
979
980 inline tree
981 irange::type () const
982 {
983 gcc_checking_assert (m_num_ranges > 0);
984 return m_type;
985 }
986
987 inline bool
988 irange::varying_compatible_p () const
989 {
990 if (m_num_ranges != 1)
991 return false;
992
993 const wide_int &l = m_base[0];
994 const wide_int &u = m_base[1];
995 tree t = m_type;
996
997 if (m_kind == VR_VARYING)
998 return true;
999
1000 unsigned prec = TYPE_PRECISION (t);
1001 signop sign = TYPE_SIGN (t);
1002 if (INTEGRAL_TYPE_P (t) || POINTER_TYPE_P (t))
1003 return (l == wi::min_value (prec, sign)
1004 && u == wi::max_value (prec, sign)
1005 && m_bitmask.unknown_p ());
1006 return true;
1007 }
1008
1009 inline bool
1010 vrange::varying_p () const
1011 {
1012 return m_kind == VR_VARYING;
1013 }
1014
1015 inline bool
1016 vrange::undefined_p () const
1017 {
1018 return m_kind == VR_UNDEFINED;
1019 }
1020
1021 inline bool
1022 irange::zero_p () const
1023 {
1024 return (m_kind == VR_RANGE && m_num_ranges == 1
1025 && lower_bound (0) == 0
1026 && upper_bound (0) == 0);
1027 }
1028
1029 inline bool
1030 irange::nonzero_p () const
1031 {
1032 if (undefined_p ())
1033 return false;
1034
1035 wide_int zero = wi::zero (TYPE_PRECISION (type ()));
1036 return *this == int_range<2> (type (), zero, zero, VR_ANTI_RANGE);
1037 }
1038
1039 inline bool
1040 irange::supports_p (const_tree type)
1041 {
1042 return INTEGRAL_TYPE_P (type);
1043 }
1044
1045 inline bool
1046 irange::contains_p (tree cst) const
1047 {
1048 return contains_p (wi::to_wide (cst));
1049 }
1050
1051 inline bool
1052 range_includes_zero_p (const vrange &vr)
1053 {
1054 if (vr.undefined_p ())
1055 return false;
1056
1057 if (vr.varying_p ())
1058 return true;
1059
1060 return vr.contains_p (build_zero_cst (vr.type ()));
1061 }
1062
1063 // Constructors for irange
1064
1065 inline
1066 irange::irange (wide_int *base, unsigned nranges, bool resizable)
1067 : vrange (VR_IRANGE),
1068 m_resizable (resizable),
1069 m_max_ranges (nranges)
1070 {
1071 m_base = base;
1072 set_undefined ();
1073 }
1074
1075 // Constructors for int_range<>.
1076
1077 template<unsigned N, bool RESIZABLE>
1078 inline
1079 int_range<N, RESIZABLE>::int_range ()
1080 : irange (m_ranges, N, RESIZABLE)
1081 {
1082 }
1083
1084 template<unsigned N, bool RESIZABLE>
1085 int_range<N, RESIZABLE>::int_range (const int_range &other)
1086 : irange (m_ranges, N, RESIZABLE)
1087 {
1088 irange::operator= (other);
1089 }
1090
1091 template<unsigned N, bool RESIZABLE>
1092 int_range<N, RESIZABLE>::int_range (tree min, tree max, value_range_kind kind)
1093 : irange (m_ranges, N, RESIZABLE)
1094 {
1095 irange::set (min, max, kind);
1096 }
1097
1098 template<unsigned N, bool RESIZABLE>
1099 int_range<N, RESIZABLE>::int_range (tree type)
1100 : irange (m_ranges, N, RESIZABLE)
1101 {
1102 set_varying (type);
1103 }
1104
1105 template<unsigned N, bool RESIZABLE>
1106 int_range<N, RESIZABLE>::int_range (tree type, const wide_int &wmin, const wide_int &wmax,
1107 value_range_kind kind)
1108 : irange (m_ranges, N, RESIZABLE)
1109 {
1110 set (type, wmin, wmax, kind);
1111 }
1112
1113 template<unsigned N, bool RESIZABLE>
1114 int_range<N, RESIZABLE>::int_range (const irange &other)
1115 : irange (m_ranges, N, RESIZABLE)
1116 {
1117 irange::operator= (other);
1118 }
1119
1120 template<unsigned N, bool RESIZABLE>
1121 int_range<N, RESIZABLE>&
1122 int_range<N, RESIZABLE>::operator= (const int_range &src)
1123 {
1124 irange::operator= (src);
1125 return *this;
1126 }
1127
1128 inline void
1129 irange::set_undefined ()
1130 {
1131 m_kind = VR_UNDEFINED;
1132 m_num_ranges = 0;
1133 }
1134
1135 inline void
1136 irange::set_varying (tree type)
1137 {
1138 m_kind = VR_VARYING;
1139 m_num_ranges = 1;
1140 m_bitmask.set_unknown (TYPE_PRECISION (type));
1141
1142 if (INTEGRAL_TYPE_P (type) || POINTER_TYPE_P (type))
1143 {
1144 m_type = type;
1145 // Strict enum's require varying to be not TYPE_MIN/MAX, but rather
1146 // min_value and max_value.
1147 m_base[0] = wi::min_value (TYPE_PRECISION (type), TYPE_SIGN (type));
1148 m_base[1] = wi::max_value (TYPE_PRECISION (type), TYPE_SIGN (type));
1149 }
1150 else
1151 m_type = error_mark_node;
1152 }
1153
1154 // Return the lower bound of a sub-range. PAIR is the sub-range in
1155 // question.
1156
1157 inline wide_int
1158 irange::lower_bound (unsigned pair) const
1159 {
1160 gcc_checking_assert (m_num_ranges > 0);
1161 gcc_checking_assert (pair + 1 <= num_pairs ());
1162 return m_base[pair * 2];
1163 }
1164
1165 // Return the upper bound of a sub-range. PAIR is the sub-range in
1166 // question.
1167
1168 inline wide_int
1169 irange::upper_bound (unsigned pair) const
1170 {
1171 gcc_checking_assert (m_num_ranges > 0);
1172 gcc_checking_assert (pair + 1 <= num_pairs ());
1173 return m_base[pair * 2 + 1];
1174 }
1175
1176 // Return the highest bound of a range.
1177
1178 inline wide_int
1179 irange::upper_bound () const
1180 {
1181 unsigned pairs = num_pairs ();
1182 gcc_checking_assert (pairs > 0);
1183 return upper_bound (pairs - 1);
1184 }
1185
1186 // Set value range VR to a nonzero range of type TYPE.
1187
1188 inline void
1189 irange::set_nonzero (tree type)
1190 {
1191 unsigned prec = TYPE_PRECISION (type);
1192
1193 if (TYPE_UNSIGNED (type))
1194 {
1195 m_type = type;
1196 m_kind = VR_RANGE;
1197 m_base[0] = wi::one (prec);
1198 m_base[1] = wi::minus_one (prec);
1199 m_bitmask.set_unknown (prec);
1200 m_num_ranges = 1;
1201
1202 if (flag_checking)
1203 verify_range ();
1204 }
1205 else
1206 {
1207 wide_int zero = wi::zero (prec);
1208 set (type, zero, zero, VR_ANTI_RANGE);
1209 }
1210 }
1211
1212 // Set value range VR to a ZERO range of type TYPE.
1213
1214 inline void
1215 irange::set_zero (tree type)
1216 {
1217 wide_int zero = wi::zero (TYPE_PRECISION (type));
1218 set (type, zero, zero);
1219 }
1220
1221 // Normalize a range to VARYING or UNDEFINED if possible.
1222
1223 inline void
1224 irange::normalize_kind ()
1225 {
1226 if (m_num_ranges == 0)
1227 set_undefined ();
1228 else if (varying_compatible_p ())
1229 {
1230 if (m_kind == VR_RANGE)
1231 m_kind = VR_VARYING;
1232 else if (m_kind == VR_ANTI_RANGE)
1233 set_undefined ();
1234 }
1235 if (flag_checking)
1236 verify_range ();
1237 }
1238
1239 inline bool
1240 contains_zero_p (const irange &r)
1241 {
1242 if (r.undefined_p ())
1243 return false;
1244
1245 wide_int zero = wi::zero (TYPE_PRECISION (r.type ()));
1246 return r.contains_p (zero);
1247 }
1248
1249 inline wide_int
1250 irange_val_min (const_tree type)
1251 {
1252 gcc_checking_assert (irange::supports_p (type));
1253 return wi::min_value (TYPE_PRECISION (type), TYPE_SIGN (type));
1254 }
1255
1256 inline wide_int
1257 irange_val_max (const_tree type)
1258 {
1259 gcc_checking_assert (irange::supports_p (type));
1260 return wi::max_value (TYPE_PRECISION (type), TYPE_SIGN (type));
1261 }
1262
1263 inline
1264 prange::prange ()
1265 : vrange (VR_PRANGE)
1266 {
1267 set_undefined ();
1268 }
1269
1270 inline
1271 prange::prange (const prange &r)
1272 : vrange (VR_PRANGE)
1273 {
1274 *this = r;
1275 }
1276
1277 inline
1278 prange::prange (tree type)
1279 : vrange (VR_PRANGE)
1280 {
1281 set_varying (type);
1282 }
1283
1284 inline
1285 prange::prange (tree type, const wide_int &lb, const wide_int &ub,
1286 value_range_kind kind)
1287 : vrange (VR_PRANGE)
1288 {
1289 set (type, lb, ub, kind);
1290 }
1291
1292 inline bool
1293 prange::supports_p (const_tree type)
1294 {
1295 return POINTER_TYPE_P (type);
1296 }
1297
1298 inline bool
1299 prange::supports_type_p (const_tree type) const
1300 {
1301 return POINTER_TYPE_P (type);
1302 }
1303
1304 inline void
1305 prange::set_undefined ()
1306 {
1307 m_kind = VR_UNDEFINED;
1308 }
1309
1310 inline void
1311 prange::set_varying (tree type)
1312 {
1313 m_kind = VR_VARYING;
1314 m_type = type;
1315 m_min = wi::zero (TYPE_PRECISION (type));
1316 m_max = wi::max_value (TYPE_PRECISION (type), UNSIGNED);
1317 m_bitmask.set_unknown (TYPE_PRECISION (type));
1318
1319 if (flag_checking)
1320 verify_range ();
1321 }
1322
1323 inline void
1324 prange::set_nonzero (tree type)
1325 {
1326 m_kind = VR_RANGE;
1327 m_type = type;
1328 m_min = wi::one (TYPE_PRECISION (type));
1329 m_max = wi::max_value (TYPE_PRECISION (type), UNSIGNED);
1330 m_bitmask.set_unknown (TYPE_PRECISION (type));
1331
1332 if (flag_checking)
1333 verify_range ();
1334 }
1335
1336 inline void
1337 prange::set_zero (tree type)
1338 {
1339 m_kind = VR_RANGE;
1340 m_type = type;
1341 wide_int zero = wi::zero (TYPE_PRECISION (type));
1342 m_min = m_max = zero;
1343 m_bitmask = irange_bitmask (zero, zero);
1344
1345 if (flag_checking)
1346 verify_range ();
1347 }
1348
1349 inline bool
1350 prange::contains_p (tree cst) const
1351 {
1352 return contains_p (wi::to_wide (cst));
1353 }
1354
1355 inline bool
1356 prange::zero_p () const
1357 {
1358 return m_kind == VR_RANGE && m_min == 0 && m_max == 0;
1359 }
1360
1361 inline bool
1362 prange::nonzero_p () const
1363 {
1364 return m_kind == VR_RANGE && m_min == 1 && m_max == -1;
1365 }
1366
1367 inline tree
1368 prange::type () const
1369 {
1370 gcc_checking_assert (!undefined_p ());
1371 return m_type;
1372 }
1373
1374 inline wide_int
1375 prange::lower_bound () const
1376 {
1377 gcc_checking_assert (!undefined_p ());
1378 return m_min;
1379 }
1380
1381 inline wide_int
1382 prange::upper_bound () const
1383 {
1384 gcc_checking_assert (!undefined_p ());
1385 return m_max;
1386 }
1387
1388 inline bool
1389 prange::varying_compatible_p () const
1390 {
1391 return (!undefined_p ()
1392 && m_min == 0 && m_max == -1 && get_bitmask ().unknown_p ());
1393 }
1394
1395 inline irange_bitmask
1396 prange::get_bitmask () const
1397 {
1398 return m_bitmask;
1399 }
1400
1401 inline bool
1402 prange::fits_p (const vrange &) const
1403 {
1404 return true;
1405 }
1406
1407
1408 inline
1409 frange::frange ()
1410 : vrange (VR_FRANGE)
1411 {
1412 set_undefined ();
1413 }
1414
1415 inline
1416 frange::frange (const frange &src)
1417 : vrange (VR_FRANGE)
1418 {
1419 *this = src;
1420 }
1421
1422 inline
1423 frange::frange (tree type)
1424 : vrange (VR_FRANGE)
1425 {
1426 set_varying (type);
1427 }
1428
1429 // frange constructor from REAL_VALUE_TYPE endpoints.
1430
1431 inline
1432 frange::frange (tree type,
1433 const REAL_VALUE_TYPE &min, const REAL_VALUE_TYPE &max,
1434 value_range_kind kind)
1435 : vrange (VR_FRANGE)
1436 {
1437 set (type, min, max, kind);
1438 }
1439
1440 // frange constructor from trees.
1441
1442 inline
1443 frange::frange (tree min, tree max, value_range_kind kind)
1444 : vrange (VR_FRANGE)
1445 {
1446 set (min, max, kind);
1447 }
1448
1449 inline tree
1450 frange::type () const
1451 {
1452 gcc_checking_assert (!undefined_p ());
1453 return m_type;
1454 }
1455
1456 inline void
1457 frange::set_varying (tree type)
1458 {
1459 m_kind = VR_VARYING;
1460 m_type = type;
1461 m_min = frange_val_min (type);
1462 m_max = frange_val_max (type);
1463 if (HONOR_NANS (m_type))
1464 {
1465 m_pos_nan = true;
1466 m_neg_nan = true;
1467 }
1468 else
1469 {
1470 m_pos_nan = false;
1471 m_neg_nan = false;
1472 }
1473 }
1474
1475 inline void
1476 frange::set_undefined ()
1477 {
1478 m_kind = VR_UNDEFINED;
1479 m_type = NULL;
1480 m_pos_nan = false;
1481 m_neg_nan = false;
1482 // m_min and m_min are uninitialized as they are REAL_VALUE_TYPE ??.
1483 if (flag_checking)
1484 verify_range ();
1485 }
1486
1487 // Set the NAN bits to NAN and adjust the range.
1488
1489 inline void
1490 frange::update_nan (const nan_state &nan)
1491 {
1492 gcc_checking_assert (!undefined_p ());
1493 if (HONOR_NANS (m_type))
1494 {
1495 m_pos_nan = nan.pos_p ();
1496 m_neg_nan = nan.neg_p ();
1497 normalize_kind ();
1498 if (flag_checking)
1499 verify_range ();
1500 }
1501 }
1502
1503 // Set the NAN bit to +-NAN.
1504
1505 inline void
1506 frange::update_nan ()
1507 {
1508 gcc_checking_assert (!undefined_p ());
1509 nan_state nan (true);
1510 update_nan (nan);
1511 }
1512
1513 // Like above, but set the sign of the NAN.
1514
1515 inline void
1516 frange::update_nan (bool sign)
1517 {
1518 gcc_checking_assert (!undefined_p ());
1519 nan_state nan (/*pos=*/!sign, /*neg=*/sign);
1520 update_nan (nan);
1521 }
1522
1523 inline bool
1524 frange::contains_p (tree cst) const
1525 {
1526 return contains_p (*TREE_REAL_CST_PTR (cst));
1527 }
1528
1529 // Clear the NAN bit and adjust the range.
1530
1531 inline void
1532 frange::clear_nan ()
1533 {
1534 gcc_checking_assert (!undefined_p ());
1535 m_pos_nan = false;
1536 m_neg_nan = false;
1537 normalize_kind ();
1538 if (flag_checking)
1539 verify_range ();
1540 }
1541
1542 // Set R to maximum representable value for TYPE.
1543
1544 inline REAL_VALUE_TYPE
1545 real_max_representable (const_tree type)
1546 {
1547 REAL_VALUE_TYPE r;
1548 char buf[128];
1549 get_max_float (REAL_MODE_FORMAT (TYPE_MODE (type)),
1550 buf, sizeof (buf), false);
1551 int res = real_from_string (&r, buf);
1552 gcc_checking_assert (!res);
1553 return r;
1554 }
1555
1556 // Return the minimum representable value for TYPE.
1557
1558 inline REAL_VALUE_TYPE
1559 real_min_representable (const_tree type)
1560 {
1561 REAL_VALUE_TYPE r = real_max_representable (type);
1562 r = real_value_negate (&r);
1563 return r;
1564 }
1565
1566 // Return the minimum value for TYPE.
1567
1568 inline REAL_VALUE_TYPE
1569 frange_val_min (const_tree type)
1570 {
1571 if (HONOR_INFINITIES (type))
1572 return dconstninf;
1573 else
1574 return real_min_representable (type);
1575 }
1576
1577 // Return the maximum value for TYPE.
1578
1579 inline REAL_VALUE_TYPE
1580 frange_val_max (const_tree type)
1581 {
1582 if (HONOR_INFINITIES (type))
1583 return dconstinf;
1584 else
1585 return real_max_representable (type);
1586 }
1587
1588 // Return TRUE if R is the minimum value for TYPE.
1589
1590 inline bool
1591 frange_val_is_min (const REAL_VALUE_TYPE &r, const_tree type)
1592 {
1593 REAL_VALUE_TYPE min = frange_val_min (type);
1594 return real_identical (&min, &r);
1595 }
1596
1597 // Return TRUE if R is the max value for TYPE.
1598
1599 inline bool
1600 frange_val_is_max (const REAL_VALUE_TYPE &r, const_tree type)
1601 {
1602 REAL_VALUE_TYPE max = frange_val_max (type);
1603 return real_identical (&max, &r);
1604 }
1605
1606 // Build a NAN with a state of NAN.
1607
1608 inline void
1609 frange::set_nan (tree type, const nan_state &nan)
1610 {
1611 gcc_checking_assert (nan.pos_p () || nan.neg_p ());
1612 if (HONOR_NANS (type))
1613 {
1614 m_kind = VR_NAN;
1615 m_type = type;
1616 m_neg_nan = nan.neg_p ();
1617 m_pos_nan = nan.pos_p ();
1618 if (flag_checking)
1619 verify_range ();
1620 }
1621 else
1622 set_undefined ();
1623 }
1624
1625 // Build a signless NAN of type TYPE.
1626
1627 inline void
1628 frange::set_nan (tree type)
1629 {
1630 nan_state nan (true);
1631 set_nan (type, nan);
1632 }
1633
1634 // Build a NAN of type TYPE with SIGN.
1635
1636 inline void
1637 frange::set_nan (tree type, bool sign)
1638 {
1639 nan_state nan (/*pos=*/!sign, /*neg=*/sign);
1640 set_nan (type, nan);
1641 }
1642
1643 // Return TRUE if range is known to be finite.
1644
1645 inline bool
1646 frange::known_isfinite () const
1647 {
1648 if (undefined_p () || varying_p () || m_kind == VR_ANTI_RANGE)
1649 return false;
1650 return (!maybe_isnan () && !real_isinf (&m_min) && !real_isinf (&m_max));
1651 }
1652
1653 // Return TRUE if range may be infinite.
1654
1655 inline bool
1656 frange::maybe_isinf () const
1657 {
1658 if (undefined_p () || m_kind == VR_ANTI_RANGE || m_kind == VR_NAN)
1659 return false;
1660 if (varying_p ())
1661 return true;
1662 return real_isinf (&m_min) || real_isinf (&m_max);
1663 }
1664
1665 // Return TRUE if range is known to be the [-INF,-INF] or [+INF,+INF].
1666
1667 inline bool
1668 frange::known_isinf () const
1669 {
1670 return (m_kind == VR_RANGE
1671 && !maybe_isnan ()
1672 && real_identical (&m_min, &m_max)
1673 && real_isinf (&m_min));
1674 }
1675
1676 // Return TRUE if range is possibly a NAN.
1677
1678 inline bool
1679 frange::maybe_isnan () const
1680 {
1681 if (undefined_p ())
1682 return false;
1683 return m_pos_nan || m_neg_nan;
1684 }
1685
1686 // Return TRUE if range is possibly a NAN with SIGN.
1687
1688 inline bool
1689 frange::maybe_isnan (bool sign) const
1690 {
1691 if (undefined_p ())
1692 return false;
1693 if (sign)
1694 return m_neg_nan;
1695 return m_pos_nan;
1696 }
1697
1698 // Return TRUE if range is a +NAN or -NAN.
1699
1700 inline bool
1701 frange::known_isnan () const
1702 {
1703 return m_kind == VR_NAN;
1704 }
1705
1706 // If the signbit for the range is known, set it in SIGNBIT and return
1707 // TRUE.
1708
1709 inline bool
1710 frange::signbit_p (bool &signbit) const
1711 {
1712 if (undefined_p ())
1713 return false;
1714
1715 // NAN with unknown sign.
1716 if (m_pos_nan && m_neg_nan)
1717 return false;
1718 // No NAN.
1719 if (!m_pos_nan && !m_neg_nan)
1720 {
1721 if (m_min.sign == m_max.sign)
1722 {
1723 signbit = m_min.sign;
1724 return true;
1725 }
1726 return false;
1727 }
1728 // NAN with known sign.
1729 bool nan_sign = m_neg_nan;
1730 if (known_isnan ()
1731 || (nan_sign == m_min.sign && nan_sign == m_max.sign))
1732 {
1733 signbit = nan_sign;
1734 return true;
1735 }
1736 return false;
1737 }
1738
1739 // If range has a NAN with a known sign, set it in SIGNBIT and return
1740 // TRUE.
1741
1742 inline bool
1743 frange::nan_signbit_p (bool &signbit) const
1744 {
1745 if (undefined_p ())
1746 return false;
1747
1748 if (m_pos_nan == m_neg_nan)
1749 return false;
1750
1751 signbit = m_neg_nan;
1752 return true;
1753 }
1754
1755 void frange_nextafter (enum machine_mode, REAL_VALUE_TYPE &,
1756 const REAL_VALUE_TYPE &);
1757 void frange_arithmetic (enum tree_code, tree, REAL_VALUE_TYPE &,
1758 const REAL_VALUE_TYPE &, const REAL_VALUE_TYPE &,
1759 const REAL_VALUE_TYPE &);
1760
1761 // Return true if TYPE1 and TYPE2 are compatible range types.
1762
1763 inline bool
1764 range_compatible_p (tree type1, tree type2)
1765 {
1766 // types_compatible_p requires conversion in both directions to be useless.
1767 // GIMPLE only requires a cast one way in order to be compatible.
1768 // Ranges really only need the sign and precision to be the same.
1769 return TYPE_SIGN (type1) == TYPE_SIGN (type2)
1770 && (TYPE_PRECISION (type1) == TYPE_PRECISION (type2)
1771 // FIXME: As PR112788 shows, for now on rs6000 _Float128 has
1772 // type precision 128 while long double has type precision 127
1773 // but both have the same mode so their precision is actually
1774 // the same, workaround it temporarily.
1775 || (SCALAR_FLOAT_TYPE_P (type1)
1776 && TYPE_MODE (type1) == TYPE_MODE (type2)));
1777 }
1778 #endif // GCC_VALUE_RANGE_H