1 /* Support routines for value ranges.
2 Copyright (C) 2019-2025 Free Software Foundation, Inc.
3 Contributed by Aldy Hernandez <aldyh@redhat.com> and
4 Andrew Macleod <amacleod@redhat.com>.
6 This file is part of GCC.
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)
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.
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/>. */
22 #ifndef GCC_VALUE_RANGE_H
23 #define GCC_VALUE_RANGE_H
27 // Types of value ranges.
32 /* Range spans the entire domain. */
34 /* Range is [MIN, MAX]. */
36 /* Range is ~[MIN, MAX]. */
40 /* Range is a nice guy. */
44 // Discriminator between different vrange types.
46 enum value_range_discriminator
48 // Range holds an integer or pointer.
52 // Floating point range.
54 // Range holds an unsupported type.
58 // Abstract class for ranges of any of the supported types.
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.
64 // To query what a given vrange variant can support, use:
65 // irange::supports_p ()
66 // frange::supports_p ()
69 // To query what a range object can support, use:
70 // void foo (vrange &v, irange &i, frange &f)
72 // if (v.supports_type_p (type)) ...
73 // if (i.supports_type_p (type)) ...
74 // if (f.supports_type_p (type)) ...
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
;
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
);
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;
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;
122 extern void add_vrange (const vrange
&, hash
&, unsigned flags
= 0);
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.
129 // Set bits in MASK (no meaningful information) must have their
130 // corresponding bits in VALUE cleared, as this speeds up union and
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;
151 bool member_p (const wide_int
&val
) const;
152 void adjust_range (irange
&r
) const;
154 // Convenience functions for nonzero bitmask compatibility.
155 wide_int
get_nonzero_bits () const;
156 void set_nonzero_bits (const wide_int
&bits
);
163 irange_bitmask::set_unknown (unsigned prec
)
165 m_value
= wi::zero (prec
);
166 m_mask
= wi::minus_one (prec
);
171 // Return TRUE if THIS does not have any meaningful information.
174 irange_bitmask::unknown_p () const
180 irange_bitmask::irange_bitmask (const wide_int
&value
, const wide_int
&mask
)
189 irange_bitmask::get_precision () const
191 return m_mask
.get_precision ();
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.
198 // Return the nonzero bits.
200 irange_bitmask::get_nonzero_bits () const
202 return m_value
| m_mask
;
205 // Set the bitmask to the nonzero bits in BITS.
207 irange_bitmask::set_nonzero_bits (const wide_int
&bits
)
209 m_value
= wi::zero (bits
.get_precision ());
215 // Return TRUE if val could be a valid value with this bitmask.
218 irange_bitmask::member_p (const wide_int
&val
) const
222 wide_int res
= m_mask
& val
;
224 res
|= ~m_mask
& m_value
;
229 irange_bitmask::operator== (const irange_bitmask
&src
) const
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
;
239 irange_bitmask::union_ (const irange_bitmask
&src
)
241 m_mask
= (m_mask
| src
.m_mask
) | (m_value
^ src
.m_value
);
242 m_value
= m_value
& src
.m_value
;
248 irange_bitmask::intersect (const irange_bitmask
&src
)
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)
257 unsigned prec
= m_mask
.get_precision ();
258 m_mask
= wi::minus_one (prec
);
259 m_value
= wi::zero (prec
);
263 m_mask
= m_mask
& src
.m_mask
;
264 m_value
= m_value
| src
.m_value
;
270 // An integer range without any storage.
272 class irange
: public vrange
274 friend class irange_storage
;
275 friend class vrange_printer
;
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
;
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
;
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
;
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;
308 // In-place operators.
309 virtual bool union_ (const vrange
&) override
;
310 virtual bool intersect (const vrange
&) override
;
313 // Operator overloads.
314 irange
& operator= (const irange
&);
315 bool operator== (const irange
&) const;
316 bool operator!= (const irange
&r
) const { return !(*this == r
); }
319 virtual bool fits_p (const vrange
&r
) const override
;
320 virtual void accept (const vrange_visitor
&v
) const override
;
322 virtual void update_bitmask (const class irange_bitmask
&) override
;
323 virtual irange_bitmask
get_bitmask () const override
;
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
);
331 // In-place operators.
332 bool irange_contains_p (const irange
&) const;
333 bool irange_single_pair_union (const irange
&r
);
335 void normalize_kind ();
337 void verify_range ();
339 // Hard limit on max ranges allowed.
340 static const int HARD_MAX_RANGES
= 255;
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 ();
347 bool intersect (const wide_int
& lb
, const wide_int
& ub
);
348 bool union_append (const irange
&r
);
349 unsigned char m_num_ranges
;
351 unsigned char m_max_ranges
;
353 irange_bitmask m_bitmask
;
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.
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.
365 template<unsigned N
, bool RESIZABLE
= false>
366 class int_range final
: public irange
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
&);
378 int_range (tree
, tree
, value_range_kind
= VR_RANGE
);
380 wide_int m_ranges
[N
*2];
383 class prange final
: public vrange
385 friend class prange_storage
;
386 friend class vrange_printer
;
389 prange (const prange
&);
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
;
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
);
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
;
425 bool varying_compatible_p () const;
430 irange_bitmask m_bitmask
;
433 // Unsupported temporaries may be created by ranger before it's known
434 // they're unsupported, or by vr_values::get_value_range.
436 class unsupported_range
: public vrange
440 : vrange (VR_UNKNOWN
)
444 unsupported_range (const unsupported_range
&src
)
445 : vrange (VR_UNKNOWN
)
447 unsupported_range::operator= (src
);
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
;
470 // The NAN state as an opaque object.
476 nan_state (bool pos_nan
, bool neg_nan
);
484 // Set NAN state to +-NAN if NAN_P is true. Otherwise set NAN state
488 nan_state::nan_state (bool nan_p
)
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.
499 nan_state::nan_state (bool pos_nan
, bool neg_nan
)
505 // Return if +NAN is possible.
508 nan_state::pos_p () const
513 // Return if -NAN is possible.
516 nan_state::neg_p () const
521 // A floating point range.
523 // The representation is a type with a couple of endpoints, unioned
524 // with the set of { -NAN, +Nan }.
526 class frange final
: public vrange
528 friend class frange_storage
;
529 friend class vrange_printer
;
532 frange (const frange
&);
533 frange (tree
, tree
, value_range_kind
= VR_RANGE
);
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
)
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
);
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;
576 void update_nan (bool sign
);
577 void update_nan (tree
) = delete; // Disallow silent conversion to bool.
578 void update_nan (const nan_state
&);
580 void flush_denormals_to_zero ();
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 bool known_isnormal () const;
592 bool known_isdenormal_or_zero () const;
595 virtual bool contains_p (tree cst
) const override
;
596 virtual void set (tree
, tree
, value_range_kind
= VR_RANGE
) override
;
599 bool internal_singleton_p (REAL_VALUE_TYPE
* = NULL
) const;
600 void verify_range ();
601 bool normalize_kind ();
602 bool union_nans (const frange
&);
603 bool intersect_nans (const frange
&);
604 bool combine_zeros (const frange
&, bool union_p
);
607 REAL_VALUE_TYPE m_min
;
608 REAL_VALUE_TYPE m_max
;
613 inline const REAL_VALUE_TYPE
&
614 frange::lower_bound () const
616 gcc_checking_assert (!undefined_p () && !known_isnan ());
620 inline const REAL_VALUE_TYPE
&
621 frange::upper_bound () const
623 gcc_checking_assert (!undefined_p () && !known_isnan ());
627 // Return the NAN state.
630 frange::get_nan_state () const
632 return nan_state (m_pos_nan
, m_neg_nan
);
635 // is_a<> and as_a<> implementation for vrange.
637 // Anything we haven't specialized is a hard fail.
638 template <typename T
>
646 template <typename T
>
648 is_a (const vrange
&v
)
650 // Reuse is_a <vrange> to implement the const version.
651 const T
&derived
= static_cast<const T
&> (v
);
652 return is_a
<T
> (const_cast<T
&> (derived
));
655 template <typename T
>
659 gcc_checking_assert (is_a
<T
> (v
));
660 return static_cast <T
&> (v
);
663 template <typename T
>
665 as_a (const vrange
&v
)
667 gcc_checking_assert (is_a
<T
> (v
));
668 return static_cast <const T
&> (v
);
671 // Specializations for the different range types.
675 is_a
<irange
> (vrange
&v
)
677 return v
.m_discriminator
== VR_IRANGE
;
682 is_a
<prange
> (vrange
&v
)
684 return v
.m_discriminator
== VR_PRANGE
;
689 is_a
<frange
> (vrange
&v
)
691 return v
.m_discriminator
== VR_FRANGE
;
696 is_a
<unsupported_range
> (vrange
&v
)
698 return v
.m_discriminator
== VR_UNKNOWN
;
701 // For resizable ranges, resize the range up to HARD_MAX_RANGES if the
702 // NEEDED pairs is greater than the current capacity of the range.
705 irange::maybe_resize (int needed
)
707 if (!m_resizable
|| m_max_ranges
== HARD_MAX_RANGES
)
710 if (needed
> m_max_ranges
)
712 m_max_ranges
= HARD_MAX_RANGES
;
713 wide_int
*newmem
= new wide_int
[m_max_ranges
* 2];
714 unsigned n
= num_pairs () * 2;
715 for (unsigned i
= 0; i
< n
; ++i
)
716 newmem
[i
] = m_base
[i
];
721 template<unsigned N
, bool RESIZABLE
>
723 int_range
<N
, RESIZABLE
>::~int_range ()
725 if (RESIZABLE
&& m_base
!= m_ranges
)
729 // This is an "infinite" precision irange for use in temporary
730 // calculations. It starts with a sensible default covering 99% of
731 // uses, and goes up to HARD_MAX_RANGES when needed. Any allocated
732 // storage is freed upon destruction.
733 typedef int_range
<3, /*RESIZABLE=*/true> int_range_max
;
738 virtual void visit (const irange
&) const { }
739 virtual void visit (const prange
&) const { }
740 virtual void visit (const frange
&) const { }
741 virtual void visit (const unsupported_range
&) const { }
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.
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.
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().
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
&);
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;
773 operator const vrange
&() const;
774 void dump (FILE *) const;
775 static bool supports_type_p (const_tree type
);
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
); }
799 void init (tree type
);
800 void init (const vrange
&);
806 unsupported_range unsupported
;
813 // The default constructor is uninitialized and must be initialized
814 // with either set_type() or with an assignment into it.
817 value_range::value_range ()
826 value_range::value_range (const value_range
&r
)
831 // Copy constructor from a vrange.
834 value_range::value_range (const vrange
&r
)
839 // Construct an UNDEFINED range that can hold ranges of TYPE. If TYPE
840 // is not supported, default to unsupported_range.
843 value_range::value_range (tree type
)
848 // Construct a range that can hold a range of [MIN, MAX], where MIN
849 // and MAX are trees.
852 value_range::value_range (tree min
, tree max
, value_range_kind kind
)
854 init (TREE_TYPE (min
));
855 m_vrange
->set (min
, max
, kind
);
859 value_range::~value_range ()
862 m_vrange
->~vrange ();
865 // Initialize object to an UNDEFINED range that can hold ranges of
866 // TYPE. Clean-up memory if there was a previous object.
869 value_range::set_type (tree type
)
872 m_vrange
->~vrange ();
876 // Initialize object to an UNDEFINED range that can hold ranges of
880 value_range::init (tree type
)
882 gcc_checking_assert (TYPE_P (type
));
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 ();
891 m_vrange
= new (&m_buffer
.unsupported
) unsupported_range ();
894 // Initialize object with a copy of R.
897 value_range::init (const vrange
&r
)
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
));
906 m_vrange
= new (&m_buffer
.unsupported
)
907 unsupported_range (as_a
<unsupported_range
> (r
));
910 // Assignment operator. Copying incompatible types is allowed. That
911 // is, assigning an frange to an object holding an irange does the
915 value_range::operator= (const vrange
&r
)
918 m_vrange
->~vrange ();
924 value_range::operator= (const value_range
&r
)
926 // No need to call the m_vrange destructor here, as we will do so in
927 // the assignment below.
933 value_range::operator== (const value_range
&r
) const
935 return *m_vrange
== *r
.m_vrange
;
939 value_range::operator!= (const value_range
&r
) const
941 return *m_vrange
!= *r
.m_vrange
;
945 value_range::operator vrange
&()
951 value_range::operator const vrange
&() const
956 // Return TRUE if TYPE is supported by the vrange infrastructure.
959 value_range::supports_type_p (const_tree type
)
961 return irange::supports_p (type
)
962 || prange::supports_p (type
)
963 || frange::supports_p (type
);
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
);
972 // Number of sub-ranges in a range.
975 irange::num_pairs () const
981 irange::type () const
983 gcc_checking_assert (m_num_ranges
> 0);
988 irange::varying_compatible_p () const
990 if (m_num_ranges
!= 1)
993 const wide_int
&l
= m_base
[0];
994 const wide_int
&u
= m_base
[1];
997 if (m_kind
== VR_VARYING
)
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 ());
1010 vrange::varying_p () const
1012 return m_kind
== VR_VARYING
;
1016 vrange::undefined_p () const
1018 return m_kind
== VR_UNDEFINED
;
1022 irange::zero_p () const
1024 return (m_kind
== VR_RANGE
&& m_num_ranges
== 1
1025 && lower_bound (0) == 0
1026 && upper_bound (0) == 0);
1030 irange::nonzero_p () const
1035 wide_int zero
= wi::zero (TYPE_PRECISION (type ()));
1036 return *this == int_range
<2> (type (), zero
, zero
, VR_ANTI_RANGE
);
1040 irange::supports_p (const_tree type
)
1042 return INTEGRAL_TYPE_P (type
);
1046 irange::contains_p (tree cst
) const
1048 return contains_p (wi::to_wide (cst
));
1052 range_includes_zero_p (const vrange
&vr
)
1054 if (vr
.undefined_p ())
1057 if (vr
.varying_p ())
1060 return vr
.contains_p (build_zero_cst (vr
.type ()));
1063 // Constructors for irange
1066 irange::irange (wide_int
*base
, unsigned nranges
, bool resizable
)
1067 : vrange (VR_IRANGE
),
1068 m_resizable (resizable
),
1069 m_max_ranges (nranges
)
1075 // Constructors for int_range<>.
1077 template<unsigned N
, bool RESIZABLE
>
1079 int_range
<N
, RESIZABLE
>::int_range ()
1080 : irange (m_ranges
, N
, RESIZABLE
)
1084 template<unsigned N
, bool RESIZABLE
>
1085 int_range
<N
, RESIZABLE
>::int_range (const int_range
&other
)
1086 : irange (m_ranges
, N
, RESIZABLE
)
1088 irange::operator= (other
);
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
)
1095 irange::set (min
, max
, kind
);
1098 template<unsigned N
, bool RESIZABLE
>
1099 int_range
<N
, RESIZABLE
>::int_range (tree type
)
1100 : irange (m_ranges
, N
, RESIZABLE
)
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
)
1110 set (type
, wmin
, wmax
, kind
);
1113 template<unsigned N
, bool RESIZABLE
>
1114 int_range
<N
, RESIZABLE
>::int_range (const irange
&other
)
1115 : irange (m_ranges
, N
, RESIZABLE
)
1117 irange::operator= (other
);
1120 template<unsigned N
, bool RESIZABLE
>
1121 int_range
<N
, RESIZABLE
>&
1122 int_range
<N
, RESIZABLE
>::operator= (const int_range
&src
)
1124 irange::operator= (src
);
1129 irange::set_undefined ()
1131 m_kind
= VR_UNDEFINED
;
1136 irange::set_varying (tree type
)
1138 m_kind
= VR_VARYING
;
1140 m_bitmask
.set_unknown (TYPE_PRECISION (type
));
1142 if (INTEGRAL_TYPE_P (type
) || POINTER_TYPE_P (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
));
1151 m_type
= error_mark_node
;
1154 // Return the lower bound of a sub-range. PAIR is the sub-range in
1158 irange::lower_bound (unsigned pair
) const
1160 gcc_checking_assert (m_num_ranges
> 0);
1161 gcc_checking_assert (pair
+ 1 <= num_pairs ());
1162 return m_base
[pair
* 2];
1165 // Return the upper bound of a sub-range. PAIR is the sub-range in
1169 irange::upper_bound (unsigned pair
) const
1171 gcc_checking_assert (m_num_ranges
> 0);
1172 gcc_checking_assert (pair
+ 1 <= num_pairs ());
1173 return m_base
[pair
* 2 + 1];
1176 // Return the highest bound of a range.
1179 irange::upper_bound () const
1181 unsigned pairs
= num_pairs ();
1182 gcc_checking_assert (pairs
> 0);
1183 return upper_bound (pairs
- 1);
1186 // Set value range VR to a nonzero range of type TYPE.
1189 irange::set_nonzero (tree type
)
1191 unsigned prec
= TYPE_PRECISION (type
);
1193 if (TYPE_UNSIGNED (type
))
1197 m_base
[0] = wi::one (prec
);
1198 m_base
[1] = wi::minus_one (prec
);
1199 m_bitmask
.set_unknown (prec
);
1207 wide_int zero
= wi::zero (prec
);
1208 set (type
, zero
, zero
, VR_ANTI_RANGE
);
1212 // Set value range VR to a ZERO range of type TYPE.
1215 irange::set_zero (tree type
)
1217 wide_int zero
= wi::zero (TYPE_PRECISION (type
));
1218 set (type
, zero
, zero
);
1221 // Normalize a range to VARYING or UNDEFINED if possible.
1224 irange::normalize_kind ()
1226 if (m_num_ranges
== 0)
1228 else if (varying_compatible_p ())
1230 if (m_kind
== VR_RANGE
)
1231 m_kind
= VR_VARYING
;
1232 else if (m_kind
== VR_ANTI_RANGE
)
1240 contains_zero_p (const irange
&r
)
1242 if (r
.undefined_p ())
1245 wide_int zero
= wi::zero (TYPE_PRECISION (r
.type ()));
1246 return r
.contains_p (zero
);
1250 irange_val_min (const_tree type
)
1252 gcc_checking_assert (irange::supports_p (type
));
1253 return wi::min_value (TYPE_PRECISION (type
), TYPE_SIGN (type
));
1257 irange_val_max (const_tree type
)
1259 gcc_checking_assert (irange::supports_p (type
));
1260 return wi::max_value (TYPE_PRECISION (type
), TYPE_SIGN (type
));
1265 : vrange (VR_PRANGE
)
1271 prange::prange (const prange
&r
)
1272 : vrange (VR_PRANGE
)
1278 prange::prange (tree type
)
1279 : vrange (VR_PRANGE
)
1285 prange::prange (tree type
, const wide_int
&lb
, const wide_int
&ub
,
1286 value_range_kind kind
)
1287 : vrange (VR_PRANGE
)
1289 set (type
, lb
, ub
, kind
);
1293 prange::supports_p (const_tree type
)
1295 return POINTER_TYPE_P (type
);
1299 prange::supports_type_p (const_tree type
) const
1301 return POINTER_TYPE_P (type
);
1305 prange::set_undefined ()
1307 m_kind
= VR_UNDEFINED
;
1311 prange::set_varying (tree type
)
1313 m_kind
= VR_VARYING
;
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
));
1324 prange::set_nonzero (tree 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
));
1337 prange::set_zero (tree type
)
1341 wide_int zero
= wi::zero (TYPE_PRECISION (type
));
1342 m_min
= m_max
= zero
;
1343 m_bitmask
= irange_bitmask (zero
, zero
);
1350 prange::contains_p (tree cst
) const
1352 return contains_p (wi::to_wide (cst
));
1356 prange::zero_p () const
1358 return m_kind
== VR_RANGE
&& m_min
== 0 && m_max
== 0;
1362 prange::nonzero_p () const
1364 return m_kind
== VR_RANGE
&& m_min
== 1 && m_max
== -1;
1368 prange::type () const
1370 gcc_checking_assert (!undefined_p ());
1375 prange::lower_bound () const
1377 gcc_checking_assert (!undefined_p ());
1382 prange::upper_bound () const
1384 gcc_checking_assert (!undefined_p ());
1389 prange::varying_compatible_p () const
1391 return (!undefined_p ()
1392 && m_min
== 0 && m_max
== -1 && get_bitmask ().unknown_p ());
1395 inline irange_bitmask
1396 prange::get_bitmask () const
1402 prange::fits_p (const vrange
&) const
1410 : vrange (VR_FRANGE
)
1416 frange::frange (const frange
&src
)
1417 : vrange (VR_FRANGE
)
1423 frange::frange (tree type
)
1424 : vrange (VR_FRANGE
)
1429 // frange constructor from REAL_VALUE_TYPE endpoints.
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
)
1437 set (type
, min
, max
, kind
);
1440 // frange constructor from trees.
1443 frange::frange (tree min
, tree max
, value_range_kind kind
)
1444 : vrange (VR_FRANGE
)
1446 set (min
, max
, kind
);
1450 frange::type () const
1452 gcc_checking_assert (!undefined_p ());
1457 frange::set_varying (tree type
)
1459 m_kind
= VR_VARYING
;
1461 m_min
= frange_val_min (type
);
1462 m_max
= frange_val_max (type
);
1463 if (HONOR_NANS (m_type
))
1476 frange::set_undefined ()
1478 m_kind
= VR_UNDEFINED
;
1482 // m_min and m_min are uninitialized as they are REAL_VALUE_TYPE ??.
1487 // Set the NAN bits to NAN and adjust the range.
1490 frange::update_nan (const nan_state
&nan
)
1492 gcc_checking_assert (!undefined_p ());
1493 if (HONOR_NANS (m_type
))
1495 m_pos_nan
= nan
.pos_p ();
1496 m_neg_nan
= nan
.neg_p ();
1503 // Set the NAN bit to +-NAN.
1506 frange::update_nan ()
1508 gcc_checking_assert (!undefined_p ());
1509 nan_state
nan (true);
1513 // Like above, but set the sign of the NAN.
1516 frange::update_nan (bool sign
)
1518 gcc_checking_assert (!undefined_p ());
1519 nan_state
nan (/*pos=*/!sign
, /*neg=*/sign
);
1524 frange::contains_p (tree cst
) const
1526 return contains_p (*TREE_REAL_CST_PTR (cst
));
1529 // Clear the NAN bit and adjust the range.
1532 frange::clear_nan ()
1534 gcc_checking_assert (!undefined_p ());
1542 // Set R to maximum representable value for TYPE.
1544 inline REAL_VALUE_TYPE
1545 real_max_representable (const_tree type
)
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
);
1556 // Return the minimum representable value for TYPE.
1558 inline REAL_VALUE_TYPE
1559 real_min_representable (const_tree type
)
1561 REAL_VALUE_TYPE r
= real_max_representable (type
);
1562 r
= real_value_negate (&r
);
1566 // Return the minimum value for TYPE.
1568 inline REAL_VALUE_TYPE
1569 frange_val_min (const_tree type
)
1571 if (HONOR_INFINITIES (type
))
1574 return real_min_representable (type
);
1577 // Return the maximum value for TYPE.
1579 inline REAL_VALUE_TYPE
1580 frange_val_max (const_tree type
)
1582 if (HONOR_INFINITIES (type
))
1585 return real_max_representable (type
);
1588 // Return TRUE if R is the minimum value for TYPE.
1591 frange_val_is_min (const REAL_VALUE_TYPE
&r
, const_tree type
)
1593 REAL_VALUE_TYPE min
= frange_val_min (type
);
1594 return real_identical (&min
, &r
);
1597 // Return TRUE if R is the max value for TYPE.
1600 frange_val_is_max (const REAL_VALUE_TYPE
&r
, const_tree type
)
1602 REAL_VALUE_TYPE max
= frange_val_max (type
);
1603 return real_identical (&max
, &r
);
1606 // Build a NAN with a state of NAN.
1609 frange::set_nan (tree type
, const nan_state
&nan
)
1611 gcc_checking_assert (nan
.pos_p () || nan
.neg_p ());
1612 if (HONOR_NANS (type
))
1616 m_neg_nan
= nan
.neg_p ();
1617 m_pos_nan
= nan
.pos_p ();
1625 // Build a signless NAN of type TYPE.
1628 frange::set_nan (tree type
)
1630 nan_state
nan (true);
1631 set_nan (type
, nan
);
1634 // Build a NAN of type TYPE with SIGN.
1637 frange::set_nan (tree type
, bool sign
)
1639 nan_state
nan (/*pos=*/!sign
, /*neg=*/sign
);
1640 set_nan (type
, nan
);
1643 // Return TRUE if range is known to be finite.
1646 frange::known_isfinite () const
1648 if (undefined_p () || varying_p () || m_kind
== VR_ANTI_RANGE
)
1650 return (!maybe_isnan () && !real_isinf (&m_min
) && !real_isinf (&m_max
));
1653 // Return TRUE if range is known to be normal.
1656 frange::known_isnormal () const
1658 if (!known_isfinite ())
1661 machine_mode mode
= TYPE_MODE (type ());
1662 return (!real_isdenormal (&m_min
, mode
) && !real_isdenormal (&m_max
, mode
)
1663 && !real_iszero (&m_min
) && !real_iszero (&m_max
)
1664 && (!real_isneg (&m_min
) || real_isneg (&m_max
)));
1667 // Return TRUE if range is known to be denormal.
1670 frange::known_isdenormal_or_zero () const
1672 if (!known_isfinite ())
1675 machine_mode mode
= TYPE_MODE (type ());
1676 return ((real_isdenormal (&m_min
, mode
) || real_iszero (&m_min
))
1677 && (real_isdenormal (&m_max
, mode
) || real_iszero (&m_max
)));
1680 // Return TRUE if range may be infinite.
1683 frange::maybe_isinf () const
1685 if (undefined_p () || m_kind
== VR_ANTI_RANGE
|| m_kind
== VR_NAN
)
1689 return real_isinf (&m_min
) || real_isinf (&m_max
);
1692 // Return TRUE if range is known to be the [-INF,-INF] or [+INF,+INF].
1695 frange::known_isinf () const
1697 return (m_kind
== VR_RANGE
1699 && real_identical (&m_min
, &m_max
)
1700 && real_isinf (&m_min
));
1703 // Return TRUE if range is possibly a NAN.
1706 frange::maybe_isnan () const
1710 return m_pos_nan
|| m_neg_nan
;
1713 // Return TRUE if range is possibly a NAN with SIGN.
1716 frange::maybe_isnan (bool sign
) const
1725 // Return TRUE if range is a +NAN or -NAN.
1728 frange::known_isnan () const
1730 return m_kind
== VR_NAN
;
1733 // If the signbit for the range is known, set it in SIGNBIT and return
1737 frange::signbit_p (bool &signbit
) const
1742 // NAN with unknown sign.
1743 if (m_pos_nan
&& m_neg_nan
)
1746 if (!m_pos_nan
&& !m_neg_nan
)
1748 if (m_min
.sign
== m_max
.sign
)
1750 signbit
= m_min
.sign
;
1755 // NAN with known sign.
1756 bool nan_sign
= m_neg_nan
;
1758 || (nan_sign
== m_min
.sign
&& nan_sign
== m_max
.sign
))
1766 // If range has a NAN with a known sign, set it in SIGNBIT and return
1770 frange::nan_signbit_p (bool &signbit
) const
1775 if (m_pos_nan
== m_neg_nan
)
1778 signbit
= m_neg_nan
;
1782 void frange_nextafter (enum machine_mode
, REAL_VALUE_TYPE
&,
1783 const REAL_VALUE_TYPE
&);
1784 void frange_arithmetic (enum tree_code
, tree
, REAL_VALUE_TYPE
&,
1785 const REAL_VALUE_TYPE
&, const REAL_VALUE_TYPE
&,
1786 const REAL_VALUE_TYPE
&);
1788 // Return true if TYPE1 and TYPE2 are compatible range types.
1791 range_compatible_p (tree type1
, tree type2
)
1793 // types_compatible_p requires conversion in both directions to be useless.
1794 // GIMPLE only requires a cast one way in order to be compatible.
1795 // Ranges really only need the sign and precision to be the same.
1796 return (TYPE_PRECISION (type1
) == TYPE_PRECISION (type2
)
1797 && TYPE_SIGN (type1
) == TYPE_SIGN (type2
));
1799 #endif // GCC_VALUE_RANGE_H