middle-end: Allow _BitInt(65535) [PR102989]
[official-gcc.git] / gcc / value-range.cc
blob333245ed290a4b10515ec0fcc269fb2b6740e305
1 /* Support routines for value ranges.
2 Copyright (C) 2019-2023 Free Software Foundation, Inc.
3 Major hacks 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)
11 any later version.
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 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "backend.h"
26 #include "tree.h"
27 #include "gimple.h"
28 #include "ssa.h"
29 #include "tree-pretty-print.h"
30 #include "value-range-pretty-print.h"
31 #include "fold-const.h"
32 #include "gimple-range.h"
34 void
35 irange::accept (const vrange_visitor &v) const
37 v.visit (*this);
40 void
41 unsupported_range::accept (const vrange_visitor &v) const
43 v.visit (*this);
46 // Convenience function only available for integers and pointers.
48 wide_int
49 Value_Range::lower_bound () const
51 if (is_a <irange> (*m_vrange))
52 return as_a <irange> (*m_vrange).lower_bound ();
53 gcc_unreachable ();
56 // Convenience function only available for integers and pointers.
58 wide_int
59 Value_Range::upper_bound () const
61 if (is_a <irange> (*m_vrange))
62 return as_a <irange> (*m_vrange).upper_bound ();
63 gcc_unreachable ();
66 void
67 Value_Range::dump (FILE *out) const
69 if (m_vrange)
70 m_vrange->dump (out);
71 else
72 fprintf (out, "NULL");
75 DEBUG_FUNCTION void
76 debug (const Value_Range &r)
78 r.dump (stderr);
79 fprintf (stderr, "\n");
82 DEBUG_FUNCTION void
83 debug (const irange_bitmask &bm)
85 bm.dump (stderr);
86 fprintf (stderr, "\n");
89 // Default vrange definitions.
91 bool
92 vrange::contains_p (tree) const
94 return varying_p ();
97 bool
98 vrange::singleton_p (tree *) const
100 return false;
103 void
104 vrange::set (tree min, tree, value_range_kind)
106 set_varying (TREE_TYPE (min));
109 tree
110 vrange::type () const
112 return void_type_node;
115 bool
116 vrange::supports_type_p (const_tree) const
118 return false;
121 void
122 vrange::set_undefined ()
124 m_kind = VR_UNDEFINED;
127 void
128 vrange::set_varying (tree)
130 m_kind = VR_VARYING;
133 bool
134 vrange::union_ (const vrange &r)
136 if (r.undefined_p () || varying_p ())
137 return false;
138 if (undefined_p () || r.varying_p ())
140 operator= (r);
141 return true;
143 gcc_unreachable ();
144 return false;
147 bool
148 vrange::intersect (const vrange &r)
150 if (undefined_p () || r.varying_p ())
151 return false;
152 if (r.undefined_p ())
154 set_undefined ();
155 return true;
157 if (varying_p ())
159 operator= (r);
160 return true;
162 gcc_unreachable ();
163 return false;
166 bool
167 vrange::zero_p () const
169 return false;
172 bool
173 vrange::nonzero_p () const
175 return false;
178 void
179 vrange::set_nonzero (tree type)
181 set_varying (type);
184 void
185 vrange::set_zero (tree type)
187 set_varying (type);
190 void
191 vrange::set_nonnegative (tree type)
193 set_varying (type);
196 bool
197 vrange::fits_p (const vrange &) const
199 return true;
202 // Assignment operator for generic ranges. Copying incompatible types
203 // is not allowed.
205 vrange &
206 vrange::operator= (const vrange &src)
208 if (is_a <irange> (src))
209 as_a <irange> (*this) = as_a <irange> (src);
210 else if (is_a <frange> (src))
211 as_a <frange> (*this) = as_a <frange> (src);
212 else
214 gcc_checking_assert (is_a <unsupported_range> (src));
215 m_kind = src.m_kind;
217 return *this;
220 // Equality operator for generic ranges.
222 bool
223 vrange::operator== (const vrange &src) const
225 if (is_a <irange> (src))
226 return as_a <irange> (*this) == as_a <irange> (src);
227 if (is_a <frange> (src))
228 return as_a <frange> (*this) == as_a <frange> (src);
229 gcc_unreachable ();
232 // Wrapper for vrange_printer to dump a range to a file.
234 void
235 vrange::dump (FILE *file) const
237 pretty_printer buffer;
238 pp_needs_newline (&buffer) = true;
239 buffer.buffer->stream = file;
240 vrange_printer vrange_pp (&buffer);
241 this->accept (vrange_pp);
242 pp_flush (&buffer);
245 void
246 irange_bitmask::dump (FILE *file) const
248 char buf[WIDE_INT_PRINT_BUFFER_SIZE], *p;
249 pretty_printer buffer;
251 pp_needs_newline (&buffer) = true;
252 buffer.buffer->stream = file;
253 pp_string (&buffer, "MASK ");
254 unsigned len_mask = m_mask.get_len ();
255 unsigned len_val = m_value.get_len ();
256 unsigned len = MAX (len_mask, len_val);
257 if (len > WIDE_INT_MAX_INL_ELTS)
258 p = XALLOCAVEC (char, len * HOST_BITS_PER_WIDE_INT / 4 + 4);
259 else
260 p = buf;
261 print_hex (m_mask, p);
262 pp_string (&buffer, p);
263 pp_string (&buffer, " VALUE ");
264 print_hex (m_value, p);
265 pp_string (&buffer, p);
266 pp_flush (&buffer);
269 namespace inchash
272 void
273 add_vrange (const vrange &v, inchash::hash &hstate,
274 unsigned int)
276 if (v.undefined_p ())
278 hstate.add_int (VR_UNDEFINED);
279 return;
281 // Types are ignored throughout to inhibit two ranges being equal
282 // but having different hash values. This can happen when two
283 // ranges are equal and their types are different (but
284 // types_compatible_p is true).
285 if (is_a <irange> (v))
287 const irange &r = as_a <irange> (v);
288 if (r.varying_p ())
289 hstate.add_int (VR_VARYING);
290 else
291 hstate.add_int (VR_RANGE);
292 for (unsigned i = 0; i < r.num_pairs (); ++i)
294 hstate.add_wide_int (r.lower_bound (i));
295 hstate.add_wide_int (r.upper_bound (i));
297 irange_bitmask bm = r.get_bitmask ();
298 hstate.add_wide_int (bm.value ());
299 hstate.add_wide_int (bm.mask ());
300 return;
302 if (is_a <frange> (v))
304 const frange &r = as_a <frange> (v);
305 if (r.known_isnan ())
306 hstate.add_int (VR_NAN);
307 else
309 hstate.add_int (r.varying_p () ? VR_VARYING : VR_RANGE);
310 hstate.add_real_value (r.lower_bound ());
311 hstate.add_real_value (r.upper_bound ());
313 nan_state nan = r.get_nan_state ();
314 hstate.add_int (nan.pos_p ());
315 hstate.add_int (nan.neg_p ());
316 return;
318 gcc_unreachable ();
321 } //namespace inchash
323 bool
324 irange::nonnegative_p () const
326 return wi::ge_p (lower_bound (), 0, TYPE_SIGN (type ()));
329 bool
330 irange::nonpositive_p () const
332 return wi::le_p (upper_bound (), 0, TYPE_SIGN (type ()));
335 bool
336 irange::supports_type_p (const_tree type) const
338 return supports_p (type);
341 // Return TRUE if R fits in THIS.
343 bool
344 irange::fits_p (const vrange &r) const
346 return m_max_ranges >= as_a <irange> (r).num_pairs ();
349 void
350 irange::set_nonnegative (tree type)
352 set (type,
353 wi::zero (TYPE_PRECISION (type)),
354 wi::to_wide (TYPE_MAX_VALUE (type)));
357 void
358 frange::accept (const vrange_visitor &v) const
360 v.visit (*this);
363 // Flush denormal endpoints to the appropriate 0.0.
365 void
366 frange::flush_denormals_to_zero ()
368 if (undefined_p () || known_isnan ())
369 return;
371 machine_mode mode = TYPE_MODE (type ());
372 // Flush [x, -DENORMAL] to [x, -0.0].
373 if (real_isdenormal (&m_max, mode) && real_isneg (&m_max))
375 if (HONOR_SIGNED_ZEROS (m_type))
376 m_max = dconstm0;
377 else
378 m_max = dconst0;
380 // Flush [+DENORMAL, x] to [+0.0, x].
381 if (real_isdenormal (&m_min, mode) && !real_isneg (&m_min))
382 m_min = dconst0;
385 // Setter for franges.
387 void
388 frange::set (tree type,
389 const REAL_VALUE_TYPE &min, const REAL_VALUE_TYPE &max,
390 const nan_state &nan, value_range_kind kind)
392 switch (kind)
394 case VR_UNDEFINED:
395 set_undefined ();
396 return;
397 case VR_VARYING:
398 case VR_ANTI_RANGE:
399 set_varying (type);
400 return;
401 case VR_RANGE:
402 break;
403 default:
404 gcc_unreachable ();
407 gcc_checking_assert (!real_isnan (&min) && !real_isnan (&max));
409 m_kind = kind;
410 m_type = type;
411 m_min = min;
412 m_max = max;
413 if (HONOR_NANS (m_type))
415 m_pos_nan = nan.pos_p ();
416 m_neg_nan = nan.neg_p ();
418 else
420 m_pos_nan = false;
421 m_neg_nan = false;
424 if (!MODE_HAS_SIGNED_ZEROS (TYPE_MODE (m_type)))
426 if (real_iszero (&m_min, 1))
427 m_min.sign = 0;
428 if (real_iszero (&m_max, 1))
429 m_max.sign = 0;
431 else if (!HONOR_SIGNED_ZEROS (m_type))
433 if (real_iszero (&m_max, 1))
434 m_max.sign = 0;
435 if (real_iszero (&m_min, 0))
436 m_min.sign = 1;
439 // For -ffinite-math-only we can drop ranges outside the
440 // representable numbers to min/max for the type.
441 if (!HONOR_INFINITIES (m_type))
443 REAL_VALUE_TYPE min_repr = frange_val_min (m_type);
444 REAL_VALUE_TYPE max_repr = frange_val_max (m_type);
445 if (real_less (&m_min, &min_repr))
446 m_min = min_repr;
447 else if (real_less (&max_repr, &m_min))
448 m_min = max_repr;
449 if (real_less (&max_repr, &m_max))
450 m_max = max_repr;
451 else if (real_less (&m_max, &min_repr))
452 m_max = min_repr;
455 // Check for swapped ranges.
456 gcc_checking_assert (real_compare (LE_EXPR, &min, &max));
458 normalize_kind ();
461 // Setter for an frange defaulting the NAN possibility to +-NAN when
462 // HONOR_NANS.
464 void
465 frange::set (tree type,
466 const REAL_VALUE_TYPE &min, const REAL_VALUE_TYPE &max,
467 value_range_kind kind)
469 set (type, min, max, nan_state (true), kind);
472 void
473 frange::set (tree min, tree max, value_range_kind kind)
475 set (TREE_TYPE (min),
476 *TREE_REAL_CST_PTR (min), *TREE_REAL_CST_PTR (max), kind);
479 // Normalize range to VARYING or UNDEFINED, or vice versa. Return
480 // TRUE if anything changed.
482 // A range with no known properties can be dropped to VARYING.
483 // Similarly, a VARYING with any properties should be dropped to a
484 // VR_RANGE. Normalizing ranges upon changing them ensures there is
485 // only one representation for a given range.
487 bool
488 frange::normalize_kind ()
490 if (m_kind == VR_RANGE
491 && frange_val_is_min (m_min, m_type)
492 && frange_val_is_max (m_max, m_type))
494 if (!HONOR_NANS (m_type) || (m_pos_nan && m_neg_nan))
496 set_varying (m_type);
497 return true;
500 else if (m_kind == VR_VARYING)
502 if (HONOR_NANS (m_type) && (!m_pos_nan || !m_neg_nan))
504 m_kind = VR_RANGE;
505 m_min = frange_val_min (m_type);
506 m_max = frange_val_max (m_type);
507 if (flag_checking)
508 verify_range ();
509 return true;
512 else if (m_kind == VR_NAN && !m_pos_nan && !m_neg_nan)
513 set_undefined ();
514 return false;
517 // Union or intersect the zero endpoints of two ranges. For example:
518 // [-0, x] U [+0, x] => [-0, x]
519 // [ x, -0] U [ x, +0] => [ x, +0]
520 // [-0, x] ^ [+0, x] => [+0, x]
521 // [ x, -0] ^ [ x, +0] => [ x, -0]
523 // UNION_P is true when performing a union, or false when intersecting.
525 bool
526 frange::combine_zeros (const frange &r, bool union_p)
528 gcc_checking_assert (!undefined_p () && !known_isnan ());
530 bool changed = false;
531 if (real_iszero (&m_min) && real_iszero (&r.m_min)
532 && real_isneg (&m_min) != real_isneg (&r.m_min))
534 m_min.sign = union_p;
535 changed = true;
537 if (real_iszero (&m_max) && real_iszero (&r.m_max)
538 && real_isneg (&m_max) != real_isneg (&r.m_max))
540 m_max.sign = !union_p;
541 changed = true;
543 // If the signs are swapped, the resulting range is empty.
544 if (m_min.sign == 0 && m_max.sign == 1)
546 if (maybe_isnan ())
547 m_kind = VR_NAN;
548 else
549 set_undefined ();
550 changed = true;
552 return changed;
555 // Union two ranges when one is known to be a NAN.
557 bool
558 frange::union_nans (const frange &r)
560 gcc_checking_assert (known_isnan () || r.known_isnan ());
562 bool changed = false;
563 if (known_isnan () && m_kind != r.m_kind)
565 m_kind = r.m_kind;
566 m_min = r.m_min;
567 m_max = r.m_max;
568 changed = true;
570 if (m_pos_nan != r.m_pos_nan || m_neg_nan != r.m_neg_nan)
572 m_pos_nan |= r.m_pos_nan;
573 m_neg_nan |= r.m_neg_nan;
574 changed = true;
576 if (changed)
578 normalize_kind ();
579 return true;
581 return false;
584 bool
585 frange::union_ (const vrange &v)
587 const frange &r = as_a <frange> (v);
589 if (r.undefined_p () || varying_p ())
590 return false;
591 if (undefined_p () || r.varying_p ())
593 *this = r;
594 return true;
597 // Combine NAN info.
598 if (known_isnan () || r.known_isnan ())
599 return union_nans (r);
600 bool changed = false;
601 if (m_pos_nan != r.m_pos_nan || m_neg_nan != r.m_neg_nan)
603 m_pos_nan |= r.m_pos_nan;
604 m_neg_nan |= r.m_neg_nan;
605 changed = true;
608 // Combine endpoints.
609 if (real_less (&r.m_min, &m_min))
611 m_min = r.m_min;
612 changed = true;
614 if (real_less (&m_max, &r.m_max))
616 m_max = r.m_max;
617 changed = true;
620 if (HONOR_SIGNED_ZEROS (m_type))
621 changed |= combine_zeros (r, true);
623 changed |= normalize_kind ();
624 return changed;
627 // Intersect two ranges when one is known to be a NAN.
629 bool
630 frange::intersect_nans (const frange &r)
632 gcc_checking_assert (known_isnan () || r.known_isnan ());
634 m_pos_nan &= r.m_pos_nan;
635 m_neg_nan &= r.m_neg_nan;
636 if (maybe_isnan ())
637 m_kind = VR_NAN;
638 else
639 set_undefined ();
640 if (flag_checking)
641 verify_range ();
642 return true;
645 bool
646 frange::intersect (const vrange &v)
648 const frange &r = as_a <frange> (v);
650 if (undefined_p () || r.varying_p ())
651 return false;
652 if (r.undefined_p ())
654 set_undefined ();
655 return true;
657 if (varying_p ())
659 *this = r;
660 return true;
663 // Combine NAN info.
664 if (known_isnan () || r.known_isnan ())
665 return intersect_nans (r);
666 bool changed = false;
667 if (m_pos_nan != r.m_pos_nan || m_neg_nan != r.m_neg_nan)
669 m_pos_nan &= r.m_pos_nan;
670 m_neg_nan &= r.m_neg_nan;
671 changed = true;
674 // Combine endpoints.
675 if (real_less (&m_min, &r.m_min))
677 m_min = r.m_min;
678 changed = true;
680 if (real_less (&r.m_max, &m_max))
682 m_max = r.m_max;
683 changed = true;
685 // If the endpoints are swapped, the resulting range is empty.
686 if (real_less (&m_max, &m_min))
688 if (maybe_isnan ())
689 m_kind = VR_NAN;
690 else
691 set_undefined ();
692 if (flag_checking)
693 verify_range ();
694 return true;
697 if (HONOR_SIGNED_ZEROS (m_type))
698 changed |= combine_zeros (r, false);
700 changed |= normalize_kind ();
701 return changed;
704 frange &
705 frange::operator= (const frange &src)
707 m_kind = src.m_kind;
708 m_type = src.m_type;
709 m_min = src.m_min;
710 m_max = src.m_max;
711 m_pos_nan = src.m_pos_nan;
712 m_neg_nan = src.m_neg_nan;
714 if (flag_checking)
715 verify_range ();
716 return *this;
719 bool
720 frange::operator== (const frange &src) const
722 if (m_kind == src.m_kind)
724 if (undefined_p ())
725 return true;
727 if (varying_p ())
728 return types_compatible_p (m_type, src.m_type);
730 bool nan1 = known_isnan ();
731 bool nan2 = src.known_isnan ();
732 if (nan1 || nan2)
734 if (nan1 && nan2)
735 return (m_pos_nan == src.m_pos_nan
736 && m_neg_nan == src.m_neg_nan);
737 return false;
740 return (real_identical (&m_min, &src.m_min)
741 && real_identical (&m_max, &src.m_max)
742 && m_pos_nan == src.m_pos_nan
743 && m_neg_nan == src.m_neg_nan
744 && types_compatible_p (m_type, src.m_type));
746 return false;
749 // Return TRUE if range contains R.
751 bool
752 frange::contains_p (const REAL_VALUE_TYPE &r) const
754 gcc_checking_assert (m_kind != VR_ANTI_RANGE);
756 if (undefined_p ())
757 return false;
759 if (varying_p ())
760 return true;
762 if (real_isnan (&r))
764 // No NAN in range.
765 if (!m_pos_nan && !m_neg_nan)
766 return false;
767 // Both +NAN and -NAN are present.
768 if (m_pos_nan && m_neg_nan)
769 return true;
770 return m_neg_nan == r.sign;
772 if (known_isnan ())
773 return false;
775 if (real_compare (GE_EXPR, &r, &m_min) && real_compare (LE_EXPR, &r, &m_max))
777 // Make sure the signs are equal for signed zeros.
778 if (HONOR_SIGNED_ZEROS (m_type) && real_iszero (&r))
779 return r.sign == m_min.sign || r.sign == m_max.sign;
780 return true;
782 return false;
785 // If range is a singleton, place it in RESULT and return TRUE. If
786 // RESULT is NULL, just return TRUE.
788 // A NAN can never be a singleton.
790 bool
791 frange::internal_singleton_p (REAL_VALUE_TYPE *result) const
793 if (m_kind == VR_RANGE && real_identical (&m_min, &m_max))
795 // Return false for any singleton that may be a NAN.
796 if (HONOR_NANS (m_type) && maybe_isnan ())
797 return false;
799 if (MODE_COMPOSITE_P (TYPE_MODE (m_type)))
801 // For IBM long doubles, if the value is +-Inf or is exactly
802 // representable in double, the other double could be +0.0
803 // or -0.0. Since this means there is more than one way to
804 // represent a value, return false to avoid propagating it.
805 // See libgcc/config/rs6000/ibm-ldouble-format for details.
806 if (real_isinf (&m_min))
807 return false;
808 REAL_VALUE_TYPE r;
809 real_convert (&r, DFmode, &m_min);
810 if (real_identical (&r, &m_min))
811 return false;
814 if (result)
815 *result = m_min;
816 return true;
818 return false;
821 bool
822 frange::singleton_p (tree *result) const
824 if (internal_singleton_p ())
826 if (result)
827 *result = build_real (m_type, m_min);
828 return true;
830 return false;
833 bool
834 frange::singleton_p (REAL_VALUE_TYPE &r) const
836 return internal_singleton_p (&r);
839 bool
840 frange::supports_type_p (const_tree type) const
842 return supports_p (type);
845 void
846 frange::verify_range ()
848 if (!undefined_p ())
849 gcc_checking_assert (HONOR_NANS (m_type) || !maybe_isnan ());
850 switch (m_kind)
852 case VR_UNDEFINED:
853 gcc_checking_assert (!m_type);
854 return;
855 case VR_VARYING:
856 gcc_checking_assert (m_type);
857 gcc_checking_assert (frange_val_is_min (m_min, m_type));
858 gcc_checking_assert (frange_val_is_max (m_max, m_type));
859 if (HONOR_NANS (m_type))
860 gcc_checking_assert (m_pos_nan && m_neg_nan);
861 else
862 gcc_checking_assert (!m_pos_nan && !m_neg_nan);
863 return;
864 case VR_RANGE:
865 gcc_checking_assert (m_type);
866 break;
867 case VR_NAN:
868 gcc_checking_assert (m_type);
869 gcc_checking_assert (m_pos_nan || m_neg_nan);
870 return;
871 default:
872 gcc_unreachable ();
875 // NANs cannot appear in the endpoints of a range.
876 gcc_checking_assert (!real_isnan (&m_min) && !real_isnan (&m_max));
878 // Make sure we don't have swapped ranges.
879 gcc_checking_assert (!real_less (&m_max, &m_min));
881 // [ +0.0, -0.0 ] is nonsensical.
882 gcc_checking_assert (!(real_iszero (&m_min, 0) && real_iszero (&m_max, 1)));
884 // If all the properties are clear, we better not span the entire
885 // domain, because that would make us varying.
886 if (m_pos_nan && m_neg_nan)
887 gcc_checking_assert (!frange_val_is_min (m_min, m_type)
888 || !frange_val_is_max (m_max, m_type));
891 // We can't do much with nonzeros yet.
892 void
893 frange::set_nonzero (tree type)
895 set_varying (type);
898 // We can't do much with nonzeros yet.
899 bool
900 frange::nonzero_p () const
902 return false;
905 // Set range to [+0.0, +0.0] if honoring signed zeros, or [0.0, 0.0]
906 // otherwise.
908 void
909 frange::set_zero (tree type)
911 if (HONOR_SIGNED_ZEROS (type))
913 set (type, dconstm0, dconst0);
914 clear_nan ();
916 else
917 set (type, dconst0, dconst0);
920 // Return TRUE for any zero regardless of sign.
922 bool
923 frange::zero_p () const
925 return (m_kind == VR_RANGE
926 && real_iszero (&m_min)
927 && real_iszero (&m_max));
930 // Set the range to non-negative numbers, that is [+0.0, +INF].
932 // The NAN in the resulting range (if HONOR_NANS) has a varying sign
933 // as there are no guarantees in IEEE 754 wrt to the sign of a NAN,
934 // except for copy, abs, and copysign. It is the responsibility of
935 // the caller to set the NAN's sign if desired.
937 void
938 frange::set_nonnegative (tree type)
940 set (type, dconst0, frange_val_max (type));
943 // Here we copy between any two irange's.
945 irange &
946 irange::operator= (const irange &src)
948 int needed = src.num_pairs ();
949 maybe_resize (needed);
951 unsigned x;
952 unsigned lim = src.m_num_ranges;
953 if (lim > m_max_ranges)
954 lim = m_max_ranges;
956 for (x = 0; x < lim * 2; ++x)
957 m_base[x] = src.m_base[x];
959 // If the range didn't fit, the last range should cover the rest.
960 if (lim != src.m_num_ranges)
961 m_base[x - 1] = src.m_base[src.m_num_ranges * 2 - 1];
963 m_num_ranges = lim;
964 m_type = src.m_type;
965 m_kind = src.m_kind;
966 m_bitmask = src.m_bitmask;
967 if (m_max_ranges == 1)
968 normalize_kind ();
969 if (flag_checking)
970 verify_range ();
971 return *this;
974 value_range_kind
975 get_legacy_range (const irange &r, tree &min, tree &max)
977 if (r.undefined_p ())
979 min = NULL_TREE;
980 max = NULL_TREE;
981 return VR_UNDEFINED;
984 tree type = r.type ();
985 if (r.varying_p ())
987 min = wide_int_to_tree (type, r.lower_bound ());
988 max = wide_int_to_tree (type, r.upper_bound ());
989 return VR_VARYING;
992 unsigned int precision = TYPE_PRECISION (type);
993 signop sign = TYPE_SIGN (type);
994 if (r.num_pairs () > 1
995 && precision > 1
996 && r.lower_bound () == wi::min_value (precision, sign)
997 && r.upper_bound () == wi::max_value (precision, sign))
999 int_range<3> inv (r);
1000 inv.invert ();
1001 min = wide_int_to_tree (type, inv.lower_bound (0));
1002 max = wide_int_to_tree (type, inv.upper_bound (0));
1003 return VR_ANTI_RANGE;
1006 min = wide_int_to_tree (type, r.lower_bound ());
1007 max = wide_int_to_tree (type, r.upper_bound ());
1008 return VR_RANGE;
1011 /* Set value range to the canonical form of {VRTYPE, MIN, MAX, EQUIV}.
1012 This means adjusting VRTYPE, MIN and MAX representing the case of a
1013 wrapping range with MAX < MIN covering [MIN, type_max] U [type_min, MAX]
1014 as anti-rage ~[MAX+1, MIN-1]. Likewise for wrapping anti-ranges.
1015 In corner cases where MAX+1 or MIN-1 wraps this will fall back
1016 to varying.
1017 This routine exists to ease canonicalization in the case where we
1018 extract ranges from var + CST op limit. */
1020 void
1021 irange::set (tree type, const wide_int &min, const wide_int &max,
1022 value_range_kind kind)
1024 unsigned prec = TYPE_PRECISION (type);
1025 signop sign = TYPE_SIGN (type);
1026 wide_int min_value = wi::min_value (prec, sign);
1027 wide_int max_value = wi::max_value (prec, sign);
1029 m_type = type;
1030 m_bitmask.set_unknown (prec);
1032 if (kind == VR_RANGE)
1034 m_base[0] = min;
1035 m_base[1] = max;
1036 m_num_ranges = 1;
1037 if (min == min_value && max == max_value)
1038 m_kind = VR_VARYING;
1039 else
1040 m_kind = VR_RANGE;
1042 else
1044 gcc_checking_assert (kind == VR_ANTI_RANGE);
1045 gcc_checking_assert (m_max_ranges > 1);
1047 m_kind = VR_UNDEFINED;
1048 m_num_ranges = 0;
1049 wi::overflow_type ovf;
1050 wide_int lim;
1051 if (sign == SIGNED)
1052 lim = wi::add (min, -1, sign, &ovf);
1053 else
1054 lim = wi::sub (min, 1, sign, &ovf);
1056 if (!ovf)
1058 m_kind = VR_RANGE;
1059 m_base[0] = min_value;
1060 m_base[1] = lim;
1061 ++m_num_ranges;
1063 if (sign == SIGNED)
1064 lim = wi::sub (max, -1, sign, &ovf);
1065 else
1066 lim = wi::add (max, 1, sign, &ovf);
1067 if (!ovf)
1069 m_kind = VR_RANGE;
1070 m_base[m_num_ranges * 2] = lim;
1071 m_base[m_num_ranges * 2 + 1] = max_value;
1072 ++m_num_ranges;
1076 if (flag_checking)
1077 verify_range ();
1080 void
1081 irange::set (tree min, tree max, value_range_kind kind)
1083 if (POLY_INT_CST_P (min) || POLY_INT_CST_P (max))
1085 set_varying (TREE_TYPE (min));
1086 return;
1089 gcc_checking_assert (TREE_CODE (min) == INTEGER_CST);
1090 gcc_checking_assert (TREE_CODE (max) == INTEGER_CST);
1092 return set (TREE_TYPE (min), wi::to_wide (min), wi::to_wide (max), kind);
1095 // Check the validity of the range.
1097 void
1098 irange::verify_range ()
1100 gcc_checking_assert (m_discriminator == VR_IRANGE);
1101 if (m_kind == VR_UNDEFINED)
1103 gcc_checking_assert (m_num_ranges == 0);
1104 return;
1106 gcc_checking_assert (m_num_ranges <= m_max_ranges);
1108 // Legacy allowed these to represent VARYING for unknown types.
1109 // Leave this in for now, until all users are converted. Eventually
1110 // we should abort in set_varying.
1111 if (m_kind == VR_VARYING && m_type == error_mark_node)
1112 return;
1114 unsigned prec = TYPE_PRECISION (m_type);
1115 if (m_kind == VR_VARYING)
1117 gcc_checking_assert (m_bitmask.unknown_p ());
1118 gcc_checking_assert (m_num_ranges == 1);
1119 gcc_checking_assert (varying_compatible_p ());
1120 gcc_checking_assert (lower_bound ().get_precision () == prec);
1121 gcc_checking_assert (upper_bound ().get_precision () == prec);
1122 return;
1124 gcc_checking_assert (m_num_ranges != 0);
1125 gcc_checking_assert (!varying_compatible_p ());
1126 for (unsigned i = 0; i < m_num_ranges; ++i)
1128 wide_int lb = lower_bound (i);
1129 wide_int ub = upper_bound (i);
1130 gcc_checking_assert (lb.get_precision () == prec);
1131 gcc_checking_assert (ub.get_precision () == prec);
1132 int c = wi::cmp (lb, ub, TYPE_SIGN (m_type));
1133 gcc_checking_assert (c == 0 || c == -1);
1135 m_bitmask.verify_mask ();
1138 bool
1139 irange::operator== (const irange &other) const
1141 if (m_num_ranges != other.m_num_ranges)
1142 return false;
1144 if (m_num_ranges == 0)
1145 return true;
1147 signop sign1 = TYPE_SIGN (type ());
1148 signop sign2 = TYPE_SIGN (other.type ());
1150 for (unsigned i = 0; i < m_num_ranges; ++i)
1152 widest_int lb = widest_int::from (lower_bound (i), sign1);
1153 widest_int ub = widest_int::from (upper_bound (i), sign1);
1154 widest_int lb_other = widest_int::from (other.lower_bound (i), sign2);
1155 widest_int ub_other = widest_int::from (other.upper_bound (i), sign2);
1156 if (lb != lb_other || ub != ub_other)
1157 return false;
1160 irange_bitmask bm1 = get_bitmask ();
1161 irange_bitmask bm2 = other.get_bitmask ();
1162 widest_int tmp1 = widest_int::from (bm1.mask (), sign1);
1163 widest_int tmp2 = widest_int::from (bm2.mask (), sign2);
1164 if (tmp1 != tmp2)
1165 return false;
1166 if (bm1.unknown_p ())
1167 return true;
1168 tmp1 = widest_int::from (bm1.value (), sign1);
1169 tmp2 = widest_int::from (bm2.value (), sign2);
1170 return tmp1 == tmp2;
1173 /* If range is a singleton, place it in RESULT and return TRUE. */
1175 bool
1176 irange::singleton_p (tree *result) const
1178 if (num_pairs () == 1 && lower_bound () == upper_bound ())
1180 if (result)
1181 *result = wide_int_to_tree (type (), lower_bound ());
1182 return true;
1184 return false;
1187 bool
1188 irange::singleton_p (wide_int &w) const
1190 if (num_pairs () == 1 && lower_bound () == upper_bound ())
1192 w = lower_bound ();
1193 return true;
1195 return false;
1198 /* Return 1 if CST is inside value range.
1199 0 if CST is not inside value range.
1201 Benchmark compile/20001226-1.c compilation time after changing this
1202 function. */
1204 bool
1205 irange::contains_p (const wide_int &cst) const
1207 if (undefined_p ())
1208 return false;
1210 // See if we can exclude CST based on the known 0 bits.
1211 if (!m_bitmask.unknown_p ()
1212 && cst != 0
1213 && wi::bit_and (m_bitmask.get_nonzero_bits (), cst) == 0)
1214 return false;
1216 signop sign = TYPE_SIGN (type ());
1217 for (unsigned r = 0; r < m_num_ranges; ++r)
1219 if (wi::lt_p (cst, lower_bound (r), sign))
1220 return false;
1221 if (wi::le_p (cst, upper_bound (r), sign))
1222 return true;
1225 return false;
1228 // Perform an efficient union with R when both ranges have only a single pair.
1229 // Excluded are VARYING and UNDEFINED ranges.
1231 bool
1232 irange::irange_single_pair_union (const irange &r)
1234 gcc_checking_assert (!undefined_p () && !varying_p ());
1235 gcc_checking_assert (!r.undefined_p () && !varying_p ());
1237 signop sign = TYPE_SIGN (m_type);
1238 // Check if current lower bound is also the new lower bound.
1239 if (wi::le_p (m_base[0], r.m_base[0], sign))
1241 // If current upper bound is new upper bound, we're done.
1242 if (wi::le_p (r.m_base[1], m_base[1], sign))
1243 return union_bitmask (r);
1244 // Otherwise R has the new upper bound.
1245 // Check for overlap/touching ranges, or single target range.
1246 if (m_max_ranges == 1
1247 || (widest_int::from (m_base[1], sign) + 1
1248 >= widest_int::from (r.m_base[0], TYPE_SIGN (r.m_type))))
1249 m_base[1] = r.m_base[1];
1250 else
1252 // This is a dual range result.
1253 m_base[2] = r.m_base[0];
1254 m_base[3] = r.m_base[1];
1255 m_num_ranges = 2;
1257 // The range has been altered, so normalize it even if nothing
1258 // changed in the mask.
1259 if (!union_bitmask (r))
1260 normalize_kind ();
1261 if (flag_checking)
1262 verify_range ();
1263 return true;
1266 // Set the new lower bound to R's lower bound.
1267 wide_int lb = m_base[0];
1268 m_base[0] = r.m_base[0];
1270 // If R fully contains THIS range, just set the upper bound.
1271 if (wi::ge_p (r.m_base[1], m_base[1], sign))
1272 m_base[1] = r.m_base[1];
1273 // Check for overlapping ranges, or target limited to a single range.
1274 else if (m_max_ranges == 1
1275 || (widest_int::from (r.m_base[1], TYPE_SIGN (r.m_type)) + 1
1276 >= widest_int::from (lb, sign)))
1278 else
1280 // Left with 2 pairs.
1281 m_num_ranges = 2;
1282 m_base[2] = lb;
1283 m_base[3] = m_base[1];
1284 m_base[1] = r.m_base[1];
1286 // The range has been altered, so normalize it even if nothing
1287 // changed in the mask.
1288 if (!union_bitmask (r))
1289 normalize_kind ();
1290 if (flag_checking)
1291 verify_range ();
1292 return true;
1295 // Return TRUE if anything changes.
1297 bool
1298 irange::union_ (const vrange &v)
1300 const irange &r = as_a <irange> (v);
1302 if (r.undefined_p ())
1303 return false;
1305 if (undefined_p ())
1307 operator= (r);
1308 if (flag_checking)
1309 verify_range ();
1310 return true;
1313 if (varying_p ())
1314 return false;
1316 if (r.varying_p ())
1318 set_varying (type ());
1319 return true;
1322 // Special case one range union one range.
1323 if (m_num_ranges == 1 && r.m_num_ranges == 1)
1324 return irange_single_pair_union (r);
1326 // If this ranges fully contains R, then we need do nothing.
1327 if (irange_contains_p (r))
1328 return union_bitmask (r);
1330 // Do not worry about merging and such by reserving twice as many
1331 // pairs as needed, and then simply sort the 2 ranges into this
1332 // intermediate form.
1334 // The intermediate result will have the property that the beginning
1335 // of each range is <= the beginning of the next range. There may
1336 // be overlapping ranges at this point. I.e. this would be valid
1337 // [-20, 10], [-10, 0], [0, 20], [40, 90] as it satisfies this
1338 // constraint : -20 < -10 < 0 < 40. When the range is rebuilt into r,
1339 // the merge is performed.
1341 // [Xi,Yi]..[Xn,Yn] U [Xj,Yj]..[Xm,Ym] --> [Xk,Yk]..[Xp,Yp]
1342 auto_vec<wide_int, 20> res (m_num_ranges * 2 + r.m_num_ranges * 2);
1343 unsigned i = 0, j = 0, k = 0;
1344 signop sign = TYPE_SIGN (m_type);
1346 while (i < m_num_ranges * 2 && j < r.m_num_ranges * 2)
1348 // lower of Xi and Xj is the lowest point.
1349 if (widest_int::from (m_base[i], sign)
1350 <= widest_int::from (r.m_base[j], sign))
1352 res.quick_push (m_base[i]);
1353 res.quick_push (m_base[i + 1]);
1354 k += 2;
1355 i += 2;
1357 else
1359 res.quick_push (r.m_base[j]);
1360 res.quick_push (r.m_base[j + 1]);
1361 k += 2;
1362 j += 2;
1365 for ( ; i < m_num_ranges * 2; i += 2)
1367 res.quick_push (m_base[i]);
1368 res.quick_push (m_base[i + 1]);
1369 k += 2;
1371 for ( ; j < r.m_num_ranges * 2; j += 2)
1373 res.quick_push (r.m_base[j]);
1374 res.quick_push (r.m_base[j + 1]);
1375 k += 2;
1378 // Now normalize the vector removing any overlaps.
1379 i = 2;
1380 for (j = 2; j < k ; j += 2)
1382 // Current upper+1 is >= lower bound next pair, then we merge ranges.
1383 if (widest_int::from (res[i - 1], sign) + 1
1384 >= widest_int::from (res[j], sign))
1386 // New upper bounds is greater of current or the next one.
1387 if (widest_int::from (res[j + 1], sign)
1388 > widest_int::from (res[i - 1], sign))
1389 res[i - 1] = res[j + 1];
1391 else
1393 // This is a new distinct range, but no point in copying it
1394 // if it is already in the right place.
1395 if (i != j)
1397 res[i++] = res[j];
1398 res[i++] = res[j + 1];
1400 else
1401 i += 2;
1405 // At this point, the vector should have i ranges, none overlapping.
1406 // Now it simply needs to be copied, and if there are too many
1407 // ranges, merge some. We wont do any analysis as to what the
1408 // "best" merges are, simply combine the final ranges into one.
1409 maybe_resize (i / 2);
1410 if (i > m_max_ranges * 2)
1412 res[m_max_ranges * 2 - 1] = res[i - 1];
1413 i = m_max_ranges * 2;
1416 for (j = 0; j < i ; j++)
1417 m_base[j] = res [j];
1418 m_num_ranges = i / 2;
1420 m_kind = VR_RANGE;
1421 // The range has been altered, so normalize it even if nothing
1422 // changed in the mask.
1423 if (!union_bitmask (r))
1424 normalize_kind ();
1425 if (flag_checking)
1426 verify_range ();
1427 return true;
1430 // Return TRUE if THIS fully contains R. No undefined or varying cases.
1432 bool
1433 irange::irange_contains_p (const irange &r) const
1435 gcc_checking_assert (!undefined_p () && !varying_p ());
1436 gcc_checking_assert (!r.undefined_p () && !varying_p ());
1438 // In order for THIS to fully contain R, all of the pairs within R must
1439 // be fully contained by the pairs in this object.
1440 signop sign = TYPE_SIGN (m_type);
1441 unsigned ri = 0;
1442 unsigned i = 0;
1443 wide_int rl = r.m_base[0];
1444 wide_int ru = r.m_base[1];
1445 wide_int l = m_base[0];
1446 wide_int u = m_base[1];
1447 while (1)
1449 // If r is contained within this range, move to the next R
1450 if (wi::ge_p (rl, l, sign)
1451 && wi::le_p (ru, u, sign))
1453 // This pair is OK, Either done, or bump to the next.
1454 if (++ri >= r.num_pairs ())
1455 return true;
1456 rl = r.m_base[ri * 2];
1457 ru = r.m_base[ri * 2 + 1];
1458 continue;
1460 // Otherwise, check if this's pair occurs before R's.
1461 if (wi::lt_p (u, rl, sign))
1463 // There's still at least one pair of R left.
1464 if (++i >= num_pairs ())
1465 return false;
1466 l = m_base[i * 2];
1467 u = m_base[i * 2 + 1];
1468 continue;
1470 return false;
1472 return false;
1476 // Return TRUE if anything changes.
1478 bool
1479 irange::intersect (const vrange &v)
1481 const irange &r = as_a <irange> (v);
1482 gcc_checking_assert (undefined_p () || r.undefined_p ()
1483 || range_compatible_p (type (), r.type ()));
1485 if (undefined_p ())
1486 return false;
1487 if (r.undefined_p ())
1489 set_undefined ();
1490 return true;
1492 if (r.varying_p ())
1493 return false;
1494 if (varying_p ())
1496 operator= (r);
1497 return true;
1500 if (r.num_pairs () == 1)
1502 bool res = intersect (r.lower_bound (), r.upper_bound ());
1503 if (undefined_p ())
1504 return true;
1506 res |= intersect_bitmask (r);
1507 if (res)
1508 normalize_kind ();
1509 return res;
1512 // If R fully contains this, then intersection will change nothing.
1513 if (r.irange_contains_p (*this))
1514 return intersect_bitmask (r);
1516 // ?? We could probably come up with something smarter than the
1517 // worst case scenario here.
1518 int needed = num_pairs () + r.num_pairs ();
1519 maybe_resize (needed);
1521 signop sign = TYPE_SIGN (m_type);
1522 unsigned bld_pair = 0;
1523 unsigned bld_lim = m_max_ranges;
1524 int_range_max r2 (*this);
1525 unsigned r2_lim = r2.num_pairs ();
1526 unsigned i2 = 0;
1527 for (unsigned i = 0; i < r.num_pairs (); )
1529 // If r1's upper is < r2's lower, we can skip r1's pair.
1530 wide_int ru = r.m_base[i * 2 + 1];
1531 wide_int r2l = r2.m_base[i2 * 2];
1532 if (wi::lt_p (ru, r2l, sign))
1534 i++;
1535 continue;
1537 // Likewise, skip r2's pair if its excluded.
1538 wide_int r2u = r2.m_base[i2 * 2 + 1];
1539 wide_int rl = r.m_base[i * 2];
1540 if (wi::lt_p (r2u, rl, sign))
1542 i2++;
1543 if (i2 < r2_lim)
1544 continue;
1545 // No more r2, break.
1546 break;
1549 // Must be some overlap. Find the highest of the lower bounds,
1550 // and set it, unless the build limits lower bounds is already
1551 // set.
1552 if (bld_pair < bld_lim)
1554 if (wi::ge_p (rl, r2l, sign))
1555 m_base[bld_pair * 2] = rl;
1556 else
1557 m_base[bld_pair * 2] = r2l;
1559 else
1560 // Decrease and set a new upper.
1561 bld_pair--;
1563 // ...and choose the lower of the upper bounds.
1564 if (wi::le_p (ru, r2u, sign))
1566 m_base[bld_pair * 2 + 1] = ru;
1567 bld_pair++;
1568 // Move past the r1 pair and keep trying.
1569 i++;
1570 continue;
1572 else
1574 m_base[bld_pair * 2 + 1] = r2u;
1575 bld_pair++;
1576 i2++;
1577 if (i2 < r2_lim)
1578 continue;
1579 // No more r2, break.
1580 break;
1582 // r2 has the higher lower bound.
1585 // At the exit of this loop, it is one of 2 things:
1586 // ran out of r1, or r2, but either means we are done.
1587 m_num_ranges = bld_pair;
1588 if (m_num_ranges == 0)
1590 set_undefined ();
1591 return true;
1594 m_kind = VR_RANGE;
1595 // The range has been altered, so normalize it even if nothing
1596 // changed in the mask.
1597 if (!intersect_bitmask (r))
1598 normalize_kind ();
1599 if (flag_checking)
1600 verify_range ();
1601 return true;
1605 // Multirange intersect for a specified wide_int [lb, ub] range.
1606 // Return TRUE if intersect changed anything.
1608 // NOTE: It is the caller's responsibility to intersect the mask.
1610 bool
1611 irange::intersect (const wide_int& lb, const wide_int& ub)
1613 // Undefined remains undefined.
1614 if (undefined_p ())
1615 return false;
1617 tree range_type = type();
1618 signop sign = TYPE_SIGN (range_type);
1620 gcc_checking_assert (TYPE_PRECISION (range_type) == wi::get_precision (lb));
1621 gcc_checking_assert (TYPE_PRECISION (range_type) == wi::get_precision (ub));
1623 // If this range is fully contained, then intersection will do nothing.
1624 if (wi::ge_p (lower_bound (), lb, sign)
1625 && wi::le_p (upper_bound (), ub, sign))
1626 return false;
1628 unsigned bld_index = 0;
1629 unsigned pair_lim = num_pairs ();
1630 for (unsigned i = 0; i < pair_lim; i++)
1632 wide_int pairl = m_base[i * 2];
1633 wide_int pairu = m_base[i * 2 + 1];
1634 // Once UB is less than a pairs lower bound, we're done.
1635 if (wi::lt_p (ub, pairl, sign))
1636 break;
1637 // if LB is greater than this pairs upper, this pair is excluded.
1638 if (wi::lt_p (pairu, lb, sign))
1639 continue;
1641 // Must be some overlap. Find the highest of the lower bounds,
1642 // and set it
1643 if (wi::gt_p (lb, pairl, sign))
1644 m_base[bld_index * 2] = lb;
1645 else
1646 m_base[bld_index * 2] = pairl;
1648 // ...and choose the lower of the upper bounds and if the base pair
1649 // has the lower upper bound, need to check next pair too.
1650 if (wi::lt_p (ub, pairu, sign))
1652 m_base[bld_index++ * 2 + 1] = ub;
1653 break;
1655 else
1656 m_base[bld_index++ * 2 + 1] = pairu;
1659 m_num_ranges = bld_index;
1660 if (m_num_ranges == 0)
1662 set_undefined ();
1663 return true;
1666 m_kind = VR_RANGE;
1667 // The caller must normalize and verify the range, as the bitmask
1668 // still needs to be handled.
1669 return true;
1673 // Signed 1-bits are strange. You can't subtract 1, because you can't
1674 // represent the number 1. This works around that for the invert routine.
1676 static wide_int inline
1677 subtract_one (const wide_int &x, tree type, wi::overflow_type &overflow)
1679 if (TYPE_SIGN (type) == SIGNED)
1680 return wi::add (x, -1, SIGNED, &overflow);
1681 else
1682 return wi::sub (x, 1, UNSIGNED, &overflow);
1685 // The analogous function for adding 1.
1687 static wide_int inline
1688 add_one (const wide_int &x, tree type, wi::overflow_type &overflow)
1690 if (TYPE_SIGN (type) == SIGNED)
1691 return wi::sub (x, -1, SIGNED, &overflow);
1692 else
1693 return wi::add (x, 1, UNSIGNED, &overflow);
1696 // Return the inverse of a range.
1698 void
1699 irange::invert ()
1701 gcc_checking_assert (!undefined_p () && !varying_p ());
1703 // We always need one more set of bounds to represent an inverse, so
1704 // if we're at the limit, we can't properly represent things.
1706 // For instance, to represent the inverse of a 2 sub-range set
1707 // [5, 10][20, 30], we would need a 3 sub-range set
1708 // [-MIN, 4][11, 19][31, MAX].
1710 // In this case, return the most conservative thing.
1712 // However, if any of the extremes of the range are -MIN/+MAX, we
1713 // know we will not need an extra bound. For example:
1715 // INVERT([-MIN,20][30,40]) => [21,29][41,+MAX]
1716 // INVERT([-MIN,20][30,MAX]) => [21,29]
1717 tree ttype = type ();
1718 unsigned prec = TYPE_PRECISION (ttype);
1719 signop sign = TYPE_SIGN (ttype);
1720 wide_int type_min = wi::min_value (prec, sign);
1721 wide_int type_max = wi::max_value (prec, sign);
1722 m_bitmask.set_unknown (prec);
1724 // At this point, we need one extra sub-range to represent the
1725 // inverse.
1726 maybe_resize (m_num_ranges + 1);
1728 // The algorithm is as follows. To calculate INVERT ([a,b][c,d]), we
1729 // generate [-MIN, a-1][b+1, c-1][d+1, MAX].
1731 // If there is an over/underflow in the calculation for any
1732 // sub-range, we eliminate that subrange. This allows us to easily
1733 // calculate INVERT([-MIN, 5]) with: [-MIN, -MIN-1][6, MAX]. And since
1734 // we eliminate the underflow, only [6, MAX] remains.
1735 unsigned i = 0;
1736 wi::overflow_type ovf;
1737 // Construct leftmost range.
1738 int_range_max orig_range (*this);
1739 unsigned nitems = 0;
1740 wide_int tmp;
1741 // If this is going to underflow on the MINUS 1, don't even bother
1742 // checking. This also handles subtracting one from an unsigned 0,
1743 // which doesn't set the underflow bit.
1744 if (type_min != orig_range.lower_bound ())
1746 m_base[nitems++] = type_min;
1747 tmp = subtract_one (orig_range.lower_bound (), ttype, ovf);
1748 m_base[nitems++] = tmp;
1749 if (ovf)
1750 nitems = 0;
1752 i++;
1753 // Construct middle ranges if applicable.
1754 if (orig_range.num_pairs () > 1)
1756 unsigned j = i;
1757 for (; j < (orig_range.num_pairs () * 2) - 1; j += 2)
1759 // The middle ranges cannot have MAX/MIN, so there's no need
1760 // to check for unsigned overflow on the +1 and -1 here.
1761 tmp = wi::add (orig_range.m_base[j], 1, sign, &ovf);
1762 m_base[nitems++] = tmp;
1763 tmp = subtract_one (orig_range.m_base[j + 1], ttype, ovf);
1764 m_base[nitems++] = tmp;
1765 if (ovf)
1766 nitems -= 2;
1768 i = j;
1770 // Construct rightmost range.
1772 // However, if this will overflow on the PLUS 1, don't even bother.
1773 // This also handles adding one to an unsigned MAX, which doesn't
1774 // set the overflow bit.
1775 if (type_max != orig_range.m_base[i])
1777 tmp = add_one (orig_range.m_base[i], ttype, ovf);
1778 m_base[nitems++] = tmp;
1779 m_base[nitems++] = type_max;
1780 if (ovf)
1781 nitems -= 2;
1783 m_num_ranges = nitems / 2;
1785 // We disallow undefined or varying coming in, so the result can
1786 // only be a VR_RANGE.
1787 gcc_checking_assert (m_kind == VR_RANGE);
1789 if (flag_checking)
1790 verify_range ();
1793 // Return the bitmask inherent in the range.
1795 irange_bitmask
1796 irange::get_bitmask_from_range () const
1798 unsigned prec = TYPE_PRECISION (type ());
1799 wide_int min = lower_bound ();
1800 wide_int max = upper_bound ();
1802 // All the bits of a singleton are known.
1803 if (min == max)
1805 wide_int mask = wi::zero (prec);
1806 wide_int value = lower_bound ();
1807 return irange_bitmask (value, mask);
1810 wide_int xorv = min ^ max;
1812 if (xorv != 0)
1813 xorv = wi::mask (prec - wi::clz (xorv), false, prec);
1815 return irange_bitmask (wi::zero (prec), min | xorv);
1818 // If the the mask can be trivially converted to a range, do so and
1819 // return TRUE.
1821 bool
1822 irange::set_range_from_bitmask ()
1824 gcc_checking_assert (!undefined_p ());
1825 if (m_bitmask.unknown_p ())
1826 return false;
1828 // If all the bits are known, this is a singleton.
1829 if (m_bitmask.mask () == 0)
1831 set (m_type, m_bitmask.value (), m_bitmask.value ());
1832 return true;
1835 unsigned popcount = wi::popcount (m_bitmask.get_nonzero_bits ());
1837 // If we have only one bit set in the mask, we can figure out the
1838 // range immediately.
1839 if (popcount == 1)
1841 // Make sure we don't pessimize the range.
1842 if (!contains_p (m_bitmask.get_nonzero_bits ()))
1843 return false;
1845 bool has_zero = contains_zero_p (*this);
1846 wide_int nz = m_bitmask.get_nonzero_bits ();
1847 set (m_type, nz, nz);
1848 m_bitmask.set_nonzero_bits (nz);
1849 if (has_zero)
1851 int_range<2> zero;
1852 zero.set_zero (type ());
1853 union_ (zero);
1855 if (flag_checking)
1856 verify_range ();
1857 return true;
1859 else if (popcount == 0)
1861 set_zero (type ());
1862 return true;
1864 return false;
1867 void
1868 irange::update_bitmask (const irange_bitmask &bm)
1870 gcc_checking_assert (!undefined_p ());
1872 // Drop VARYINGs with known bits to a plain range.
1873 if (m_kind == VR_VARYING && !bm.unknown_p ())
1874 m_kind = VR_RANGE;
1876 m_bitmask = bm;
1877 if (!set_range_from_bitmask ())
1878 normalize_kind ();
1879 if (flag_checking)
1880 verify_range ();
1883 // Return the bitmask of known bits that includes the bitmask inherent
1884 // in the range.
1886 irange_bitmask
1887 irange::get_bitmask () const
1889 gcc_checking_assert (!undefined_p ());
1891 // The mask inherent in the range is calculated on-demand. For
1892 // example, [0,255] does not have known bits set by default. This
1893 // saves us considerable time, because setting it at creation incurs
1894 // a large penalty for irange::set. At the time of writing there
1895 // was a 5% slowdown in VRP if we kept the mask precisely up to date
1896 // at all times. Instead, we default to -1 and set it when
1897 // explicitly requested. However, this function will always return
1898 // the correct mask.
1900 // This also means that the mask may have a finer granularity than
1901 // the range and thus contradict it. Think of the mask as an
1902 // enhancement to the range. For example:
1904 // [3, 1000] MASK 0xfffffffe VALUE 0x0
1906 // 3 is in the range endpoints, but is excluded per the known 0 bits
1907 // in the mask.
1909 // See also the note in irange_bitmask::intersect.
1910 irange_bitmask bm = get_bitmask_from_range ();
1911 if (!m_bitmask.unknown_p ())
1912 bm.intersect (m_bitmask);
1913 return bm;
1916 // Set the nonzero bits in R into THIS. Return TRUE and
1917 // normalize the range if anything changed.
1919 void
1920 irange::set_nonzero_bits (const wide_int &bits)
1922 gcc_checking_assert (!undefined_p ());
1923 irange_bitmask bm (wi::zero (TYPE_PRECISION (type ())), bits);
1924 update_bitmask (bm);
1927 // Return the nonzero bits in R.
1929 wide_int
1930 irange::get_nonzero_bits () const
1932 gcc_checking_assert (!undefined_p ());
1933 irange_bitmask bm = get_bitmask ();
1934 return bm.value () | bm.mask ();
1937 // Intersect the bitmask in R into THIS and normalize the range.
1938 // Return TRUE if the intersection changed anything.
1940 bool
1941 irange::intersect_bitmask (const irange &r)
1943 gcc_checking_assert (!undefined_p () && !r.undefined_p ());
1945 if (m_bitmask == r.m_bitmask)
1946 return false;
1948 irange_bitmask bm = get_bitmask ();
1949 irange_bitmask save = bm;
1950 if (!bm.intersect (r.get_bitmask ()))
1951 return false;
1953 m_bitmask = bm;
1955 // Updating m_bitmask may still yield a semantic bitmask (as
1956 // returned by get_bitmask) which is functionally equivalent to what
1957 // we originally had. In which case, there's still no change.
1958 if (save == get_bitmask ())
1959 return false;
1961 if (!set_range_from_bitmask ())
1962 normalize_kind ();
1963 if (flag_checking)
1964 verify_range ();
1965 return true;
1968 // Union the bitmask in R into THIS. Return TRUE and normalize the
1969 // range if anything changed.
1971 bool
1972 irange::union_bitmask (const irange &r)
1974 gcc_checking_assert (!undefined_p () && !r.undefined_p ());
1976 if (m_bitmask == r.m_bitmask)
1977 return false;
1979 irange_bitmask bm = get_bitmask ();
1980 irange_bitmask save = bm;
1981 if (!bm.union_ (r.get_bitmask ()))
1982 return false;
1984 m_bitmask = bm;
1986 // Updating m_bitmask may still yield a semantic bitmask (as
1987 // returned by get_bitmask) which is functionally equivalent to what
1988 // we originally had. In which case, there's still no change.
1989 if (save == get_bitmask ())
1990 return false;
1992 // No need to call set_range_from_mask, because we'll never
1993 // narrow the range. Besides, it would cause endless recursion
1994 // because of the union_ in set_range_from_mask.
1995 normalize_kind ();
1996 return true;
1999 void
2000 irange_bitmask::verify_mask () const
2002 gcc_assert (m_value.get_precision () == m_mask.get_precision ());
2005 void
2006 dump_value_range (FILE *file, const vrange *vr)
2008 vr->dump (file);
2011 DEBUG_FUNCTION void
2012 debug (const vrange *vr)
2014 dump_value_range (stderr, vr);
2015 fprintf (stderr, "\n");
2018 DEBUG_FUNCTION void
2019 debug (const vrange &vr)
2021 debug (&vr);
2024 DEBUG_FUNCTION void
2025 debug (const value_range *vr)
2027 dump_value_range (stderr, vr);
2028 fprintf (stderr, "\n");
2031 DEBUG_FUNCTION void
2032 debug (const value_range &vr)
2034 dump_value_range (stderr, &vr);
2035 fprintf (stderr, "\n");
2038 /* Return true, if VAL1 and VAL2 are equal values for VRP purposes. */
2040 bool
2041 vrp_operand_equal_p (const_tree val1, const_tree val2)
2043 if (val1 == val2)
2044 return true;
2045 if (!val1 || !val2 || !operand_equal_p (val1, val2, 0))
2046 return false;
2047 return true;
2050 void
2051 gt_ggc_mx (irange *x)
2053 if (!x->undefined_p ())
2054 gt_ggc_mx (x->m_type);
2057 void
2058 gt_pch_nx (irange *x)
2060 if (!x->undefined_p ())
2061 gt_pch_nx (x->m_type);
2064 void
2065 gt_pch_nx (irange *x, gt_pointer_operator op, void *cookie)
2067 for (unsigned i = 0; i < x->m_num_ranges; ++i)
2069 op (&x->m_base[i * 2], NULL, cookie);
2070 op (&x->m_base[i * 2 + 1], NULL, cookie);
2074 void
2075 gt_ggc_mx (frange *x)
2077 gt_ggc_mx (x->m_type);
2080 void
2081 gt_pch_nx (frange *x)
2083 gt_pch_nx (x->m_type);
2086 void
2087 gt_pch_nx (frange *x, gt_pointer_operator op, void *cookie)
2089 op (&x->m_type, NULL, cookie);
2092 void
2093 gt_ggc_mx (vrange *x)
2095 if (is_a <irange> (*x))
2096 return gt_ggc_mx ((irange *) x);
2097 if (is_a <frange> (*x))
2098 return gt_ggc_mx ((frange *) x);
2099 gcc_unreachable ();
2102 void
2103 gt_pch_nx (vrange *x)
2105 if (is_a <irange> (*x))
2106 return gt_pch_nx ((irange *) x);
2107 if (is_a <frange> (*x))
2108 return gt_pch_nx ((frange *) x);
2109 gcc_unreachable ();
2112 void
2113 gt_pch_nx (vrange *x, gt_pointer_operator op, void *cookie)
2115 if (is_a <irange> (*x))
2116 gt_pch_nx ((irange *) x, op, cookie);
2117 else if (is_a <frange> (*x))
2118 gt_pch_nx ((frange *) x, op, cookie);
2119 else
2120 gcc_unreachable ();
2123 #define DEFINE_INT_RANGE_INSTANCE(N) \
2124 template int_range<N>::int_range(tree_node *, \
2125 const wide_int &, \
2126 const wide_int &, \
2127 value_range_kind); \
2128 template int_range<N>::int_range(tree); \
2129 template int_range<N>::int_range(const irange &); \
2130 template int_range<N>::int_range(const int_range &); \
2131 template int_range<N>& int_range<N>::operator= (const int_range &);
2133 DEFINE_INT_RANGE_INSTANCE(1)
2134 DEFINE_INT_RANGE_INSTANCE(2)
2135 DEFINE_INT_RANGE_INSTANCE(3)
2136 DEFINE_INT_RANGE_INSTANCE(255)
2138 #if CHECKING_P
2139 #include "selftest.h"
2141 #define INT(x) wi::shwi ((x), TYPE_PRECISION (integer_type_node))
2142 #define UINT(x) wi::uhwi ((x), TYPE_PRECISION (unsigned_type_node))
2143 #define SCHAR(x) wi::shwi ((x), TYPE_PRECISION (signed_char_type_node))
2145 namespace selftest
2148 static int_range<2>
2149 range (tree type, int a, int b, value_range_kind kind = VR_RANGE)
2151 wide_int w1, w2;
2152 if (TYPE_UNSIGNED (type))
2154 w1 = wi::uhwi (a, TYPE_PRECISION (type));
2155 w2 = wi::uhwi (b, TYPE_PRECISION (type));
2157 else
2159 w1 = wi::shwi (a, TYPE_PRECISION (type));
2160 w2 = wi::shwi (b, TYPE_PRECISION (type));
2162 return int_range<2> (type, w1, w2, kind);
2165 static int_range<2>
2166 range_int (int a, int b, value_range_kind kind = VR_RANGE)
2168 return range (integer_type_node, a, b, kind);
2171 static int_range<2>
2172 range_uint (int a, int b, value_range_kind kind = VR_RANGE)
2174 return range (unsigned_type_node, a, b, kind);
2177 static int_range<2>
2178 range_uint128 (int a, int b, value_range_kind kind = VR_RANGE)
2180 tree u128_type_node = build_nonstandard_integer_type (128, 1);
2181 return range (u128_type_node, a, b, kind);
2184 static int_range<2>
2185 range_uchar (int a, int b, value_range_kind kind = VR_RANGE)
2187 return range (unsigned_char_type_node, a, b, kind);
2190 static int_range<2>
2191 range_char (int a, int b, value_range_kind kind = VR_RANGE)
2193 return range (signed_char_type_node, a, b, kind);
2196 static int_range<3>
2197 build_range3 (int a, int b, int c, int d, int e, int f)
2199 int_range<3> i1 = range_int (a, b);
2200 int_range<3> i2 = range_int (c, d);
2201 int_range<3> i3 = range_int (e, f);
2202 i1.union_ (i2);
2203 i1.union_ (i3);
2204 return i1;
2207 static void
2208 range_tests_irange3 ()
2210 int_range<3> r0, r1, r2;
2211 int_range<3> i1, i2, i3;
2213 // ([10,20] U [5,8]) U [1,3] ==> [1,3][5,8][10,20].
2214 r0 = range_int (10, 20);
2215 r1 = range_int (5, 8);
2216 r0.union_ (r1);
2217 r1 = range_int (1, 3);
2218 r0.union_ (r1);
2219 ASSERT_TRUE (r0 == build_range3 (1, 3, 5, 8, 10, 20));
2221 // [1,3][5,8][10,20] U [-5,0] => [-5,3][5,8][10,20].
2222 r1 = range_int (-5, 0);
2223 r0.union_ (r1);
2224 ASSERT_TRUE (r0 == build_range3 (-5, 3, 5, 8, 10, 20));
2226 // [10,20][30,40] U [50,60] ==> [10,20][30,40][50,60].
2227 r1 = range_int (50, 60);
2228 r0 = range_int (10, 20);
2229 r0.union_ (range_int (30, 40));
2230 r0.union_ (r1);
2231 ASSERT_TRUE (r0 == build_range3 (10, 20, 30, 40, 50, 60));
2232 // [10,20][30,40][50,60] U [70, 80] ==> [10,20][30,40][50,60][70,80].
2233 r1 = range_int (70, 80);
2234 r0.union_ (r1);
2236 r2 = build_range3 (10, 20, 30, 40, 50, 60);
2237 r2.union_ (range_int (70, 80));
2238 ASSERT_TRUE (r0 == r2);
2240 // [10,20][30,40][50,60] U [6,35] => [6,40][50,60].
2241 r0 = build_range3 (10, 20, 30, 40, 50, 60);
2242 r1 = range_int (6, 35);
2243 r0.union_ (r1);
2244 r1 = range_int (6, 40);
2245 r1.union_ (range_int (50, 60));
2246 ASSERT_TRUE (r0 == r1);
2248 // [10,20][30,40][50,60] U [6,60] => [6,60].
2249 r0 = build_range3 (10, 20, 30, 40, 50, 60);
2250 r1 = range_int (6, 60);
2251 r0.union_ (r1);
2252 ASSERT_TRUE (r0 == range_int (6, 60));
2254 // [10,20][30,40][50,60] U [6,70] => [6,70].
2255 r0 = build_range3 (10, 20, 30, 40, 50, 60);
2256 r1 = range_int (6, 70);
2257 r0.union_ (r1);
2258 ASSERT_TRUE (r0 == range_int (6, 70));
2260 // [10,20][30,40][50,60] U [35,70] => [10,20][30,70].
2261 r0 = build_range3 (10, 20, 30, 40, 50, 60);
2262 r1 = range_int (35, 70);
2263 r0.union_ (r1);
2264 r1 = range_int (10, 20);
2265 r1.union_ (range_int (30, 70));
2266 ASSERT_TRUE (r0 == r1);
2268 // [10,20][30,40][50,60] U [15,35] => [10,40][50,60].
2269 r0 = build_range3 (10, 20, 30, 40, 50, 60);
2270 r1 = range_int (15, 35);
2271 r0.union_ (r1);
2272 r1 = range_int (10, 40);
2273 r1.union_ (range_int (50, 60));
2274 ASSERT_TRUE (r0 == r1);
2276 // [10,20][30,40][50,60] U [35,35] => [10,20][30,40][50,60].
2277 r0 = build_range3 (10, 20, 30, 40, 50, 60);
2278 r1 = range_int (35, 35);
2279 r0.union_ (r1);
2280 ASSERT_TRUE (r0 == build_range3 (10, 20, 30, 40, 50, 60));
2283 static void
2284 range_tests_int_range_max ()
2286 int_range_max big;
2287 unsigned int nrange;
2289 // Build a huge multi-range range.
2290 for (nrange = 0; nrange < 50; ++nrange)
2292 int_range<1> tmp = range_int (nrange*10, nrange *10 + 5);
2293 big.union_ (tmp);
2295 ASSERT_TRUE (big.num_pairs () == nrange);
2297 // Verify that we can copy it without loosing precision.
2298 int_range_max copy (big);
2299 ASSERT_TRUE (copy.num_pairs () == nrange);
2301 // Inverting it should produce one more sub-range.
2302 big.invert ();
2303 ASSERT_TRUE (big.num_pairs () == nrange + 1);
2305 int_range<1> tmp = range_int (5, 37);
2306 big.intersect (tmp);
2307 ASSERT_TRUE (big.num_pairs () == 4);
2309 // Test that [10,10][20,20] does NOT contain 15.
2311 int_range_max i1 = range_int (10, 10);
2312 int_range_max i2 = range_int (20, 20);
2313 i1.union_ (i2);
2314 ASSERT_FALSE (i1.contains_p (INT (15)));
2318 // Simulate -fstrict-enums where the domain of a type is less than the
2319 // underlying type.
2321 static void
2322 range_tests_strict_enum ()
2324 // The enum can only hold [0, 3].
2325 tree rtype = copy_node (unsigned_type_node);
2326 TYPE_MIN_VALUE (rtype) = build_int_cstu (rtype, 0);
2327 TYPE_MAX_VALUE (rtype) = build_int_cstu (rtype, 3);
2329 // Test that even though vr1 covers the strict enum domain ([0, 3]),
2330 // it does not cover the domain of the underlying type.
2331 int_range<1> vr1 = range (rtype, 0, 1);
2332 int_range<1> vr2 = range (rtype, 2, 3);
2333 vr1.union_ (vr2);
2334 ASSERT_TRUE (vr1 == range (rtype, 0, 3));
2335 ASSERT_FALSE (vr1.varying_p ());
2337 // Test that copying to a multi-range does not change things.
2338 int_range<2> ir1 (vr1);
2339 ASSERT_TRUE (ir1 == vr1);
2340 ASSERT_FALSE (ir1.varying_p ());
2342 // The same test as above, but using TYPE_{MIN,MAX}_VALUE instead of [0,3].
2343 vr1 = int_range<2> (rtype,
2344 wi::to_wide (TYPE_MIN_VALUE (rtype)),
2345 wi::to_wide (TYPE_MAX_VALUE (rtype)));
2346 ir1 = vr1;
2347 ASSERT_TRUE (ir1 == vr1);
2348 ASSERT_FALSE (ir1.varying_p ());
2351 static void
2352 range_tests_misc ()
2354 tree u128_type = build_nonstandard_integer_type (128, /*unsigned=*/1);
2355 int_range<2> i1, i2, i3;
2356 int_range<2> r0, r1, rold;
2358 // Test 1-bit signed integer union.
2359 // [-1,-1] U [0,0] = VARYING.
2360 tree one_bit_type = build_nonstandard_integer_type (1, 0);
2361 wide_int one_bit_min = irange_val_min (one_bit_type);
2362 wide_int one_bit_max = irange_val_max (one_bit_type);
2364 int_range<2> min = int_range<2> (one_bit_type, one_bit_min, one_bit_min);
2365 int_range<2> max = int_range<2> (one_bit_type, one_bit_max, one_bit_max);
2366 max.union_ (min);
2367 ASSERT_TRUE (max.varying_p ());
2369 // Test that we can set a range of true+false for a 1-bit signed int.
2370 r0 = range_true_and_false (one_bit_type);
2372 // Test inversion of 1-bit signed integers.
2374 int_range<2> min = int_range<2> (one_bit_type, one_bit_min, one_bit_min);
2375 int_range<2> max = int_range<2> (one_bit_type, one_bit_max, one_bit_max);
2376 int_range<2> t;
2377 t = min;
2378 t.invert ();
2379 ASSERT_TRUE (t == max);
2380 t = max;
2381 t.invert ();
2382 ASSERT_TRUE (t == min);
2385 // Test that NOT(255) is [0..254] in 8-bit land.
2386 int_range<1> not_255 = range_uchar (255, 255, VR_ANTI_RANGE);
2387 ASSERT_TRUE (not_255 == range_uchar (0, 254));
2389 // Test that NOT(0) is [1..255] in 8-bit land.
2390 int_range<2> not_zero = range_nonzero (unsigned_char_type_node);
2391 ASSERT_TRUE (not_zero == range_uchar (1, 255));
2393 // Check that [0,127][0x..ffffff80,0x..ffffff]
2394 // => ~[128, 0x..ffffff7f].
2395 r0 = range_uint128 (0, 127);
2396 wide_int high = wi::minus_one (128);
2397 // low = -1 - 127 => 0x..ffffff80.
2398 wide_int low = wi::sub (high, wi::uhwi (127, 128));
2399 r1 = int_range<1> (u128_type, low, high); // [0x..ffffff80, 0x..ffffffff]
2400 // r0 = [0,127][0x..ffffff80,0x..fffffff].
2401 r0.union_ (r1);
2402 // r1 = [128, 0x..ffffff7f].
2403 r1 = int_range<1> (u128_type,
2404 wi::uhwi (128, 128),
2405 wi::sub (wi::minus_one (128), wi::uhwi (128, 128)));
2406 r0.invert ();
2407 ASSERT_TRUE (r0 == r1);
2409 r0.set_varying (integer_type_node);
2410 wide_int minint = r0.lower_bound ();
2411 wide_int maxint = r0.upper_bound ();
2413 r0.set_varying (short_integer_type_node);
2415 r0.set_varying (unsigned_type_node);
2416 wide_int maxuint = r0.upper_bound ();
2418 // Check that ~[0,5] => [6,MAX] for unsigned int.
2419 r0 = range_uint (0, 5);
2420 r0.invert ();
2421 ASSERT_TRUE (r0 == int_range<1> (unsigned_type_node,
2422 wi::uhwi (6, TYPE_PRECISION (unsigned_type_node)),
2423 maxuint));
2425 // Check that ~[10,MAX] => [0,9] for unsigned int.
2426 r0 = int_range<1> (unsigned_type_node,
2427 wi::uhwi (10, TYPE_PRECISION (unsigned_type_node)),
2428 maxuint);
2429 r0.invert ();
2430 ASSERT_TRUE (r0 == range_uint (0, 9));
2432 // Check that ~[0,5] => [6,MAX] for unsigned 128-bit numbers.
2433 r0 = range_uint128 (0, 5, VR_ANTI_RANGE);
2434 r1 = int_range<1> (u128_type, wi::uhwi (6, 128), wi::minus_one (128));
2435 ASSERT_TRUE (r0 == r1);
2437 // Check that [~5] is really [-MIN,4][6,MAX].
2438 r0 = range_int (5, 5, VR_ANTI_RANGE);
2439 r1 = int_range<1> (integer_type_node, minint, INT (4));
2440 r1.union_ (int_range<1> (integer_type_node, INT (6), maxint));
2441 ASSERT_FALSE (r1.undefined_p ());
2442 ASSERT_TRUE (r0 == r1);
2444 r1 = range_int (5, 5);
2445 int_range<2> r2 (r1);
2446 ASSERT_TRUE (r1 == r2);
2448 r1 = range_int (5, 10);
2450 r1 = range_int (5, 10);
2451 ASSERT_TRUE (r1.contains_p (INT (7)));
2453 r1 = range_char (0, 20);
2454 ASSERT_TRUE (r1.contains_p (SCHAR(15)));
2455 ASSERT_FALSE (r1.contains_p (SCHAR(300)));
2457 // NOT([10,20]) ==> [-MIN,9][21,MAX].
2458 r0 = r1 = range_int (10, 20);
2459 r2 = int_range<1> (integer_type_node, minint, INT(9));
2460 r2.union_ (int_range<1> (integer_type_node, INT(21), maxint));
2461 ASSERT_FALSE (r2.undefined_p ());
2462 r1.invert ();
2463 ASSERT_TRUE (r1 == r2);
2464 // Test that NOT(NOT(x)) == x.
2465 r2.invert ();
2466 ASSERT_TRUE (r0 == r2);
2468 // Test that booleans and their inverse work as expected.
2469 r0 = range_zero (boolean_type_node);
2470 ASSERT_TRUE (r0 == range_false ());
2471 r0.invert ();
2472 ASSERT_TRUE (r0 == range_true ());
2474 // Make sure NULL and non-NULL of pointer types work, and that
2475 // inverses of them are consistent.
2476 tree voidp = build_pointer_type (void_type_node);
2477 r0 = range_zero (voidp);
2478 r1 = r0;
2479 r0.invert ();
2480 r0.invert ();
2481 ASSERT_TRUE (r0 == r1);
2483 // [10,20] U [15, 30] => [10, 30].
2484 r0 = range_int (10, 20);
2485 r1 = range_int (15, 30);
2486 r0.union_ (r1);
2487 ASSERT_TRUE (r0 == range_int (10, 30));
2489 // [15,40] U [] => [15,40].
2490 r0 = range_int (15, 40);
2491 r1.set_undefined ();
2492 r0.union_ (r1);
2493 ASSERT_TRUE (r0 == range_int (15, 40));
2495 // [10,20] U [10,10] => [10,20].
2496 r0 = range_int (10, 20);
2497 r1 = range_int (10, 10);
2498 r0.union_ (r1);
2499 ASSERT_TRUE (r0 == range_int (10, 20));
2501 // [10,20] U [9,9] => [9,20].
2502 r0 = range_int (10, 20);
2503 r1 = range_int (9, 9);
2504 r0.union_ (r1);
2505 ASSERT_TRUE (r0 == range_int (9, 20));
2507 // [10,20] ^ [15,30] => [15,20].
2508 r0 = range_int (10, 20);
2509 r1 = range_int (15, 30);
2510 r0.intersect (r1);
2511 ASSERT_TRUE (r0 == range_int (15, 20));
2513 // Test the internal sanity of wide_int's wrt HWIs.
2514 ASSERT_TRUE (wi::max_value (TYPE_PRECISION (boolean_type_node),
2515 TYPE_SIGN (boolean_type_node))
2516 == wi::uhwi (1, TYPE_PRECISION (boolean_type_node)));
2518 // Test zero_p().
2519 r0 = range_int (0, 0);
2520 ASSERT_TRUE (r0.zero_p ());
2522 // Test nonzero_p().
2523 r0 = range_int (0, 0);
2524 r0.invert ();
2525 ASSERT_TRUE (r0.nonzero_p ());
2527 // r0 = ~[1,1]
2528 r0 = range_int (1, 1, VR_ANTI_RANGE);
2529 // r1 = ~[3,3]
2530 r1 = range_int (3, 3, VR_ANTI_RANGE);
2532 // vv = [0,0][2,2][4, MAX]
2533 int_range<3> vv = r0;
2534 vv.intersect (r1);
2536 ASSERT_TRUE (vv.contains_p (UINT (2)));
2537 ASSERT_TRUE (vv.num_pairs () == 3);
2539 r0 = range_int (1, 1);
2540 // And union it with [0,0][2,2][4,MAX] multi range
2541 r0.union_ (vv);
2542 // The result should be [0,2][4,MAX], or ~[3,3] but it must contain 2
2543 ASSERT_TRUE (r0.contains_p (INT (2)));
2546 static void
2547 range_tests_nonzero_bits ()
2549 int_range<2> r0, r1;
2551 // Adding nonzero bits to a varying drops the varying.
2552 r0.set_varying (integer_type_node);
2553 r0.set_nonzero_bits (INT (255));
2554 ASSERT_TRUE (!r0.varying_p ());
2555 // Dropping the nonzero bits brings us back to varying.
2556 r0.set_nonzero_bits (INT (-1));
2557 ASSERT_TRUE (r0.varying_p ());
2559 // Test contains_p with nonzero bits.
2560 r0.set_zero (integer_type_node);
2561 ASSERT_TRUE (r0.contains_p (INT (0)));
2562 ASSERT_FALSE (r0.contains_p (INT (1)));
2563 r0.set_nonzero_bits (INT (0xfe));
2564 ASSERT_FALSE (r0.contains_p (INT (0x100)));
2565 ASSERT_FALSE (r0.contains_p (INT (0x3)));
2567 // Union of nonzero bits.
2568 r0.set_varying (integer_type_node);
2569 r0.set_nonzero_bits (INT (0xf0));
2570 r1.set_varying (integer_type_node);
2571 r1.set_nonzero_bits (INT (0xf));
2572 r0.union_ (r1);
2573 ASSERT_TRUE (r0.get_nonzero_bits () == 0xff);
2575 // Intersect of nonzero bits.
2576 r0 = range_int (0, 255);
2577 r0.set_nonzero_bits (INT (0xfe));
2578 r1.set_varying (integer_type_node);
2579 r1.set_nonzero_bits (INT (0xf0));
2580 r0.intersect (r1);
2581 ASSERT_TRUE (r0.get_nonzero_bits () == 0xf0);
2583 // Intersect where the mask of nonzero bits is implicit from the range.
2584 r0.set_varying (integer_type_node);
2585 r1 = range_int (0, 255);
2586 r0.intersect (r1);
2587 ASSERT_TRUE (r0.get_nonzero_bits () == 0xff);
2589 // The union of a mask of 0xff..ffff00 with a mask of 0xff spans the
2590 // entire domain, and makes the range a varying.
2591 r0.set_varying (integer_type_node);
2592 wide_int x = wi::shwi (0xff, TYPE_PRECISION (integer_type_node));
2593 x = wi::bit_not (x);
2594 r0.set_nonzero_bits (x); // 0xff..ff00
2595 r1.set_varying (integer_type_node);
2596 r1.set_nonzero_bits (INT (0xff));
2597 r0.union_ (r1);
2598 ASSERT_TRUE (r0.varying_p ());
2600 // Test that setting a nonzero bit of 1 does not pessimize the range.
2601 r0.set_zero (integer_type_node);
2602 r0.set_nonzero_bits (INT (1));
2603 ASSERT_TRUE (r0.zero_p ());
2606 // Build an frange from string endpoints.
2608 static inline frange
2609 frange_float (const char *lb, const char *ub, tree type = float_type_node)
2611 REAL_VALUE_TYPE min, max;
2612 gcc_assert (real_from_string (&min, lb) == 0);
2613 gcc_assert (real_from_string (&max, ub) == 0);
2614 return frange (type, min, max);
2617 static void
2618 range_tests_nan ()
2620 frange r0, r1;
2621 REAL_VALUE_TYPE q, r;
2622 bool signbit;
2624 // Equal ranges but with differing NAN bits are not equal.
2625 if (HONOR_NANS (float_type_node))
2627 r1 = frange_float ("10", "12");
2628 r0 = r1;
2629 ASSERT_EQ (r0, r1);
2630 r0.clear_nan ();
2631 ASSERT_NE (r0, r1);
2632 r0.update_nan ();
2633 ASSERT_EQ (r0, r1);
2635 // [10, 20] NAN ^ [30, 40] NAN = NAN.
2636 r0 = frange_float ("10", "20");
2637 r1 = frange_float ("30", "40");
2638 r0.intersect (r1);
2639 ASSERT_TRUE (r0.known_isnan ());
2641 // [3,5] U [5,10] NAN = ... NAN
2642 r0 = frange_float ("3", "5");
2643 r0.clear_nan ();
2644 r1 = frange_float ("5", "10");
2645 r0.union_ (r1);
2646 ASSERT_TRUE (r0.maybe_isnan ());
2649 // [5,6] U NAN = [5,6] NAN.
2650 r0 = frange_float ("5", "6");
2651 r0.clear_nan ();
2652 r1.set_nan (float_type_node);
2653 r0.union_ (r1);
2654 real_from_string (&q, "5");
2655 real_from_string (&r, "6");
2656 ASSERT_TRUE (real_identical (&q, &r0.lower_bound ()));
2657 ASSERT_TRUE (real_identical (&r, &r0.upper_bound ()));
2658 ASSERT_TRUE (r0.maybe_isnan ());
2660 // NAN U NAN = NAN
2661 r0.set_nan (float_type_node);
2662 r1.set_nan (float_type_node);
2663 r0.union_ (r1);
2664 ASSERT_TRUE (r0.known_isnan ());
2666 // [INF, INF] NAN ^ NAN = NAN
2667 r0.set_nan (float_type_node);
2668 r1 = frange_float ("+Inf", "+Inf");
2669 if (!HONOR_NANS (float_type_node))
2670 r1.update_nan ();
2671 r0.intersect (r1);
2672 ASSERT_TRUE (r0.known_isnan ());
2674 // NAN ^ NAN = NAN
2675 r0.set_nan (float_type_node);
2676 r1.set_nan (float_type_node);
2677 r0.intersect (r1);
2678 ASSERT_TRUE (r0.known_isnan ());
2680 // +NAN ^ -NAN = UNDEFINED
2681 r0.set_nan (float_type_node, false);
2682 r1.set_nan (float_type_node, true);
2683 r0.intersect (r1);
2684 ASSERT_TRUE (r0.undefined_p ());
2686 // VARYING ^ NAN = NAN.
2687 r0.set_nan (float_type_node);
2688 r1.set_varying (float_type_node);
2689 r0.intersect (r1);
2690 ASSERT_TRUE (r0.known_isnan ());
2692 // [3,4] ^ NAN = UNDEFINED.
2693 r0 = frange_float ("3", "4");
2694 r0.clear_nan ();
2695 r1.set_nan (float_type_node);
2696 r0.intersect (r1);
2697 ASSERT_TRUE (r0.undefined_p ());
2699 // [-3, 5] ^ NAN = UNDEFINED
2700 r0 = frange_float ("-3", "5");
2701 r0.clear_nan ();
2702 r1.set_nan (float_type_node);
2703 r0.intersect (r1);
2704 ASSERT_TRUE (r0.undefined_p ());
2706 // Setting the NAN bit to yes does not make us a known NAN.
2707 r0.set_varying (float_type_node);
2708 r0.update_nan ();
2709 ASSERT_FALSE (r0.known_isnan ());
2711 // NAN is in a VARYING.
2712 r0.set_varying (float_type_node);
2713 real_nan (&r, "", 1, TYPE_MODE (float_type_node));
2714 REAL_VALUE_TYPE nan = r;
2715 ASSERT_TRUE (r0.contains_p (nan));
2717 // -NAN is in a VARYING.
2718 r0.set_varying (float_type_node);
2719 q = real_value_negate (&r);
2720 REAL_VALUE_TYPE neg_nan = q;
2721 ASSERT_TRUE (r0.contains_p (neg_nan));
2723 // Clearing the NAN on a [] NAN is the empty set.
2724 r0.set_nan (float_type_node);
2725 r0.clear_nan ();
2726 ASSERT_TRUE (r0.undefined_p ());
2728 // [10,20] NAN ^ [21,25] NAN = [NAN]
2729 r0 = frange_float ("10", "20");
2730 r0.update_nan ();
2731 r1 = frange_float ("21", "25");
2732 r1.update_nan ();
2733 r0.intersect (r1);
2734 ASSERT_TRUE (r0.known_isnan ());
2736 // NAN U [5,6] should be [5,6] +-NAN.
2737 r0.set_nan (float_type_node);
2738 r1 = frange_float ("5", "6");
2739 r1.clear_nan ();
2740 r0.union_ (r1);
2741 real_from_string (&q, "5");
2742 real_from_string (&r, "6");
2743 ASSERT_TRUE (real_identical (&q, &r0.lower_bound ()));
2744 ASSERT_TRUE (real_identical (&r, &r0.upper_bound ()));
2745 ASSERT_TRUE (!r0.signbit_p (signbit));
2746 ASSERT_TRUE (r0.maybe_isnan ());
2748 // NAN U NAN shouldn't change anything.
2749 r0.set_nan (float_type_node);
2750 r1.set_nan (float_type_node);
2751 ASSERT_FALSE (r0.union_ (r1));
2753 // [3,5] NAN U NAN shouldn't change anything.
2754 r0 = frange_float ("3", "5");
2755 r1.set_nan (float_type_node);
2756 ASSERT_FALSE (r0.union_ (r1));
2758 // [3,5] U NAN *does* trigger a change.
2759 r0 = frange_float ("3", "5");
2760 r0.clear_nan ();
2761 r1.set_nan (float_type_node);
2762 ASSERT_TRUE (r0.union_ (r1));
2765 static void
2766 range_tests_signed_zeros ()
2768 REAL_VALUE_TYPE zero = dconst0;
2769 REAL_VALUE_TYPE neg_zero = zero;
2770 neg_zero.sign = 1;
2771 frange r0, r1;
2772 bool signbit;
2774 // [0,0] contains [0,0] but not [-0,-0] and vice versa.
2775 r0 = frange_float ("0.0", "0.0");
2776 r1 = frange_float ("-0.0", "-0.0");
2777 ASSERT_TRUE (r0.contains_p (zero));
2778 ASSERT_TRUE (!r0.contains_p (neg_zero));
2779 ASSERT_TRUE (r1.contains_p (neg_zero));
2780 ASSERT_TRUE (!r1.contains_p (zero));
2782 // Test contains_p() when we know the sign of the zero.
2783 r0 = frange_float ("0.0", "0.0");
2784 ASSERT_TRUE (r0.contains_p (zero));
2785 ASSERT_FALSE (r0.contains_p (neg_zero));
2786 r0 = frange_float ("-0.0", "-0.0");
2787 ASSERT_TRUE (r0.contains_p (neg_zero));
2788 ASSERT_FALSE (r0.contains_p (zero));
2790 r0 = frange_float ("-0.0", "0.0");
2791 ASSERT_TRUE (r0.contains_p (neg_zero));
2792 ASSERT_TRUE (r0.contains_p (zero));
2794 r0 = frange_float ("-3", "5");
2795 ASSERT_TRUE (r0.contains_p (neg_zero));
2796 ASSERT_TRUE (r0.contains_p (zero));
2798 // The intersection of zeros that differ in sign is a NAN (or
2799 // undefined if not honoring NANs).
2800 r0 = frange_float ("-0.0", "-0.0");
2801 r1 = frange_float ("0.0", "0.0");
2802 r0.intersect (r1);
2803 if (HONOR_NANS (float_type_node))
2804 ASSERT_TRUE (r0.known_isnan ());
2805 else
2806 ASSERT_TRUE (r0.undefined_p ());
2808 // The union of zeros that differ in sign is a zero with unknown sign.
2809 r0 = frange_float ("0.0", "0.0");
2810 r1 = frange_float ("-0.0", "-0.0");
2811 r0.union_ (r1);
2812 ASSERT_TRUE (r0.zero_p () && !r0.signbit_p (signbit));
2814 // [-0, +0] has an unknown sign.
2815 r0 = frange_float ("-0.0", "0.0");
2816 ASSERT_TRUE (r0.zero_p () && !r0.signbit_p (signbit));
2818 // [-0, +0] ^ [0, 0] is [0, 0]
2819 r0 = frange_float ("-0.0", "0.0");
2820 r1 = frange_float ("0.0", "0.0");
2821 r0.intersect (r1);
2822 ASSERT_TRUE (r0.zero_p ());
2824 r0 = frange_float ("+0", "5");
2825 r0.clear_nan ();
2826 ASSERT_TRUE (r0.signbit_p (signbit) && !signbit);
2828 r0 = frange_float ("-0", "5");
2829 r0.clear_nan ();
2830 ASSERT_TRUE (!r0.signbit_p (signbit));
2832 r0 = frange_float ("-0", "10");
2833 r1 = frange_float ("0", "5");
2834 r0.intersect (r1);
2835 ASSERT_TRUE (real_iszero (&r0.lower_bound (), false));
2837 r0 = frange_float ("-0", "5");
2838 r1 = frange_float ("0", "5");
2839 r0.union_ (r1);
2840 ASSERT_TRUE (real_iszero (&r0.lower_bound (), true));
2842 r0 = frange_float ("-5", "-0");
2843 r0.update_nan ();
2844 r1 = frange_float ("0", "0");
2845 r1.update_nan ();
2846 r0.intersect (r1);
2847 if (HONOR_NANS (float_type_node))
2848 ASSERT_TRUE (r0.known_isnan ());
2849 else
2850 ASSERT_TRUE (r0.undefined_p ());
2852 r0.set_nonnegative (float_type_node);
2853 if (HONOR_NANS (float_type_node))
2854 ASSERT_TRUE (r0.maybe_isnan ());
2856 // Numbers containing zero should have an unknown SIGNBIT.
2857 r0 = frange_float ("0", "10");
2858 r0.clear_nan ();
2859 ASSERT_TRUE (r0.signbit_p (signbit) && !signbit);
2862 static void
2863 range_tests_signbit ()
2865 frange r0, r1;
2866 bool signbit;
2868 // Negative numbers should have the SIGNBIT set.
2869 r0 = frange_float ("-5", "-1");
2870 r0.clear_nan ();
2871 ASSERT_TRUE (r0.signbit_p (signbit) && signbit);
2872 // Positive numbers should have the SIGNBIT clear.
2873 r0 = frange_float ("1", "10");
2874 r0.clear_nan ();
2875 ASSERT_TRUE (r0.signbit_p (signbit) && !signbit);
2876 // Numbers spanning both positive and negative should have an
2877 // unknown SIGNBIT.
2878 r0 = frange_float ("-10", "10");
2879 r0.clear_nan ();
2880 ASSERT_TRUE (!r0.signbit_p (signbit));
2881 r0.set_varying (float_type_node);
2882 ASSERT_TRUE (!r0.signbit_p (signbit));
2885 static void
2886 range_tests_floats ()
2888 frange r0, r1;
2890 if (HONOR_NANS (float_type_node))
2891 range_tests_nan ();
2892 range_tests_signbit ();
2894 if (HONOR_SIGNED_ZEROS (float_type_node))
2895 range_tests_signed_zeros ();
2897 // A range of [-INF,+INF] is actually VARYING if no other properties
2898 // are set.
2899 r0 = frange_float ("-Inf", "+Inf");
2900 ASSERT_TRUE (r0.varying_p ());
2901 // ...unless it has some special property...
2902 if (HONOR_NANS (r0.type ()))
2904 r0.clear_nan ();
2905 ASSERT_FALSE (r0.varying_p ());
2908 // For most architectures, where float and double are different
2909 // sizes, having the same endpoints does not necessarily mean the
2910 // ranges are equal.
2911 if (!types_compatible_p (float_type_node, double_type_node))
2913 r0 = frange_float ("3.0", "3.0", float_type_node);
2914 r1 = frange_float ("3.0", "3.0", double_type_node);
2915 ASSERT_NE (r0, r1);
2918 // [3,5] U [10,12] = [3,12].
2919 r0 = frange_float ("3", "5");
2920 r1 = frange_float ("10", "12");
2921 r0.union_ (r1);
2922 ASSERT_EQ (r0, frange_float ("3", "12"));
2924 // [5,10] U [4,8] = [4,10]
2925 r0 = frange_float ("5", "10");
2926 r1 = frange_float ("4", "8");
2927 r0.union_ (r1);
2928 ASSERT_EQ (r0, frange_float ("4", "10"));
2930 // [3,5] U [4,10] = [3,10]
2931 r0 = frange_float ("3", "5");
2932 r1 = frange_float ("4", "10");
2933 r0.union_ (r1);
2934 ASSERT_EQ (r0, frange_float ("3", "10"));
2936 // [4,10] U [5,11] = [4,11]
2937 r0 = frange_float ("4", "10");
2938 r1 = frange_float ("5", "11");
2939 r0.union_ (r1);
2940 ASSERT_EQ (r0, frange_float ("4", "11"));
2942 // [3,12] ^ [10,12] = [10,12].
2943 r0 = frange_float ("3", "12");
2944 r1 = frange_float ("10", "12");
2945 r0.intersect (r1);
2946 ASSERT_EQ (r0, frange_float ("10", "12"));
2948 // [10,12] ^ [11,11] = [11,11]
2949 r0 = frange_float ("10", "12");
2950 r1 = frange_float ("11", "11");
2951 r0.intersect (r1);
2952 ASSERT_EQ (r0, frange_float ("11", "11"));
2954 // [10,20] ^ [5,15] = [10,15]
2955 r0 = frange_float ("10", "20");
2956 r1 = frange_float ("5", "15");
2957 r0.intersect (r1);
2958 ASSERT_EQ (r0, frange_float ("10", "15"));
2960 // [10,20] ^ [15,25] = [15,20]
2961 r0 = frange_float ("10", "20");
2962 r1 = frange_float ("15", "25");
2963 r0.intersect (r1);
2964 ASSERT_EQ (r0, frange_float ("15", "20"));
2966 // [10,20] ^ [21,25] = []
2967 r0 = frange_float ("10", "20");
2968 r0.clear_nan ();
2969 r1 = frange_float ("21", "25");
2970 r1.clear_nan ();
2971 r0.intersect (r1);
2972 ASSERT_TRUE (r0.undefined_p ());
2974 if (HONOR_INFINITIES (float_type_node))
2976 // Make sure [-Inf, -Inf] doesn't get normalized.
2977 r0 = frange_float ("-Inf", "-Inf");
2978 ASSERT_TRUE (real_isinf (&r0.lower_bound (), true));
2979 ASSERT_TRUE (real_isinf (&r0.upper_bound (), true));
2982 // Test that reading back a global range yields the same result as
2983 // what we wrote into it.
2984 tree ssa = make_temp_ssa_name (float_type_node, NULL, "blah");
2985 r0.set_varying (float_type_node);
2986 r0.clear_nan ();
2987 set_range_info (ssa, r0);
2988 get_global_range_query ()->range_of_expr (r1, ssa);
2989 ASSERT_EQ (r0, r1);
2992 // Run floating range tests for various combinations of NAN and INF
2993 // support.
2995 static void
2996 range_tests_floats_various ()
2998 int save_finite_math_only = flag_finite_math_only;
3000 // Test -ffinite-math-only.
3001 flag_finite_math_only = 1;
3002 range_tests_floats ();
3003 // Test -fno-finite-math-only.
3004 flag_finite_math_only = 0;
3005 range_tests_floats ();
3007 flag_finite_math_only = save_finite_math_only;
3010 void
3011 range_tests ()
3013 range_tests_irange3 ();
3014 range_tests_int_range_max ();
3015 range_tests_strict_enum ();
3016 range_tests_nonzero_bits ();
3017 range_tests_floats_various ();
3018 range_tests_misc ();
3021 } // namespace selftest
3023 #endif // CHECKING_P