]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/value-range.cc
Allow varying ranges of unknown types in irange::verify_range [PR109711]
[thirdparty/gcc.git] / gcc / value-range.cc
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>.
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
11 any later version.
12
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
21
22 #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"
33
34 void
35 irange::accept (const vrange_visitor &v) const
36 {
37 v.visit (*this);
38 }
39
40 void
41 unsupported_range::accept (const vrange_visitor &v) const
42 {
43 v.visit (*this);
44 }
45
46 // Convenience function only available for integers and pointers.
47
48 wide_int
49 Value_Range::lower_bound () const
50 {
51 if (is_a <irange> (*m_vrange))
52 return as_a <irange> (*m_vrange).lower_bound ();
53 gcc_unreachable ();
54 }
55
56 // Convenience function only available for integers and pointers.
57
58 wide_int
59 Value_Range::upper_bound () const
60 {
61 if (is_a <irange> (*m_vrange))
62 return as_a <irange> (*m_vrange).upper_bound ();
63 gcc_unreachable ();
64 }
65
66 void
67 Value_Range::dump (FILE *out) const
68 {
69 if (m_vrange)
70 m_vrange->dump (out);
71 else
72 fprintf (out, "NULL");
73 }
74
75 DEBUG_FUNCTION void
76 debug (const Value_Range &r)
77 {
78 r.dump (stderr);
79 fprintf (stderr, "\n");
80 }
81
82 // Default vrange definitions.
83
84 bool
85 vrange::contains_p (tree) const
86 {
87 return varying_p ();
88 }
89
90 bool
91 vrange::singleton_p (tree *) const
92 {
93 return false;
94 }
95
96 void
97 vrange::set (tree min, tree, value_range_kind)
98 {
99 set_varying (TREE_TYPE (min));
100 }
101
102 tree
103 vrange::type () const
104 {
105 return void_type_node;
106 }
107
108 bool
109 vrange::supports_type_p (const_tree) const
110 {
111 return false;
112 }
113
114 void
115 vrange::set_undefined ()
116 {
117 m_kind = VR_UNDEFINED;
118 }
119
120 void
121 vrange::set_varying (tree)
122 {
123 m_kind = VR_VARYING;
124 }
125
126 bool
127 vrange::union_ (const vrange &r)
128 {
129 if (r.undefined_p () || varying_p ())
130 return false;
131 if (undefined_p () || r.varying_p ())
132 {
133 operator= (r);
134 return true;
135 }
136 gcc_unreachable ();
137 return false;
138 }
139
140 bool
141 vrange::intersect (const vrange &r)
142 {
143 if (undefined_p () || r.varying_p ())
144 return false;
145 if (r.undefined_p ())
146 {
147 set_undefined ();
148 return true;
149 }
150 if (varying_p ())
151 {
152 operator= (r);
153 return true;
154 }
155 gcc_unreachable ();
156 return false;
157 }
158
159 bool
160 vrange::zero_p () const
161 {
162 return false;
163 }
164
165 bool
166 vrange::nonzero_p () const
167 {
168 return false;
169 }
170
171 void
172 vrange::set_nonzero (tree type)
173 {
174 set_varying (type);
175 }
176
177 void
178 vrange::set_zero (tree type)
179 {
180 set_varying (type);
181 }
182
183 void
184 vrange::set_nonnegative (tree type)
185 {
186 set_varying (type);
187 }
188
189 bool
190 vrange::fits_p (const vrange &) const
191 {
192 return true;
193 }
194
195 // Assignment operator for generic ranges. Copying incompatible types
196 // is not allowed.
197
198 vrange &
199 vrange::operator= (const vrange &src)
200 {
201 if (is_a <irange> (src))
202 as_a <irange> (*this) = as_a <irange> (src);
203 else if (is_a <frange> (src))
204 as_a <frange> (*this) = as_a <frange> (src);
205 else
206 gcc_unreachable ();
207 return *this;
208 }
209
210 // Equality operator for generic ranges.
211
212 bool
213 vrange::operator== (const vrange &src) const
214 {
215 if (is_a <irange> (src))
216 return as_a <irange> (*this) == as_a <irange> (src);
217 if (is_a <frange> (src))
218 return as_a <frange> (*this) == as_a <frange> (src);
219 gcc_unreachable ();
220 }
221
222 // Wrapper for vrange_printer to dump a range to a file.
223
224 void
225 vrange::dump (FILE *file) const
226 {
227 pretty_printer buffer;
228 pp_needs_newline (&buffer) = true;
229 buffer.buffer->stream = file;
230 vrange_printer vrange_pp (&buffer);
231 this->accept (vrange_pp);
232 pp_flush (&buffer);
233 }
234
235 namespace inchash
236 {
237
238 void
239 add_vrange (const vrange &v, inchash::hash &hstate,
240 unsigned int)
241 {
242 if (v.undefined_p ())
243 {
244 hstate.add_int (VR_UNDEFINED);
245 return;
246 }
247 // Types are ignored throughout to inhibit two ranges being equal
248 // but having different hash values. This can happen when two
249 // ranges are equal and their types are different (but
250 // types_compatible_p is true).
251 if (is_a <irange> (v))
252 {
253 const irange &r = as_a <irange> (v);
254 if (r.varying_p ())
255 hstate.add_int (VR_VARYING);
256 else
257 hstate.add_int (VR_RANGE);
258 for (unsigned i = 0; i < r.num_pairs (); ++i)
259 {
260 hstate.add_wide_int (r.lower_bound (i));
261 hstate.add_wide_int (r.upper_bound (i));
262 }
263 hstate.add_wide_int (r.get_nonzero_bits ());
264 return;
265 }
266 if (is_a <frange> (v))
267 {
268 const frange &r = as_a <frange> (v);
269 if (r.varying_p ())
270 hstate.add_int (VR_VARYING);
271 else
272 hstate.add_int (VR_RANGE);
273
274 hstate.add_real_value (r.lower_bound ());
275 hstate.add_real_value (r.upper_bound ());
276
277 nan_state nan = r.get_nan_state ();
278 hstate.add_int (nan.pos_p ());
279 hstate.add_int (nan.neg_p ());
280 return;
281 }
282 gcc_unreachable ();
283 }
284
285 } //namespace inchash
286
287 bool
288 irange::supports_type_p (const_tree type) const
289 {
290 return supports_p (type);
291 }
292
293 // Return TRUE if R fits in THIS.
294
295 bool
296 irange::fits_p (const vrange &r) const
297 {
298 return m_max_ranges >= as_a <irange> (r).num_pairs ();
299 }
300
301 void
302 irange::set_nonnegative (tree type)
303 {
304 set (type,
305 wi::zero (TYPE_PRECISION (type)),
306 wi::to_wide (TYPE_MAX_VALUE (type)));
307 }
308
309 void
310 frange::accept (const vrange_visitor &v) const
311 {
312 v.visit (*this);
313 }
314
315 // Flush denormal endpoints to the appropriate 0.0.
316
317 void
318 frange::flush_denormals_to_zero ()
319 {
320 if (undefined_p () || known_isnan ())
321 return;
322
323 machine_mode mode = TYPE_MODE (type ());
324 // Flush [x, -DENORMAL] to [x, -0.0].
325 if (real_isdenormal (&m_max, mode) && real_isneg (&m_max))
326 {
327 if (HONOR_SIGNED_ZEROS (m_type))
328 m_max = dconstm0;
329 else
330 m_max = dconst0;
331 }
332 // Flush [+DENORMAL, x] to [+0.0, x].
333 if (real_isdenormal (&m_min, mode) && !real_isneg (&m_min))
334 m_min = dconst0;
335 }
336
337 // Setter for franges.
338
339 void
340 frange::set (tree type,
341 const REAL_VALUE_TYPE &min, const REAL_VALUE_TYPE &max,
342 const nan_state &nan, value_range_kind kind)
343 {
344 switch (kind)
345 {
346 case VR_UNDEFINED:
347 set_undefined ();
348 return;
349 case VR_VARYING:
350 case VR_ANTI_RANGE:
351 set_varying (type);
352 return;
353 case VR_RANGE:
354 break;
355 default:
356 gcc_unreachable ();
357 }
358
359 // Handle NANs.
360 if (real_isnan (&min) || real_isnan (&max))
361 {
362 gcc_checking_assert (real_identical (&min, &max));
363 bool sign = real_isneg (&min);
364 set_nan (type, sign);
365 return;
366 }
367
368 m_kind = kind;
369 m_type = type;
370 m_min = min;
371 m_max = max;
372 if (HONOR_NANS (m_type))
373 {
374 m_pos_nan = nan.pos_p ();
375 m_neg_nan = nan.neg_p ();
376 }
377 else
378 {
379 m_pos_nan = false;
380 m_neg_nan = false;
381 }
382
383 if (!MODE_HAS_SIGNED_ZEROS (TYPE_MODE (m_type)))
384 {
385 if (real_iszero (&m_min, 1))
386 m_min.sign = 0;
387 if (real_iszero (&m_max, 1))
388 m_max.sign = 0;
389 }
390 else if (!HONOR_SIGNED_ZEROS (m_type))
391 {
392 if (real_iszero (&m_max, 1))
393 m_max.sign = 0;
394 if (real_iszero (&m_min, 0))
395 m_min.sign = 1;
396 }
397
398 // For -ffinite-math-only we can drop ranges outside the
399 // representable numbers to min/max for the type.
400 if (!HONOR_INFINITIES (m_type))
401 {
402 REAL_VALUE_TYPE min_repr = frange_val_min (m_type);
403 REAL_VALUE_TYPE max_repr = frange_val_max (m_type);
404 if (real_less (&m_min, &min_repr))
405 m_min = min_repr;
406 else if (real_less (&max_repr, &m_min))
407 m_min = max_repr;
408 if (real_less (&max_repr, &m_max))
409 m_max = max_repr;
410 else if (real_less (&m_max, &min_repr))
411 m_max = min_repr;
412 }
413
414 // Check for swapped ranges.
415 gcc_checking_assert (real_compare (LE_EXPR, &min, &max));
416
417 normalize_kind ();
418
419 if (flag_checking)
420 verify_range ();
421 }
422
423 // Setter for an frange defaulting the NAN possibility to +-NAN when
424 // HONOR_NANS.
425
426 void
427 frange::set (tree type,
428 const REAL_VALUE_TYPE &min, const REAL_VALUE_TYPE &max,
429 value_range_kind kind)
430 {
431 set (type, min, max, nan_state (true), kind);
432 }
433
434 void
435 frange::set (tree min, tree max, value_range_kind kind)
436 {
437 set (TREE_TYPE (min),
438 *TREE_REAL_CST_PTR (min), *TREE_REAL_CST_PTR (max), kind);
439 }
440
441 // Normalize range to VARYING or UNDEFINED, or vice versa. Return
442 // TRUE if anything changed.
443 //
444 // A range with no known properties can be dropped to VARYING.
445 // Similarly, a VARYING with any properties should be dropped to a
446 // VR_RANGE. Normalizing ranges upon changing them ensures there is
447 // only one representation for a given range.
448
449 bool
450 frange::normalize_kind ()
451 {
452 if (m_kind == VR_RANGE
453 && frange_val_is_min (m_min, m_type)
454 && frange_val_is_max (m_max, m_type))
455 {
456 if (!HONOR_NANS (m_type) || (m_pos_nan && m_neg_nan))
457 {
458 set_varying (m_type);
459 return true;
460 }
461 }
462 else if (m_kind == VR_VARYING)
463 {
464 if (HONOR_NANS (m_type) && (!m_pos_nan || !m_neg_nan))
465 {
466 m_kind = VR_RANGE;
467 m_min = frange_val_min (m_type);
468 m_max = frange_val_max (m_type);
469 return true;
470 }
471 }
472 else if (m_kind == VR_NAN && !m_pos_nan && !m_neg_nan)
473 set_undefined ();
474 return false;
475 }
476
477 // Union or intersect the zero endpoints of two ranges. For example:
478 // [-0, x] U [+0, x] => [-0, x]
479 // [ x, -0] U [ x, +0] => [ x, +0]
480 // [-0, x] ^ [+0, x] => [+0, x]
481 // [ x, -0] ^ [ x, +0] => [ x, -0]
482 //
483 // UNION_P is true when performing a union, or false when intersecting.
484
485 bool
486 frange::combine_zeros (const frange &r, bool union_p)
487 {
488 gcc_checking_assert (!undefined_p () && !known_isnan ());
489
490 bool changed = false;
491 if (real_iszero (&m_min) && real_iszero (&r.m_min)
492 && real_isneg (&m_min) != real_isneg (&r.m_min))
493 {
494 m_min.sign = union_p;
495 changed = true;
496 }
497 if (real_iszero (&m_max) && real_iszero (&r.m_max)
498 && real_isneg (&m_max) != real_isneg (&r.m_max))
499 {
500 m_max.sign = !union_p;
501 changed = true;
502 }
503 // If the signs are swapped, the resulting range is empty.
504 if (m_min.sign == 0 && m_max.sign == 1)
505 {
506 if (maybe_isnan ())
507 m_kind = VR_NAN;
508 else
509 set_undefined ();
510 changed = true;
511 }
512 return changed;
513 }
514
515 // Union two ranges when one is known to be a NAN.
516
517 bool
518 frange::union_nans (const frange &r)
519 {
520 gcc_checking_assert (known_isnan () || r.known_isnan ());
521
522 if (known_isnan ())
523 {
524 m_kind = r.m_kind;
525 m_min = r.m_min;
526 m_max = r.m_max;
527 }
528 m_pos_nan |= r.m_pos_nan;
529 m_neg_nan |= r.m_neg_nan;
530 normalize_kind ();
531 if (flag_checking)
532 verify_range ();
533 return true;
534 }
535
536 bool
537 frange::union_ (const vrange &v)
538 {
539 const frange &r = as_a <frange> (v);
540
541 if (r.undefined_p () || varying_p ())
542 return false;
543 if (undefined_p () || r.varying_p ())
544 {
545 *this = r;
546 return true;
547 }
548
549 // Combine NAN info.
550 if (known_isnan () || r.known_isnan ())
551 return union_nans (r);
552 bool changed = false;
553 if (m_pos_nan != r.m_pos_nan || m_neg_nan != r.m_neg_nan)
554 {
555 m_pos_nan |= r.m_pos_nan;
556 m_neg_nan |= r.m_neg_nan;
557 changed = true;
558 }
559
560 // Combine endpoints.
561 if (real_less (&r.m_min, &m_min))
562 {
563 m_min = r.m_min;
564 changed = true;
565 }
566 if (real_less (&m_max, &r.m_max))
567 {
568 m_max = r.m_max;
569 changed = true;
570 }
571
572 if (HONOR_SIGNED_ZEROS (m_type))
573 changed |= combine_zeros (r, true);
574
575 changed |= normalize_kind ();
576 if (flag_checking)
577 verify_range ();
578 return changed;
579 }
580
581 // Intersect two ranges when one is known to be a NAN.
582
583 bool
584 frange::intersect_nans (const frange &r)
585 {
586 gcc_checking_assert (known_isnan () || r.known_isnan ());
587
588 m_pos_nan &= r.m_pos_nan;
589 m_neg_nan &= r.m_neg_nan;
590 if (maybe_isnan ())
591 m_kind = VR_NAN;
592 else
593 set_undefined ();
594 if (flag_checking)
595 verify_range ();
596 return true;
597 }
598
599 bool
600 frange::intersect (const vrange &v)
601 {
602 const frange &r = as_a <frange> (v);
603
604 if (undefined_p () || r.varying_p ())
605 return false;
606 if (r.undefined_p ())
607 {
608 set_undefined ();
609 return true;
610 }
611 if (varying_p ())
612 {
613 *this = r;
614 return true;
615 }
616
617 // Combine NAN info.
618 if (known_isnan () || r.known_isnan ())
619 return intersect_nans (r);
620 bool changed = false;
621 if (m_pos_nan != r.m_pos_nan || m_neg_nan != r.m_neg_nan)
622 {
623 m_pos_nan &= r.m_pos_nan;
624 m_neg_nan &= r.m_neg_nan;
625 changed = true;
626 }
627
628 // Combine endpoints.
629 if (real_less (&m_min, &r.m_min))
630 {
631 m_min = r.m_min;
632 changed = true;
633 }
634 if (real_less (&r.m_max, &m_max))
635 {
636 m_max = r.m_max;
637 changed = true;
638 }
639 // If the endpoints are swapped, the resulting range is empty.
640 if (real_less (&m_max, &m_min))
641 {
642 if (maybe_isnan ())
643 m_kind = VR_NAN;
644 else
645 set_undefined ();
646 if (flag_checking)
647 verify_range ();
648 return true;
649 }
650
651 if (HONOR_SIGNED_ZEROS (m_type))
652 changed |= combine_zeros (r, false);
653
654 changed |= normalize_kind ();
655 if (flag_checking)
656 verify_range ();
657 return changed;
658 }
659
660 frange &
661 frange::operator= (const frange &src)
662 {
663 m_kind = src.m_kind;
664 m_type = src.m_type;
665 m_min = src.m_min;
666 m_max = src.m_max;
667 m_pos_nan = src.m_pos_nan;
668 m_neg_nan = src.m_neg_nan;
669
670 if (flag_checking)
671 verify_range ();
672 return *this;
673 }
674
675 bool
676 frange::operator== (const frange &src) const
677 {
678 if (m_kind == src.m_kind)
679 {
680 if (undefined_p ())
681 return true;
682
683 if (varying_p ())
684 return types_compatible_p (m_type, src.m_type);
685
686 bool nan1 = known_isnan ();
687 bool nan2 = src.known_isnan ();
688 if (nan1 || nan2)
689 {
690 if (nan1 && nan2)
691 return (m_pos_nan == src.m_pos_nan
692 && m_neg_nan == src.m_neg_nan);
693 return false;
694 }
695
696 return (real_identical (&m_min, &src.m_min)
697 && real_identical (&m_max, &src.m_max)
698 && m_pos_nan == src.m_pos_nan
699 && m_neg_nan == src.m_neg_nan
700 && types_compatible_p (m_type, src.m_type));
701 }
702 return false;
703 }
704
705 // Return TRUE if range contains R.
706
707 bool
708 frange::contains_p (const REAL_VALUE_TYPE &r) const
709 {
710 gcc_checking_assert (m_kind != VR_ANTI_RANGE);
711
712 if (undefined_p ())
713 return false;
714
715 if (varying_p ())
716 return true;
717
718 if (real_isnan (&r))
719 {
720 // No NAN in range.
721 if (!m_pos_nan && !m_neg_nan)
722 return false;
723 // Both +NAN and -NAN are present.
724 if (m_pos_nan && m_neg_nan)
725 return true;
726 return m_neg_nan == r.sign;
727 }
728 if (known_isnan ())
729 return false;
730
731 if (real_compare (GE_EXPR, &r, &m_min) && real_compare (LE_EXPR, &r, &m_max))
732 {
733 // Make sure the signs are equal for signed zeros.
734 if (HONOR_SIGNED_ZEROS (m_type) && real_iszero (&r))
735 return r.sign == m_min.sign || r.sign == m_max.sign;
736 return true;
737 }
738 return false;
739 }
740
741 // If range is a singleton, place it in RESULT and return TRUE. If
742 // RESULT is NULL, just return TRUE.
743 //
744 // A NAN can never be a singleton.
745
746 bool
747 frange::internal_singleton_p (REAL_VALUE_TYPE *result) const
748 {
749 if (m_kind == VR_RANGE && real_identical (&m_min, &m_max))
750 {
751 // Return false for any singleton that may be a NAN.
752 if (HONOR_NANS (m_type) && maybe_isnan ())
753 return false;
754
755 if (MODE_COMPOSITE_P (TYPE_MODE (m_type)))
756 {
757 // For IBM long doubles, if the value is +-Inf or is exactly
758 // representable in double, the other double could be +0.0
759 // or -0.0. Since this means there is more than one way to
760 // represent a value, return false to avoid propagating it.
761 // See libgcc/config/rs6000/ibm-ldouble-format for details.
762 if (real_isinf (&m_min))
763 return false;
764 REAL_VALUE_TYPE r;
765 real_convert (&r, DFmode, &m_min);
766 if (real_identical (&r, &m_min))
767 return false;
768 }
769
770 if (result)
771 *result = m_min;
772 return true;
773 }
774 return false;
775 }
776
777 bool
778 frange::singleton_p (tree *result) const
779 {
780 if (internal_singleton_p ())
781 {
782 if (result)
783 *result = build_real (m_type, m_min);
784 return true;
785 }
786 return false;
787 }
788
789 bool
790 frange::singleton_p (REAL_VALUE_TYPE &r) const
791 {
792 return internal_singleton_p (&r);
793 }
794
795 bool
796 frange::supports_type_p (const_tree type) const
797 {
798 return supports_p (type);
799 }
800
801 void
802 frange::verify_range ()
803 {
804 if (!undefined_p ())
805 gcc_checking_assert (HONOR_NANS (m_type) || !maybe_isnan ());
806 switch (m_kind)
807 {
808 case VR_UNDEFINED:
809 gcc_checking_assert (!m_type);
810 return;
811 case VR_VARYING:
812 gcc_checking_assert (m_type);
813 gcc_checking_assert (frange_val_is_min (m_min, m_type));
814 gcc_checking_assert (frange_val_is_max (m_max, m_type));
815 if (HONOR_NANS (m_type))
816 gcc_checking_assert (m_pos_nan && m_neg_nan);
817 else
818 gcc_checking_assert (!m_pos_nan && !m_neg_nan);
819 return;
820 case VR_RANGE:
821 gcc_checking_assert (m_type);
822 break;
823 case VR_NAN:
824 gcc_checking_assert (m_type);
825 gcc_checking_assert (m_pos_nan || m_neg_nan);
826 return;
827 default:
828 gcc_unreachable ();
829 }
830
831 // NANs cannot appear in the endpoints of a range.
832 gcc_checking_assert (!real_isnan (&m_min) && !real_isnan (&m_max));
833
834 // Make sure we don't have swapped ranges.
835 gcc_checking_assert (!real_less (&m_max, &m_min));
836
837 // [ +0.0, -0.0 ] is nonsensical.
838 gcc_checking_assert (!(real_iszero (&m_min, 0) && real_iszero (&m_max, 1)));
839
840 // If all the properties are clear, we better not span the entire
841 // domain, because that would make us varying.
842 if (m_pos_nan && m_neg_nan)
843 gcc_checking_assert (!frange_val_is_min (m_min, m_type)
844 || !frange_val_is_max (m_max, m_type));
845 }
846
847 // We can't do much with nonzeros yet.
848 void
849 frange::set_nonzero (tree type)
850 {
851 set_varying (type);
852 }
853
854 // We can't do much with nonzeros yet.
855 bool
856 frange::nonzero_p () const
857 {
858 return false;
859 }
860
861 // Set range to [+0.0, +0.0] if honoring signed zeros, or [0.0, 0.0]
862 // otherwise.
863
864 void
865 frange::set_zero (tree type)
866 {
867 if (HONOR_SIGNED_ZEROS (type))
868 {
869 set (type, dconstm0, dconst0);
870 clear_nan ();
871 }
872 else
873 set (type, dconst0, dconst0);
874 }
875
876 // Return TRUE for any zero regardless of sign.
877
878 bool
879 frange::zero_p () const
880 {
881 return (m_kind == VR_RANGE
882 && real_iszero (&m_min)
883 && real_iszero (&m_max));
884 }
885
886 // Set the range to non-negative numbers, that is [+0.0, +INF].
887 //
888 // The NAN in the resulting range (if HONOR_NANS) has a varying sign
889 // as there are no guarantees in IEEE 754 wrt to the sign of a NAN,
890 // except for copy, abs, and copysign. It is the responsibility of
891 // the caller to set the NAN's sign if desired.
892
893 void
894 frange::set_nonnegative (tree type)
895 {
896 set (type, dconst0, frange_val_max (type));
897 }
898
899 // Here we copy between any two irange's.
900
901 irange &
902 irange::operator= (const irange &src)
903 {
904 unsigned x;
905 unsigned lim = src.m_num_ranges;
906 if (lim > m_max_ranges)
907 lim = m_max_ranges;
908
909 for (x = 0; x < lim * 2; ++x)
910 m_base[x] = src.m_base[x];
911
912 // If the range didn't fit, the last range should cover the rest.
913 if (lim != src.m_num_ranges)
914 m_base[x - 1] = src.m_base[src.m_num_ranges * 2 - 1];
915
916 m_num_ranges = lim;
917 m_type = src.m_type;
918 m_kind = src.m_kind;
919 m_nonzero_mask = src.m_nonzero_mask;
920 if (m_max_ranges == 1)
921 normalize_kind ();
922 if (flag_checking)
923 verify_range ();
924 return *this;
925 }
926
927 value_range_kind
928 get_legacy_range (const irange &r, tree &min, tree &max)
929 {
930 if (r.undefined_p ())
931 {
932 min = NULL_TREE;
933 max = NULL_TREE;
934 return VR_UNDEFINED;
935 }
936
937 tree type = r.type ();
938 if (r.varying_p ())
939 {
940 min = wide_int_to_tree (type, r.lower_bound ());
941 max = wide_int_to_tree (type, r.upper_bound ());
942 return VR_VARYING;
943 }
944
945 unsigned int precision = TYPE_PRECISION (type);
946 signop sign = TYPE_SIGN (type);
947 if (r.num_pairs () > 1
948 && precision > 1
949 && r.lower_bound () == wi::min_value (precision, sign)
950 && r.upper_bound () == wi::max_value (precision, sign))
951 {
952 int_range<3> inv (r);
953 inv.invert ();
954 min = wide_int_to_tree (type, inv.lower_bound (0));
955 max = wide_int_to_tree (type, inv.upper_bound (0));
956 return VR_ANTI_RANGE;
957 }
958
959 min = wide_int_to_tree (type, r.lower_bound ());
960 max = wide_int_to_tree (type, r.upper_bound ());
961 return VR_RANGE;
962 }
963
964 /* Set value range to the canonical form of {VRTYPE, MIN, MAX, EQUIV}.
965 This means adjusting VRTYPE, MIN and MAX representing the case of a
966 wrapping range with MAX < MIN covering [MIN, type_max] U [type_min, MAX]
967 as anti-rage ~[MAX+1, MIN-1]. Likewise for wrapping anti-ranges.
968 In corner cases where MAX+1 or MIN-1 wraps this will fall back
969 to varying.
970 This routine exists to ease canonicalization in the case where we
971 extract ranges from var + CST op limit. */
972
973 void
974 irange::set (tree type, const wide_int &min, const wide_int &max,
975 value_range_kind kind)
976 {
977 unsigned prec = TYPE_PRECISION (type);
978 signop sign = TYPE_SIGN (type);
979 wide_int min_value = wi::min_value (prec, sign);
980 wide_int max_value = wi::max_value (prec, sign);
981
982 m_type = type;
983 m_nonzero_mask = wi::minus_one (prec);
984
985 if (kind == VR_RANGE)
986 {
987 m_base[0] = min;
988 m_base[1] = max;
989 m_num_ranges = 1;
990 if (min == min_value && max == max_value)
991 m_kind = VR_VARYING;
992 else
993 m_kind = VR_RANGE;
994 }
995 else
996 {
997 gcc_checking_assert (kind == VR_ANTI_RANGE);
998 gcc_checking_assert (m_max_ranges > 1);
999
1000 m_kind = VR_UNDEFINED;
1001 m_num_ranges = 0;
1002 wi::overflow_type ovf;
1003 wide_int lim;
1004 if (sign == SIGNED)
1005 lim = wi::add (min, -1, sign, &ovf);
1006 else
1007 lim = wi::sub (min, 1, sign, &ovf);
1008
1009 if (!ovf)
1010 {
1011 m_kind = VR_RANGE;
1012 m_base[0] = min_value;
1013 m_base[1] = lim;
1014 ++m_num_ranges;
1015 }
1016 if (sign == SIGNED)
1017 lim = wi::sub (max, -1, sign, &ovf);
1018 else
1019 lim = wi::add (max, 1, sign, &ovf);
1020 if (!ovf)
1021 {
1022 m_kind = VR_RANGE;
1023 m_base[m_num_ranges * 2] = lim;
1024 m_base[m_num_ranges * 2 + 1] = max_value;
1025 ++m_num_ranges;
1026 }
1027 }
1028
1029 if (flag_checking)
1030 verify_range ();
1031 }
1032
1033 void
1034 irange::set (tree min, tree max, value_range_kind kind)
1035 {
1036 if (POLY_INT_CST_P (min) || POLY_INT_CST_P (max))
1037 {
1038 set_varying (TREE_TYPE (min));
1039 return;
1040 }
1041
1042 gcc_checking_assert (TREE_CODE (min) == INTEGER_CST);
1043 gcc_checking_assert (TREE_CODE (max) == INTEGER_CST);
1044
1045 return set (TREE_TYPE (min), wi::to_wide (min), wi::to_wide (max), kind);
1046 }
1047
1048 // Check the validity of the range.
1049
1050 void
1051 irange::verify_range ()
1052 {
1053 gcc_checking_assert (m_discriminator == VR_IRANGE);
1054 if (m_kind == VR_UNDEFINED)
1055 {
1056 gcc_checking_assert (m_num_ranges == 0);
1057 return;
1058 }
1059 gcc_checking_assert (m_num_ranges <= m_max_ranges);
1060
1061 // Legacy allowed these to represent VARYING for unknown types.
1062 // Leave this in for now, until all users are converted. Eventually
1063 // we should abort in set_varying.
1064 if (m_kind == VR_VARYING && m_type == error_mark_node)
1065 return;
1066
1067 unsigned prec = TYPE_PRECISION (m_type);
1068 if (m_kind == VR_VARYING)
1069 {
1070 gcc_checking_assert (m_nonzero_mask == -1);
1071 gcc_checking_assert (m_num_ranges == 1);
1072 gcc_checking_assert (varying_compatible_p ());
1073 gcc_checking_assert (lower_bound ().get_precision () == prec);
1074 gcc_checking_assert (upper_bound ().get_precision () == prec);
1075 return;
1076 }
1077 gcc_checking_assert (m_num_ranges != 0);
1078 gcc_checking_assert (!varying_compatible_p ());
1079 for (unsigned i = 0; i < m_num_ranges; ++i)
1080 {
1081 wide_int lb = lower_bound (i);
1082 wide_int ub = upper_bound (i);
1083 gcc_checking_assert (lb.get_precision () == prec);
1084 gcc_checking_assert (ub.get_precision () == prec);
1085 int c = wi::cmp (lb, ub, TYPE_SIGN (m_type));
1086 gcc_checking_assert (c == 0 || c == -1);
1087 }
1088 gcc_checking_assert (m_nonzero_mask.get_precision () == prec);
1089 }
1090
1091 bool
1092 irange::operator== (const irange &other) const
1093 {
1094 if (m_num_ranges != other.m_num_ranges)
1095 return false;
1096
1097 if (m_num_ranges == 0)
1098 return true;
1099
1100 signop sign1 = TYPE_SIGN (type ());
1101 signop sign2 = TYPE_SIGN (other.type ());
1102
1103 for (unsigned i = 0; i < m_num_ranges; ++i)
1104 {
1105 widest_int lb = widest_int::from (lower_bound (i), sign1);
1106 widest_int ub = widest_int::from (upper_bound (i), sign1);
1107 widest_int lb_other = widest_int::from (other.lower_bound (i), sign2);
1108 widest_int ub_other = widest_int::from (other.upper_bound (i), sign2);
1109 if (lb != lb_other || ub != ub_other)
1110 return false;
1111 }
1112 widest_int nz1 = widest_int::from (get_nonzero_bits (), sign1);
1113 widest_int nz2 = widest_int::from (other.get_nonzero_bits (), sign2);
1114 return nz1 == nz2;
1115 }
1116
1117 /* If range is a singleton, place it in RESULT and return TRUE. */
1118
1119 bool
1120 irange::singleton_p (tree *result) const
1121 {
1122 if (num_pairs () == 1 && lower_bound () == upper_bound ())
1123 {
1124 if (result)
1125 *result = wide_int_to_tree (type (), lower_bound ());
1126 return true;
1127 }
1128 return false;
1129 }
1130
1131 bool
1132 irange::singleton_p (wide_int &w) const
1133 {
1134 if (num_pairs () == 1 && lower_bound () == upper_bound ())
1135 {
1136 w = lower_bound ();
1137 return true;
1138 }
1139 return false;
1140 }
1141
1142 /* Return 1 if CST is inside value range.
1143 0 if CST is not inside value range.
1144
1145 Benchmark compile/20001226-1.c compilation time after changing this
1146 function. */
1147
1148 bool
1149 irange::contains_p (const wide_int &cst) const
1150 {
1151 if (undefined_p ())
1152 return false;
1153
1154 // See if we can exclude CST based on the nonzero bits.
1155 if (m_nonzero_mask != -1
1156 && cst != 0
1157 && wi::bit_and (m_nonzero_mask, cst) == 0)
1158 return false;
1159
1160 signop sign = TYPE_SIGN (type ());
1161 for (unsigned r = 0; r < m_num_ranges; ++r)
1162 {
1163 if (wi::lt_p (cst, lower_bound (r), sign))
1164 return false;
1165 if (wi::le_p (cst, upper_bound (r), sign))
1166 return true;
1167 }
1168
1169 return false;
1170 }
1171
1172 // Perform an efficient union with R when both ranges have only a single pair.
1173 // Excluded are VARYING and UNDEFINED ranges.
1174
1175 bool
1176 irange::irange_single_pair_union (const irange &r)
1177 {
1178 gcc_checking_assert (!undefined_p () && !varying_p ());
1179 gcc_checking_assert (!r.undefined_p () && !varying_p ());
1180
1181 signop sign = TYPE_SIGN (m_type);
1182 // Check if current lower bound is also the new lower bound.
1183 if (wi::le_p (m_base[0], r.m_base[0], sign))
1184 {
1185 // If current upper bound is new upper bound, we're done.
1186 if (wi::le_p (r.m_base[1], m_base[1], sign))
1187 return union_nonzero_bits (r);
1188 // Otherwise R has the new upper bound.
1189 // Check for overlap/touching ranges, or single target range.
1190 if (m_max_ranges == 1
1191 || (widest_int::from (m_base[1], sign) + 1
1192 >= widest_int::from (r.m_base[0], TYPE_SIGN (r.m_type))))
1193 m_base[1] = r.m_base[1];
1194 else
1195 {
1196 // This is a dual range result.
1197 m_base[2] = r.m_base[0];
1198 m_base[3] = r.m_base[1];
1199 m_num_ranges = 2;
1200 }
1201 union_nonzero_bits (r);
1202 return true;
1203 }
1204
1205 // Set the new lower bound to R's lower bound.
1206 wide_int lb = m_base[0];
1207 m_base[0] = r.m_base[0];
1208
1209 // If R fully contains THIS range, just set the upper bound.
1210 if (wi::ge_p (r.m_base[1], m_base[1], sign))
1211 m_base[1] = r.m_base[1];
1212 // Check for overlapping ranges, or target limited to a single range.
1213 else if (m_max_ranges == 1
1214 || (widest_int::from (r.m_base[1], TYPE_SIGN (r.m_type)) + 1
1215 >= widest_int::from (lb, sign)))
1216 ;
1217 else
1218 {
1219 // Left with 2 pairs.
1220 m_num_ranges = 2;
1221 m_base[2] = lb;
1222 m_base[3] = m_base[1];
1223 m_base[1] = r.m_base[1];
1224 }
1225 union_nonzero_bits (r);
1226 return true;
1227 }
1228
1229 // Return TRUE if anything changes.
1230
1231 bool
1232 irange::union_ (const vrange &v)
1233 {
1234 const irange &r = as_a <irange> (v);
1235
1236 if (r.undefined_p ())
1237 return false;
1238
1239 if (undefined_p ())
1240 {
1241 operator= (r);
1242 if (flag_checking)
1243 verify_range ();
1244 return true;
1245 }
1246
1247 if (varying_p ())
1248 return false;
1249
1250 if (r.varying_p ())
1251 {
1252 set_varying (type ());
1253 return true;
1254 }
1255
1256 // Special case one range union one range.
1257 if (m_num_ranges == 1 && r.m_num_ranges == 1)
1258 return irange_single_pair_union (r);
1259
1260 // If this ranges fully contains R, then we need do nothing.
1261 if (irange_contains_p (r))
1262 return union_nonzero_bits (r);
1263
1264 // Do not worry about merging and such by reserving twice as many
1265 // pairs as needed, and then simply sort the 2 ranges into this
1266 // intermediate form.
1267 //
1268 // The intermediate result will have the property that the beginning
1269 // of each range is <= the beginning of the next range. There may
1270 // be overlapping ranges at this point. I.e. this would be valid
1271 // [-20, 10], [-10, 0], [0, 20], [40, 90] as it satisfies this
1272 // constraint : -20 < -10 < 0 < 40. When the range is rebuilt into r,
1273 // the merge is performed.
1274 //
1275 // [Xi,Yi]..[Xn,Yn] U [Xj,Yj]..[Xm,Ym] --> [Xk,Yk]..[Xp,Yp]
1276 auto_vec<wide_int, 20> res (m_num_ranges * 2 + r.m_num_ranges * 2);
1277 unsigned i = 0, j = 0, k = 0;
1278 signop sign = TYPE_SIGN (m_type);
1279
1280 while (i < m_num_ranges * 2 && j < r.m_num_ranges * 2)
1281 {
1282 // lower of Xi and Xj is the lowest point.
1283 if (widest_int::from (m_base[i], sign)
1284 <= widest_int::from (r.m_base[j], sign))
1285 {
1286 res.quick_push (m_base[i]);
1287 res.quick_push (m_base[i + 1]);
1288 k += 2;
1289 i += 2;
1290 }
1291 else
1292 {
1293 res.quick_push (r.m_base[j]);
1294 res.quick_push (r.m_base[j + 1]);
1295 k += 2;
1296 j += 2;
1297 }
1298 }
1299 for ( ; i < m_num_ranges * 2; i += 2)
1300 {
1301 res.quick_push (m_base[i]);
1302 res.quick_push (m_base[i + 1]);
1303 k += 2;
1304 }
1305 for ( ; j < r.m_num_ranges * 2; j += 2)
1306 {
1307 res.quick_push (r.m_base[j]);
1308 res.quick_push (r.m_base[j + 1]);
1309 k += 2;
1310 }
1311
1312 // Now normalize the vector removing any overlaps.
1313 i = 2;
1314 for (j = 2; j < k ; j += 2)
1315 {
1316 // Current upper+1 is >= lower bound next pair, then we merge ranges.
1317 if (widest_int::from (res[i - 1], sign) + 1
1318 >= widest_int::from (res[j], sign))
1319 {
1320 // New upper bounds is greater of current or the next one.
1321 if (widest_int::from (res[j + 1], sign)
1322 > widest_int::from (res[i - 1], sign))
1323 res[i - 1] = res[j + 1];
1324 }
1325 else
1326 {
1327 // This is a new distinct range, but no point in copying it
1328 // if it is already in the right place.
1329 if (i != j)
1330 {
1331 res[i++] = res[j];
1332 res[i++] = res[j + 1];
1333 }
1334 else
1335 i += 2;
1336 }
1337 }
1338
1339 // At this point, the vector should have i ranges, none overlapping.
1340 // Now it simply needs to be copied, and if there are too many
1341 // ranges, merge some. We wont do any analysis as to what the
1342 // "best" merges are, simply combine the final ranges into one.
1343 if (i > m_max_ranges * 2)
1344 {
1345 res[m_max_ranges * 2 - 1] = res[i - 1];
1346 i = m_max_ranges * 2;
1347 }
1348
1349 for (j = 0; j < i ; j++)
1350 m_base[j] = res [j];
1351 m_num_ranges = i / 2;
1352
1353 m_kind = VR_RANGE;
1354 union_nonzero_bits (r);
1355 return true;
1356 }
1357
1358 // Return TRUE if THIS fully contains R. No undefined or varying cases.
1359
1360 bool
1361 irange::irange_contains_p (const irange &r) const
1362 {
1363 gcc_checking_assert (!undefined_p () && !varying_p ());
1364 gcc_checking_assert (!r.undefined_p () && !varying_p ());
1365
1366 // In order for THIS to fully contain R, all of the pairs within R must
1367 // be fully contained by the pairs in this object.
1368 signop sign = TYPE_SIGN (m_type);
1369 unsigned ri = 0;
1370 unsigned i = 0;
1371 wide_int rl = r.m_base[0];
1372 wide_int ru = r.m_base[1];
1373 wide_int l = m_base[0];
1374 wide_int u = m_base[1];
1375 while (1)
1376 {
1377 // If r is contained within this range, move to the next R
1378 if (wi::ge_p (rl, l, sign)
1379 && wi::le_p (ru, u, sign))
1380 {
1381 // This pair is OK, Either done, or bump to the next.
1382 if (++ri >= r.num_pairs ())
1383 return true;
1384 rl = r.m_base[ri * 2];
1385 ru = r.m_base[ri * 2 + 1];
1386 continue;
1387 }
1388 // Otherwise, check if this's pair occurs before R's.
1389 if (wi::lt_p (u, rl, sign))
1390 {
1391 // There's still at least one pair of R left.
1392 if (++i >= num_pairs ())
1393 return false;
1394 l = m_base[i * 2];
1395 u = m_base[i * 2 + 1];
1396 continue;
1397 }
1398 return false;
1399 }
1400 return false;
1401 }
1402
1403
1404 // Return TRUE if anything changes.
1405
1406 bool
1407 irange::intersect (const vrange &v)
1408 {
1409 const irange &r = as_a <irange> (v);
1410 gcc_checking_assert (undefined_p () || r.undefined_p ()
1411 || range_compatible_p (type (), r.type ()));
1412
1413 if (undefined_p ())
1414 return false;
1415 if (r.undefined_p ())
1416 {
1417 set_undefined ();
1418 return true;
1419 }
1420 if (r.varying_p ())
1421 return false;
1422 if (varying_p ())
1423 {
1424 operator= (r);
1425 return true;
1426 }
1427
1428 if (r.num_pairs () == 1)
1429 {
1430 bool res = intersect (r.lower_bound (), r.upper_bound ());
1431 if (undefined_p ())
1432 return true;
1433
1434 res |= intersect_nonzero_bits (r);
1435 return res;
1436 }
1437
1438 // If R fully contains this, then intersection will change nothing.
1439 if (r.irange_contains_p (*this))
1440 return intersect_nonzero_bits (r);
1441
1442 signop sign = TYPE_SIGN (m_type);
1443 unsigned bld_pair = 0;
1444 unsigned bld_lim = m_max_ranges;
1445 int_range_max r2 (*this);
1446 unsigned r2_lim = r2.num_pairs ();
1447 unsigned i2 = 0;
1448 for (unsigned i = 0; i < r.num_pairs (); )
1449 {
1450 // If r1's upper is < r2's lower, we can skip r1's pair.
1451 wide_int ru = r.m_base[i * 2 + 1];
1452 wide_int r2l = r2.m_base[i2 * 2];
1453 if (wi::lt_p (ru, r2l, sign))
1454 {
1455 i++;
1456 continue;
1457 }
1458 // Likewise, skip r2's pair if its excluded.
1459 wide_int r2u = r2.m_base[i2 * 2 + 1];
1460 wide_int rl = r.m_base[i * 2];
1461 if (wi::lt_p (r2u, rl, sign))
1462 {
1463 i2++;
1464 if (i2 < r2_lim)
1465 continue;
1466 // No more r2, break.
1467 break;
1468 }
1469
1470 // Must be some overlap. Find the highest of the lower bounds,
1471 // and set it, unless the build limits lower bounds is already
1472 // set.
1473 if (bld_pair < bld_lim)
1474 {
1475 if (wi::ge_p (rl, r2l, sign))
1476 m_base[bld_pair * 2] = rl;
1477 else
1478 m_base[bld_pair * 2] = r2l;
1479 }
1480 else
1481 // Decrease and set a new upper.
1482 bld_pair--;
1483
1484 // ...and choose the lower of the upper bounds.
1485 if (wi::le_p (ru, r2u, sign))
1486 {
1487 m_base[bld_pair * 2 + 1] = ru;
1488 bld_pair++;
1489 // Move past the r1 pair and keep trying.
1490 i++;
1491 continue;
1492 }
1493 else
1494 {
1495 m_base[bld_pair * 2 + 1] = r2u;
1496 bld_pair++;
1497 i2++;
1498 if (i2 < r2_lim)
1499 continue;
1500 // No more r2, break.
1501 break;
1502 }
1503 // r2 has the higher lower bound.
1504 }
1505
1506 // At the exit of this loop, it is one of 2 things:
1507 // ran out of r1, or r2, but either means we are done.
1508 m_num_ranges = bld_pair;
1509 if (m_num_ranges == 0)
1510 {
1511 set_undefined ();
1512 return true;
1513 }
1514
1515 m_kind = VR_RANGE;
1516 intersect_nonzero_bits (r);
1517 return true;
1518 }
1519
1520
1521 // Multirange intersect for a specified wide_int [lb, ub] range.
1522 // Return TRUE if intersect changed anything.
1523 //
1524 // NOTE: It is the caller's responsibility to intersect the nonzero masks.
1525
1526 bool
1527 irange::intersect (const wide_int& lb, const wide_int& ub)
1528 {
1529 // Undefined remains undefined.
1530 if (undefined_p ())
1531 return false;
1532
1533 tree range_type = type();
1534 signop sign = TYPE_SIGN (range_type);
1535
1536 gcc_checking_assert (TYPE_PRECISION (range_type) == wi::get_precision (lb));
1537 gcc_checking_assert (TYPE_PRECISION (range_type) == wi::get_precision (ub));
1538
1539 // If this range is fully contained, then intersection will do nothing.
1540 if (wi::ge_p (lower_bound (), lb, sign)
1541 && wi::le_p (upper_bound (), ub, sign))
1542 return false;
1543
1544 unsigned bld_index = 0;
1545 unsigned pair_lim = num_pairs ();
1546 for (unsigned i = 0; i < pair_lim; i++)
1547 {
1548 wide_int pairl = m_base[i * 2];
1549 wide_int pairu = m_base[i * 2 + 1];
1550 // Once UB is less than a pairs lower bound, we're done.
1551 if (wi::lt_p (ub, pairl, sign))
1552 break;
1553 // if LB is greater than this pairs upper, this pair is excluded.
1554 if (wi::lt_p (pairu, lb, sign))
1555 continue;
1556
1557 // Must be some overlap. Find the highest of the lower bounds,
1558 // and set it
1559 if (wi::gt_p (lb, pairl, sign))
1560 m_base[bld_index * 2] = lb;
1561 else
1562 m_base[bld_index * 2] = pairl;
1563
1564 // ...and choose the lower of the upper bounds and if the base pair
1565 // has the lower upper bound, need to check next pair too.
1566 if (wi::lt_p (ub, pairu, sign))
1567 {
1568 m_base[bld_index++ * 2 + 1] = ub;
1569 break;
1570 }
1571 else
1572 m_base[bld_index++ * 2 + 1] = pairu;
1573 }
1574
1575 m_num_ranges = bld_index;
1576 if (m_num_ranges == 0)
1577 {
1578 set_undefined ();
1579 return true;
1580 }
1581
1582 m_kind = VR_RANGE;
1583 // No need to call normalize_kind(), as the caller will do this
1584 // while intersecting the nonzero mask.
1585 if (flag_checking)
1586 verify_range ();
1587 return true;
1588 }
1589
1590
1591 // Signed 1-bits are strange. You can't subtract 1, because you can't
1592 // represent the number 1. This works around that for the invert routine.
1593
1594 static wide_int inline
1595 subtract_one (const wide_int &x, tree type, wi::overflow_type &overflow)
1596 {
1597 if (TYPE_SIGN (type) == SIGNED)
1598 return wi::add (x, -1, SIGNED, &overflow);
1599 else
1600 return wi::sub (x, 1, UNSIGNED, &overflow);
1601 }
1602
1603 // The analogous function for adding 1.
1604
1605 static wide_int inline
1606 add_one (const wide_int &x, tree type, wi::overflow_type &overflow)
1607 {
1608 if (TYPE_SIGN (type) == SIGNED)
1609 return wi::sub (x, -1, SIGNED, &overflow);
1610 else
1611 return wi::add (x, 1, UNSIGNED, &overflow);
1612 }
1613
1614 // Return the inverse of a range.
1615
1616 void
1617 irange::invert ()
1618 {
1619 gcc_checking_assert (!undefined_p () && !varying_p ());
1620
1621 // We always need one more set of bounds to represent an inverse, so
1622 // if we're at the limit, we can't properly represent things.
1623 //
1624 // For instance, to represent the inverse of a 2 sub-range set
1625 // [5, 10][20, 30], we would need a 3 sub-range set
1626 // [-MIN, 4][11, 19][31, MAX].
1627 //
1628 // In this case, return the most conservative thing.
1629 //
1630 // However, if any of the extremes of the range are -MIN/+MAX, we
1631 // know we will not need an extra bound. For example:
1632 //
1633 // INVERT([-MIN,20][30,40]) => [21,29][41,+MAX]
1634 // INVERT([-MIN,20][30,MAX]) => [21,29]
1635 tree ttype = type ();
1636 unsigned prec = TYPE_PRECISION (ttype);
1637 signop sign = TYPE_SIGN (ttype);
1638 wide_int type_min = wi::min_value (prec, sign);
1639 wide_int type_max = wi::max_value (prec, sign);
1640 m_nonzero_mask = wi::minus_one (prec);
1641 if (m_num_ranges == m_max_ranges
1642 && lower_bound () != type_min
1643 && upper_bound () != type_max)
1644 {
1645 m_base[1] = type_max;
1646 m_num_ranges = 1;
1647 return;
1648 }
1649 // The algorithm is as follows. To calculate INVERT ([a,b][c,d]), we
1650 // generate [-MIN, a-1][b+1, c-1][d+1, MAX].
1651 //
1652 // If there is an over/underflow in the calculation for any
1653 // sub-range, we eliminate that subrange. This allows us to easily
1654 // calculate INVERT([-MIN, 5]) with: [-MIN, -MIN-1][6, MAX]. And since
1655 // we eliminate the underflow, only [6, MAX] remains.
1656 unsigned i = 0;
1657 wi::overflow_type ovf;
1658 // Construct leftmost range.
1659 int_range_max orig_range (*this);
1660 unsigned nitems = 0;
1661 wide_int tmp;
1662 // If this is going to underflow on the MINUS 1, don't even bother
1663 // checking. This also handles subtracting one from an unsigned 0,
1664 // which doesn't set the underflow bit.
1665 if (type_min != orig_range.lower_bound ())
1666 {
1667 m_base[nitems++] = type_min;
1668 tmp = subtract_one (orig_range.lower_bound (), ttype, ovf);
1669 m_base[nitems++] = tmp;
1670 if (ovf)
1671 nitems = 0;
1672 }
1673 i++;
1674 // Construct middle ranges if applicable.
1675 if (orig_range.num_pairs () > 1)
1676 {
1677 unsigned j = i;
1678 for (; j < (orig_range.num_pairs () * 2) - 1; j += 2)
1679 {
1680 // The middle ranges cannot have MAX/MIN, so there's no need
1681 // to check for unsigned overflow on the +1 and -1 here.
1682 tmp = wi::add (orig_range.m_base[j], 1, sign, &ovf);
1683 m_base[nitems++] = tmp;
1684 tmp = subtract_one (orig_range.m_base[j + 1], ttype, ovf);
1685 m_base[nitems++] = tmp;
1686 if (ovf)
1687 nitems -= 2;
1688 }
1689 i = j;
1690 }
1691 // Construct rightmost range.
1692 //
1693 // However, if this will overflow on the PLUS 1, don't even bother.
1694 // This also handles adding one to an unsigned MAX, which doesn't
1695 // set the overflow bit.
1696 if (type_max != orig_range.m_base[i])
1697 {
1698 tmp = add_one (orig_range.m_base[i], ttype, ovf);
1699 m_base[nitems++] = tmp;
1700 m_base[nitems++] = type_max;
1701 if (ovf)
1702 nitems -= 2;
1703 }
1704 m_num_ranges = nitems / 2;
1705
1706 // We disallow undefined or varying coming in, so the result can
1707 // only be a VR_RANGE.
1708 gcc_checking_assert (m_kind == VR_RANGE);
1709
1710 if (flag_checking)
1711 verify_range ();
1712 }
1713
1714 // Return the nonzero bits inherent in the range.
1715
1716 wide_int
1717 irange::get_nonzero_bits_from_range () const
1718 {
1719 wide_int min = lower_bound ();
1720 wide_int max = upper_bound ();
1721 wide_int xorv = min ^ max;
1722 if (xorv != 0)
1723 {
1724 unsigned prec = TYPE_PRECISION (type ());
1725 xorv = wi::mask (prec - wi::clz (xorv), false, prec);
1726 }
1727 return min | xorv;
1728 }
1729
1730 // If the the nonzero mask can be trivially converted to a range, do
1731 // so and return TRUE.
1732
1733 bool
1734 irange::set_range_from_nonzero_bits ()
1735 {
1736 gcc_checking_assert (!undefined_p ());
1737 if (m_nonzero_mask == -1)
1738 return false;
1739 unsigned popcount = wi::popcount (m_nonzero_mask);
1740
1741 // If we have only one bit set in the mask, we can figure out the
1742 // range immediately.
1743 if (popcount == 1)
1744 {
1745 // Make sure we don't pessimize the range.
1746 if (!contains_p (m_nonzero_mask))
1747 return false;
1748
1749 bool has_zero = contains_zero_p (*this);
1750 wide_int nz = m_nonzero_mask;
1751 set (m_type, nz, nz);
1752 m_nonzero_mask = nz;
1753 if (has_zero)
1754 {
1755 int_range<2> zero;
1756 zero.set_zero (type ());
1757 union_ (zero);
1758 }
1759 return true;
1760 }
1761 else if (popcount == 0)
1762 {
1763 set_zero (type ());
1764 return true;
1765 }
1766 return false;
1767 }
1768
1769 void
1770 irange::set_nonzero_bits (const wide_int &bits)
1771 {
1772 gcc_checking_assert (!undefined_p ());
1773
1774 // Drop VARYINGs with a nonzero mask to a plain range.
1775 if (m_kind == VR_VARYING && bits != -1)
1776 m_kind = VR_RANGE;
1777
1778 m_nonzero_mask = bits;
1779 if (set_range_from_nonzero_bits ())
1780 return;
1781
1782 normalize_kind ();
1783 if (flag_checking)
1784 verify_range ();
1785 }
1786
1787 // Return the nonzero bitmask. This will return the nonzero bits plus
1788 // the nonzero bits inherent in the range.
1789
1790 wide_int
1791 irange::get_nonzero_bits () const
1792 {
1793 gcc_checking_assert (!undefined_p ());
1794 // The nonzero mask inherent in the range is calculated on-demand.
1795 // For example, [0,255] does not have a 0xff nonzero mask by default
1796 // (unless manually set). This saves us considerable time, because
1797 // setting it at creation incurs a large penalty for irange::set.
1798 // At the time of writing there was a 5% slowdown in VRP if we kept
1799 // the mask precisely up to date at all times. Instead, we default
1800 // to -1 and set it when explicitly requested. However, this
1801 // function will always return the correct mask.
1802 if (m_nonzero_mask == -1)
1803 return get_nonzero_bits_from_range ();
1804 else
1805 return m_nonzero_mask & get_nonzero_bits_from_range ();
1806 }
1807
1808 // Intersect the nonzero bits in R into THIS and normalize the range.
1809 // Return TRUE if the intersection changed anything.
1810
1811 bool
1812 irange::intersect_nonzero_bits (const irange &r)
1813 {
1814 gcc_checking_assert (!undefined_p () && !r.undefined_p ());
1815
1816 if (m_nonzero_mask == -1 && r.m_nonzero_mask == -1)
1817 {
1818 normalize_kind ();
1819 if (flag_checking)
1820 verify_range ();
1821 return false;
1822 }
1823
1824 bool changed = false;
1825 if (m_nonzero_mask != r.m_nonzero_mask)
1826 {
1827 wide_int nz = get_nonzero_bits () & r.get_nonzero_bits ();
1828 // If the nonzero bits did not change, return false.
1829 if (nz == get_nonzero_bits ())
1830 return false;
1831
1832 m_nonzero_mask = nz;
1833 if (set_range_from_nonzero_bits ())
1834 return true;
1835 changed = true;
1836 }
1837 normalize_kind ();
1838 if (flag_checking)
1839 verify_range ();
1840 return changed;
1841 }
1842
1843 // Union the nonzero bits in R into THIS and normalize the range.
1844 // Return TRUE if the union changed anything.
1845
1846 bool
1847 irange::union_nonzero_bits (const irange &r)
1848 {
1849 gcc_checking_assert (!undefined_p () && !r.undefined_p ());
1850
1851 if (m_nonzero_mask == -1 && r.m_nonzero_mask == -1)
1852 {
1853 normalize_kind ();
1854 if (flag_checking)
1855 verify_range ();
1856 return false;
1857 }
1858
1859 bool changed = false;
1860 if (m_nonzero_mask != r.m_nonzero_mask)
1861 {
1862 m_nonzero_mask = get_nonzero_bits () | r.get_nonzero_bits ();
1863 // No need to call set_range_from_nonzero_bits, because we'll
1864 // never narrow the range. Besides, it would cause endless
1865 // recursion because of the union_ in
1866 // set_range_from_nonzero_bits.
1867 changed = true;
1868 }
1869 normalize_kind ();
1870 if (flag_checking)
1871 verify_range ();
1872 return changed;
1873 }
1874
1875 void
1876 dump_value_range (FILE *file, const vrange *vr)
1877 {
1878 vr->dump (file);
1879 }
1880
1881 DEBUG_FUNCTION void
1882 debug (const vrange *vr)
1883 {
1884 dump_value_range (stderr, vr);
1885 fprintf (stderr, "\n");
1886 }
1887
1888 DEBUG_FUNCTION void
1889 debug (const vrange &vr)
1890 {
1891 debug (&vr);
1892 }
1893
1894 DEBUG_FUNCTION void
1895 debug (const value_range *vr)
1896 {
1897 dump_value_range (stderr, vr);
1898 fprintf (stderr, "\n");
1899 }
1900
1901 DEBUG_FUNCTION void
1902 debug (const value_range &vr)
1903 {
1904 dump_value_range (stderr, &vr);
1905 fprintf (stderr, "\n");
1906 }
1907
1908 /* Return true, if VAL1 and VAL2 are equal values for VRP purposes. */
1909
1910 bool
1911 vrp_operand_equal_p (const_tree val1, const_tree val2)
1912 {
1913 if (val1 == val2)
1914 return true;
1915 if (!val1 || !val2 || !operand_equal_p (val1, val2, 0))
1916 return false;
1917 return true;
1918 }
1919
1920 void
1921 gt_ggc_mx (irange *x)
1922 {
1923 if (!x->undefined_p ())
1924 gt_ggc_mx (x->m_type);
1925 }
1926
1927 void
1928 gt_pch_nx (irange *x)
1929 {
1930 if (!x->undefined_p ())
1931 gt_pch_nx (x->m_type);
1932 }
1933
1934 void
1935 gt_pch_nx (irange *x, gt_pointer_operator op, void *cookie)
1936 {
1937 for (unsigned i = 0; i < x->m_num_ranges; ++i)
1938 {
1939 op (&x->m_base[i * 2], NULL, cookie);
1940 op (&x->m_base[i * 2 + 1], NULL, cookie);
1941 }
1942 }
1943
1944 void
1945 gt_ggc_mx (frange *x)
1946 {
1947 gt_ggc_mx (x->m_type);
1948 }
1949
1950 void
1951 gt_pch_nx (frange *x)
1952 {
1953 gt_pch_nx (x->m_type);
1954 }
1955
1956 void
1957 gt_pch_nx (frange *x, gt_pointer_operator op, void *cookie)
1958 {
1959 op (&x->m_type, NULL, cookie);
1960 }
1961
1962 void
1963 gt_ggc_mx (vrange *x)
1964 {
1965 if (is_a <irange> (*x))
1966 return gt_ggc_mx ((irange *) x);
1967 if (is_a <frange> (*x))
1968 return gt_ggc_mx ((frange *) x);
1969 gcc_unreachable ();
1970 }
1971
1972 void
1973 gt_pch_nx (vrange *x)
1974 {
1975 if (is_a <irange> (*x))
1976 return gt_pch_nx ((irange *) x);
1977 if (is_a <frange> (*x))
1978 return gt_pch_nx ((frange *) x);
1979 gcc_unreachable ();
1980 }
1981
1982 void
1983 gt_pch_nx (vrange *x, gt_pointer_operator op, void *cookie)
1984 {
1985 if (is_a <irange> (*x))
1986 gt_pch_nx ((irange *) x, op, cookie);
1987 else if (is_a <frange> (*x))
1988 gt_pch_nx ((frange *) x, op, cookie);
1989 else
1990 gcc_unreachable ();
1991 }
1992
1993 // ?? These stubs are for ipa-prop.cc which use a value_range in a
1994 // hash_traits. hash-traits.h defines an extern of gt_ggc_mx (T &)
1995 // instead of picking up the gt_ggc_mx (T *) version.
1996 void
1997 gt_pch_nx (int_range<2> *&x)
1998 {
1999 return gt_pch_nx ((irange *) x);
2000 }
2001
2002 void
2003 gt_ggc_mx (int_range<2> *&x)
2004 {
2005 return gt_ggc_mx ((irange *) x);
2006 }
2007
2008 #define DEFINE_INT_RANGE_INSTANCE(N) \
2009 template int_range<N>::int_range(tree_node *, \
2010 const wide_int &, \
2011 const wide_int &, \
2012 value_range_kind); \
2013 template int_range<N>::int_range(tree); \
2014 template int_range<N>::int_range(const irange &); \
2015 template int_range<N>::int_range(const int_range &); \
2016 template int_range<N>& int_range<N>::operator= (const int_range &);
2017
2018 DEFINE_INT_RANGE_INSTANCE(1)
2019 DEFINE_INT_RANGE_INSTANCE(2)
2020 DEFINE_INT_RANGE_INSTANCE(3)
2021 DEFINE_INT_RANGE_INSTANCE(255)
2022
2023 #if CHECKING_P
2024 #include "selftest.h"
2025
2026 #define INT(x) wi::shwi ((x), TYPE_PRECISION (integer_type_node))
2027 #define UINT(x) wi::uhwi ((x), TYPE_PRECISION (unsigned_type_node))
2028 #define SCHAR(x) wi::shwi ((x), TYPE_PRECISION (signed_char_type_node))
2029
2030 namespace selftest
2031 {
2032
2033 static int_range<2>
2034 range (tree type, int a, int b, value_range_kind kind = VR_RANGE)
2035 {
2036 wide_int w1, w2;
2037 if (TYPE_UNSIGNED (type))
2038 {
2039 w1 = wi::uhwi (a, TYPE_PRECISION (type));
2040 w2 = wi::uhwi (b, TYPE_PRECISION (type));
2041 }
2042 else
2043 {
2044 w1 = wi::shwi (a, TYPE_PRECISION (type));
2045 w2 = wi::shwi (b, TYPE_PRECISION (type));
2046 }
2047 return int_range<2> (type, w1, w2, kind);
2048 }
2049
2050 static int_range<2>
2051 range_int (int a, int b, value_range_kind kind = VR_RANGE)
2052 {
2053 return range (integer_type_node, a, b, kind);
2054 }
2055
2056 static int_range<2>
2057 range_uint (int a, int b, value_range_kind kind = VR_RANGE)
2058 {
2059 return range (unsigned_type_node, a, b, kind);
2060 }
2061
2062 static int_range<2>
2063 range_uint128 (int a, int b, value_range_kind kind = VR_RANGE)
2064 {
2065 tree u128_type_node = build_nonstandard_integer_type (128, 1);
2066 return range (u128_type_node, a, b, kind);
2067 }
2068
2069 static int_range<2>
2070 range_uchar (int a, int b, value_range_kind kind = VR_RANGE)
2071 {
2072 return range (unsigned_char_type_node, a, b, kind);
2073 }
2074
2075 static int_range<2>
2076 range_char (int a, int b, value_range_kind kind = VR_RANGE)
2077 {
2078 return range (signed_char_type_node, a, b, kind);
2079 }
2080
2081 static int_range<3>
2082 build_range3 (int a, int b, int c, int d, int e, int f)
2083 {
2084 int_range<3> i1 = range_int (a, b);
2085 int_range<3> i2 = range_int (c, d);
2086 int_range<3> i3 = range_int (e, f);
2087 i1.union_ (i2);
2088 i1.union_ (i3);
2089 return i1;
2090 }
2091
2092 static void
2093 range_tests_irange3 ()
2094 {
2095 int_range<3> r0, r1, r2;
2096 int_range<3> i1, i2, i3;
2097
2098 // ([10,20] U [5,8]) U [1,3] ==> [1,3][5,8][10,20].
2099 r0 = range_int (10, 20);
2100 r1 = range_int (5, 8);
2101 r0.union_ (r1);
2102 r1 = range_int (1, 3);
2103 r0.union_ (r1);
2104 ASSERT_TRUE (r0 == build_range3 (1, 3, 5, 8, 10, 20));
2105
2106 // [1,3][5,8][10,20] U [-5,0] => [-5,3][5,8][10,20].
2107 r1 = range_int (-5, 0);
2108 r0.union_ (r1);
2109 ASSERT_TRUE (r0 == build_range3 (-5, 3, 5, 8, 10, 20));
2110
2111 // [10,20][30,40] U [50,60] ==> [10,20][30,40][50,60].
2112 r1 = range_int (50, 60);
2113 r0 = range_int (10, 20);
2114 r0.union_ (range_int (30, 40));
2115 r0.union_ (r1);
2116 ASSERT_TRUE (r0 == build_range3 (10, 20, 30, 40, 50, 60));
2117 // [10,20][30,40][50,60] U [70, 80] ==> [10,20][30,40][50,60][70,80].
2118 r1 = range_int (70, 80);
2119 r0.union_ (r1);
2120
2121 r2 = build_range3 (10, 20, 30, 40, 50, 60);
2122 r2.union_ (range_int (70, 80));
2123 ASSERT_TRUE (r0 == r2);
2124
2125 // [10,20][30,40][50,60] U [6,35] => [6,40][50,60].
2126 r0 = build_range3 (10, 20, 30, 40, 50, 60);
2127 r1 = range_int (6, 35);
2128 r0.union_ (r1);
2129 r1 = range_int (6, 40);
2130 r1.union_ (range_int (50, 60));
2131 ASSERT_TRUE (r0 == r1);
2132
2133 // [10,20][30,40][50,60] U [6,60] => [6,60].
2134 r0 = build_range3 (10, 20, 30, 40, 50, 60);
2135 r1 = range_int (6, 60);
2136 r0.union_ (r1);
2137 ASSERT_TRUE (r0 == range_int (6, 60));
2138
2139 // [10,20][30,40][50,60] U [6,70] => [6,70].
2140 r0 = build_range3 (10, 20, 30, 40, 50, 60);
2141 r1 = range_int (6, 70);
2142 r0.union_ (r1);
2143 ASSERT_TRUE (r0 == range_int (6, 70));
2144
2145 // [10,20][30,40][50,60] U [35,70] => [10,20][30,70].
2146 r0 = build_range3 (10, 20, 30, 40, 50, 60);
2147 r1 = range_int (35, 70);
2148 r0.union_ (r1);
2149 r1 = range_int (10, 20);
2150 r1.union_ (range_int (30, 70));
2151 ASSERT_TRUE (r0 == r1);
2152
2153 // [10,20][30,40][50,60] U [15,35] => [10,40][50,60].
2154 r0 = build_range3 (10, 20, 30, 40, 50, 60);
2155 r1 = range_int (15, 35);
2156 r0.union_ (r1);
2157 r1 = range_int (10, 40);
2158 r1.union_ (range_int (50, 60));
2159 ASSERT_TRUE (r0 == r1);
2160
2161 // [10,20][30,40][50,60] U [35,35] => [10,20][30,40][50,60].
2162 r0 = build_range3 (10, 20, 30, 40, 50, 60);
2163 r1 = range_int (35, 35);
2164 r0.union_ (r1);
2165 ASSERT_TRUE (r0 == build_range3 (10, 20, 30, 40, 50, 60));
2166 }
2167
2168 static void
2169 range_tests_int_range_max ()
2170 {
2171 int_range_max big;
2172 unsigned int nrange;
2173
2174 // Build a huge multi-range range.
2175 for (nrange = 0; nrange < 50; ++nrange)
2176 {
2177 int_range<1> tmp = range_int (nrange*10, nrange *10 + 5);
2178 big.union_ (tmp);
2179 }
2180 ASSERT_TRUE (big.num_pairs () == nrange);
2181
2182 // Verify that we can copy it without loosing precision.
2183 int_range_max copy (big);
2184 ASSERT_TRUE (copy.num_pairs () == nrange);
2185
2186 // Inverting it should produce one more sub-range.
2187 big.invert ();
2188 ASSERT_TRUE (big.num_pairs () == nrange + 1);
2189
2190 int_range<1> tmp = range_int (5, 37);
2191 big.intersect (tmp);
2192 ASSERT_TRUE (big.num_pairs () == 4);
2193
2194 // Test that [10,10][20,20] does NOT contain 15.
2195 {
2196 int_range_max i1 = range_int (10, 10);
2197 int_range_max i2 = range_int (20, 20);
2198 i1.union_ (i2);
2199 ASSERT_FALSE (i1.contains_p (INT (15)));
2200 }
2201 }
2202
2203 // Simulate -fstrict-enums where the domain of a type is less than the
2204 // underlying type.
2205
2206 static void
2207 range_tests_strict_enum ()
2208 {
2209 // The enum can only hold [0, 3].
2210 tree rtype = copy_node (unsigned_type_node);
2211 TYPE_MIN_VALUE (rtype) = build_int_cstu (rtype, 0);
2212 TYPE_MAX_VALUE (rtype) = build_int_cstu (rtype, 3);
2213
2214 // Test that even though vr1 covers the strict enum domain ([0, 3]),
2215 // it does not cover the domain of the underlying type.
2216 int_range<1> vr1 = range (rtype, 0, 1);
2217 int_range<1> vr2 = range (rtype, 2, 3);
2218 vr1.union_ (vr2);
2219 ASSERT_TRUE (vr1 == range (rtype, 0, 3));
2220 ASSERT_FALSE (vr1.varying_p ());
2221
2222 // Test that copying to a multi-range does not change things.
2223 int_range<2> ir1 (vr1);
2224 ASSERT_TRUE (ir1 == vr1);
2225 ASSERT_FALSE (ir1.varying_p ());
2226
2227 // The same test as above, but using TYPE_{MIN,MAX}_VALUE instead of [0,3].
2228 vr1 = int_range<2> (rtype,
2229 wi::to_wide (TYPE_MIN_VALUE (rtype)),
2230 wi::to_wide (TYPE_MAX_VALUE (rtype)));
2231 ir1 = vr1;
2232 ASSERT_TRUE (ir1 == vr1);
2233 ASSERT_FALSE (ir1.varying_p ());
2234 }
2235
2236 static void
2237 range_tests_misc ()
2238 {
2239 tree u128_type = build_nonstandard_integer_type (128, /*unsigned=*/1);
2240 int_range<2> i1, i2, i3;
2241 int_range<2> r0, r1, rold;
2242
2243 // Test 1-bit signed integer union.
2244 // [-1,-1] U [0,0] = VARYING.
2245 tree one_bit_type = build_nonstandard_integer_type (1, 0);
2246 wide_int one_bit_min = irange_val_min (one_bit_type);
2247 wide_int one_bit_max = irange_val_max (one_bit_type);
2248 {
2249 int_range<2> min = int_range<2> (one_bit_type, one_bit_min, one_bit_min);
2250 int_range<2> max = int_range<2> (one_bit_type, one_bit_max, one_bit_max);
2251 max.union_ (min);
2252 ASSERT_TRUE (max.varying_p ());
2253 }
2254 // Test that we can set a range of true+false for a 1-bit signed int.
2255 r0 = range_true_and_false (one_bit_type);
2256
2257 // Test inversion of 1-bit signed integers.
2258 {
2259 int_range<2> min = int_range<2> (one_bit_type, one_bit_min, one_bit_min);
2260 int_range<2> max = int_range<2> (one_bit_type, one_bit_max, one_bit_max);
2261 int_range<2> t;
2262 t = min;
2263 t.invert ();
2264 ASSERT_TRUE (t == max);
2265 t = max;
2266 t.invert ();
2267 ASSERT_TRUE (t == min);
2268 }
2269
2270 // Test that NOT(255) is [0..254] in 8-bit land.
2271 int_range<1> not_255 = range_uchar (255, 255, VR_ANTI_RANGE);
2272 ASSERT_TRUE (not_255 == range_uchar (0, 254));
2273
2274 // Test that NOT(0) is [1..255] in 8-bit land.
2275 int_range<2> not_zero = range_nonzero (unsigned_char_type_node);
2276 ASSERT_TRUE (not_zero == range_uchar (1, 255));
2277
2278 // Check that [0,127][0x..ffffff80,0x..ffffff]
2279 // => ~[128, 0x..ffffff7f].
2280 r0 = range_uint128 (0, 127);
2281 wide_int high = wi::minus_one (128);
2282 // low = -1 - 127 => 0x..ffffff80.
2283 wide_int low = wi::sub (high, wi::uhwi (127, 128));
2284 r1 = int_range<1> (u128_type, low, high); // [0x..ffffff80, 0x..ffffffff]
2285 // r0 = [0,127][0x..ffffff80,0x..fffffff].
2286 r0.union_ (r1);
2287 // r1 = [128, 0x..ffffff7f].
2288 r1 = int_range<1> (u128_type,
2289 wi::uhwi (128, 128),
2290 wi::sub (wi::minus_one (128), wi::uhwi (128, 128)));
2291 r0.invert ();
2292 ASSERT_TRUE (r0 == r1);
2293
2294 r0.set_varying (integer_type_node);
2295 wide_int minint = r0.lower_bound ();
2296 wide_int maxint = r0.upper_bound ();
2297
2298 r0.set_varying (short_integer_type_node);
2299
2300 r0.set_varying (unsigned_type_node);
2301 wide_int maxuint = r0.upper_bound ();
2302
2303 // Check that ~[0,5] => [6,MAX] for unsigned int.
2304 r0 = range_uint (0, 5);
2305 r0.invert ();
2306 ASSERT_TRUE (r0 == int_range<1> (unsigned_type_node,
2307 wi::uhwi (6, TYPE_PRECISION (unsigned_type_node)),
2308 maxuint));
2309
2310 // Check that ~[10,MAX] => [0,9] for unsigned int.
2311 r0 = int_range<1> (unsigned_type_node,
2312 wi::uhwi (10, TYPE_PRECISION (unsigned_type_node)),
2313 maxuint);
2314 r0.invert ();
2315 ASSERT_TRUE (r0 == range_uint (0, 9));
2316
2317 // Check that ~[0,5] => [6,MAX] for unsigned 128-bit numbers.
2318 r0 = range_uint128 (0, 5, VR_ANTI_RANGE);
2319 r1 = int_range<1> (u128_type, wi::uhwi (6, 128), wi::minus_one (128));
2320 ASSERT_TRUE (r0 == r1);
2321
2322 // Check that [~5] is really [-MIN,4][6,MAX].
2323 r0 = range_int (5, 5, VR_ANTI_RANGE);
2324 r1 = int_range<1> (integer_type_node, minint, INT (4));
2325 r1.union_ (int_range<1> (integer_type_node, INT (6), maxint));
2326 ASSERT_FALSE (r1.undefined_p ());
2327 ASSERT_TRUE (r0 == r1);
2328
2329 r1 = range_int (5, 5);
2330 int_range<2> r2 (r1);
2331 ASSERT_TRUE (r1 == r2);
2332
2333 r1 = range_int (5, 10);
2334
2335 r1 = range_int (5, 10);
2336 ASSERT_TRUE (r1.contains_p (INT (7)));
2337
2338 r1 = range_char (0, 20);
2339 ASSERT_TRUE (r1.contains_p (SCHAR(15)));
2340 ASSERT_FALSE (r1.contains_p (SCHAR(300)));
2341
2342 // NOT([10,20]) ==> [-MIN,9][21,MAX].
2343 r0 = r1 = range_int (10, 20);
2344 r2 = int_range<1> (integer_type_node, minint, INT(9));
2345 r2.union_ (int_range<1> (integer_type_node, INT(21), maxint));
2346 ASSERT_FALSE (r2.undefined_p ());
2347 r1.invert ();
2348 ASSERT_TRUE (r1 == r2);
2349 // Test that NOT(NOT(x)) == x.
2350 r2.invert ();
2351 ASSERT_TRUE (r0 == r2);
2352
2353 // Test that booleans and their inverse work as expected.
2354 r0 = range_zero (boolean_type_node);
2355 ASSERT_TRUE (r0 == range_false ());
2356 r0.invert ();
2357 ASSERT_TRUE (r0 == range_true ());
2358
2359 // Make sure NULL and non-NULL of pointer types work, and that
2360 // inverses of them are consistent.
2361 tree voidp = build_pointer_type (void_type_node);
2362 r0 = range_zero (voidp);
2363 r1 = r0;
2364 r0.invert ();
2365 r0.invert ();
2366 ASSERT_TRUE (r0 == r1);
2367
2368 // [10,20] U [15, 30] => [10, 30].
2369 r0 = range_int (10, 20);
2370 r1 = range_int (15, 30);
2371 r0.union_ (r1);
2372 ASSERT_TRUE (r0 == range_int (10, 30));
2373
2374 // [15,40] U [] => [15,40].
2375 r0 = range_int (15, 40);
2376 r1.set_undefined ();
2377 r0.union_ (r1);
2378 ASSERT_TRUE (r0 == range_int (15, 40));
2379
2380 // [10,20] U [10,10] => [10,20].
2381 r0 = range_int (10, 20);
2382 r1 = range_int (10, 10);
2383 r0.union_ (r1);
2384 ASSERT_TRUE (r0 == range_int (10, 20));
2385
2386 // [10,20] U [9,9] => [9,20].
2387 r0 = range_int (10, 20);
2388 r1 = range_int (9, 9);
2389 r0.union_ (r1);
2390 ASSERT_TRUE (r0 == range_int (9, 20));
2391
2392 // [10,20] ^ [15,30] => [15,20].
2393 r0 = range_int (10, 20);
2394 r1 = range_int (15, 30);
2395 r0.intersect (r1);
2396 ASSERT_TRUE (r0 == range_int (15, 20));
2397
2398 // Test the internal sanity of wide_int's wrt HWIs.
2399 ASSERT_TRUE (wi::max_value (TYPE_PRECISION (boolean_type_node),
2400 TYPE_SIGN (boolean_type_node))
2401 == wi::uhwi (1, TYPE_PRECISION (boolean_type_node)));
2402
2403 // Test zero_p().
2404 r0 = range_int (0, 0);
2405 ASSERT_TRUE (r0.zero_p ());
2406
2407 // Test nonzero_p().
2408 r0 = range_int (0, 0);
2409 r0.invert ();
2410 ASSERT_TRUE (r0.nonzero_p ());
2411
2412 // r0 = ~[1,1]
2413 r0 = range_int (1, 1, VR_ANTI_RANGE);
2414 // r1 = ~[3,3]
2415 r1 = range_int (3, 3, VR_ANTI_RANGE);
2416
2417 // vv = [0,0][2,2][4, MAX]
2418 int_range<3> vv = r0;
2419 vv.intersect (r1);
2420
2421 ASSERT_TRUE (vv.contains_p (UINT (2)));
2422 ASSERT_TRUE (vv.num_pairs () == 3);
2423
2424 r0 = range_int (1, 1);
2425 // And union it with [0,0][2,2][4,MAX] multi range
2426 r0.union_ (vv);
2427 // The result should be [0,2][4,MAX], or ~[3,3] but it must contain 2
2428 ASSERT_TRUE (r0.contains_p (INT (2)));
2429 }
2430
2431 static void
2432 range_tests_nonzero_bits ()
2433 {
2434 int_range<2> r0, r1;
2435
2436 // Adding nonzero bits to a varying drops the varying.
2437 r0.set_varying (integer_type_node);
2438 r0.set_nonzero_bits (INT (255));
2439 ASSERT_TRUE (!r0.varying_p ());
2440 // Dropping the nonzero bits brings us back to varying.
2441 r0.set_nonzero_bits (INT (-1));
2442 ASSERT_TRUE (r0.varying_p ());
2443
2444 // Test contains_p with nonzero bits.
2445 r0.set_zero (integer_type_node);
2446 ASSERT_TRUE (r0.contains_p (INT (0)));
2447 ASSERT_FALSE (r0.contains_p (INT (1)));
2448 r0.set_nonzero_bits (INT (0xfe));
2449 ASSERT_FALSE (r0.contains_p (INT (0x100)));
2450 ASSERT_FALSE (r0.contains_p (INT (0x3)));
2451
2452 // Union of nonzero bits.
2453 r0.set_varying (integer_type_node);
2454 r0.set_nonzero_bits (INT (0xf0));
2455 r1.set_varying (integer_type_node);
2456 r1.set_nonzero_bits (INT (0xf));
2457 r0.union_ (r1);
2458 ASSERT_TRUE (r0.get_nonzero_bits () == 0xff);
2459
2460 // Intersect of nonzero bits.
2461 r0 = range_int (0, 255);
2462 r0.set_nonzero_bits (INT (0xfe));
2463 r1.set_varying (integer_type_node);
2464 r1.set_nonzero_bits (INT (0xf0));
2465 r0.intersect (r1);
2466 ASSERT_TRUE (r0.get_nonzero_bits () == 0xf0);
2467
2468 // Intersect where the mask of nonzero bits is implicit from the range.
2469 r0.set_varying (integer_type_node);
2470 r1 = range_int (0, 255);
2471 r0.intersect (r1);
2472 ASSERT_TRUE (r0.get_nonzero_bits () == 0xff);
2473
2474 // The union of a mask of 0xff..ffff00 with a mask of 0xff spans the
2475 // entire domain, and makes the range a varying.
2476 r0.set_varying (integer_type_node);
2477 wide_int x = wi::shwi (0xff, TYPE_PRECISION (integer_type_node));
2478 x = wi::bit_not (x);
2479 r0.set_nonzero_bits (x); // 0xff..ff00
2480 r1.set_varying (integer_type_node);
2481 r1.set_nonzero_bits (INT (0xff));
2482 r0.union_ (r1);
2483 ASSERT_TRUE (r0.varying_p ());
2484
2485 // Test that setting a nonzero bit of 1 does not pessimize the range.
2486 r0.set_zero (integer_type_node);
2487 r0.set_nonzero_bits (INT (1));
2488 ASSERT_TRUE (r0.zero_p ());
2489 }
2490
2491 // Build an frange from string endpoints.
2492
2493 static inline frange
2494 frange_float (const char *lb, const char *ub, tree type = float_type_node)
2495 {
2496 REAL_VALUE_TYPE min, max;
2497 gcc_assert (real_from_string (&min, lb) == 0);
2498 gcc_assert (real_from_string (&max, ub) == 0);
2499 return frange (type, min, max);
2500 }
2501
2502 static void
2503 range_tests_nan ()
2504 {
2505 frange r0, r1;
2506 REAL_VALUE_TYPE q, r;
2507 bool signbit;
2508
2509 // Equal ranges but with differing NAN bits are not equal.
2510 if (HONOR_NANS (float_type_node))
2511 {
2512 r1 = frange_float ("10", "12");
2513 r0 = r1;
2514 ASSERT_EQ (r0, r1);
2515 r0.clear_nan ();
2516 ASSERT_NE (r0, r1);
2517 r0.update_nan ();
2518 ASSERT_EQ (r0, r1);
2519
2520 // [10, 20] NAN ^ [30, 40] NAN = NAN.
2521 r0 = frange_float ("10", "20");
2522 r1 = frange_float ("30", "40");
2523 r0.intersect (r1);
2524 ASSERT_TRUE (r0.known_isnan ());
2525
2526 // [3,5] U [5,10] NAN = ... NAN
2527 r0 = frange_float ("3", "5");
2528 r0.clear_nan ();
2529 r1 = frange_float ("5", "10");
2530 r0.union_ (r1);
2531 ASSERT_TRUE (r0.maybe_isnan ());
2532 }
2533
2534 // [5,6] U NAN = [5,6] NAN.
2535 r0 = frange_float ("5", "6");
2536 r0.clear_nan ();
2537 r1.set_nan (float_type_node);
2538 r0.union_ (r1);
2539 real_from_string (&q, "5");
2540 real_from_string (&r, "6");
2541 ASSERT_TRUE (real_identical (&q, &r0.lower_bound ()));
2542 ASSERT_TRUE (real_identical (&r, &r0.upper_bound ()));
2543 ASSERT_TRUE (r0.maybe_isnan ());
2544
2545 // NAN U NAN = NAN
2546 r0.set_nan (float_type_node);
2547 r1.set_nan (float_type_node);
2548 r0.union_ (r1);
2549 ASSERT_TRUE (r0.known_isnan ());
2550
2551 // [INF, INF] NAN ^ NAN = NAN
2552 r0.set_nan (float_type_node);
2553 r1 = frange_float ("+Inf", "+Inf");
2554 if (!HONOR_NANS (float_type_node))
2555 r1.update_nan ();
2556 r0.intersect (r1);
2557 ASSERT_TRUE (r0.known_isnan ());
2558
2559 // NAN ^ NAN = NAN
2560 r0.set_nan (float_type_node);
2561 r1.set_nan (float_type_node);
2562 r0.intersect (r1);
2563 ASSERT_TRUE (r0.known_isnan ());
2564
2565 // +NAN ^ -NAN = UNDEFINED
2566 r0.set_nan (float_type_node, false);
2567 r1.set_nan (float_type_node, true);
2568 r0.intersect (r1);
2569 ASSERT_TRUE (r0.undefined_p ());
2570
2571 // VARYING ^ NAN = NAN.
2572 r0.set_nan (float_type_node);
2573 r1.set_varying (float_type_node);
2574 r0.intersect (r1);
2575 ASSERT_TRUE (r0.known_isnan ());
2576
2577 // [3,4] ^ NAN = UNDEFINED.
2578 r0 = frange_float ("3", "4");
2579 r0.clear_nan ();
2580 r1.set_nan (float_type_node);
2581 r0.intersect (r1);
2582 ASSERT_TRUE (r0.undefined_p ());
2583
2584 // [-3, 5] ^ NAN = UNDEFINED
2585 r0 = frange_float ("-3", "5");
2586 r0.clear_nan ();
2587 r1.set_nan (float_type_node);
2588 r0.intersect (r1);
2589 ASSERT_TRUE (r0.undefined_p ());
2590
2591 // Setting the NAN bit to yes does not make us a known NAN.
2592 r0.set_varying (float_type_node);
2593 r0.update_nan ();
2594 ASSERT_FALSE (r0.known_isnan ());
2595
2596 // NAN is in a VARYING.
2597 r0.set_varying (float_type_node);
2598 real_nan (&r, "", 1, TYPE_MODE (float_type_node));
2599 REAL_VALUE_TYPE nan = r;
2600 ASSERT_TRUE (r0.contains_p (nan));
2601
2602 // -NAN is in a VARYING.
2603 r0.set_varying (float_type_node);
2604 q = real_value_negate (&r);
2605 REAL_VALUE_TYPE neg_nan = q;
2606 ASSERT_TRUE (r0.contains_p (neg_nan));
2607
2608 // Clearing the NAN on a [] NAN is the empty set.
2609 r0.set_nan (float_type_node);
2610 r0.clear_nan ();
2611 ASSERT_TRUE (r0.undefined_p ());
2612
2613 // [10,20] NAN ^ [21,25] NAN = [NAN]
2614 r0 = frange_float ("10", "20");
2615 r0.update_nan ();
2616 r1 = frange_float ("21", "25");
2617 r1.update_nan ();
2618 r0.intersect (r1);
2619 ASSERT_TRUE (r0.known_isnan ());
2620
2621 // NAN U [5,6] should be [5,6] +-NAN.
2622 r0.set_nan (float_type_node);
2623 r1 = frange_float ("5", "6");
2624 r1.clear_nan ();
2625 r0.union_ (r1);
2626 real_from_string (&q, "5");
2627 real_from_string (&r, "6");
2628 ASSERT_TRUE (real_identical (&q, &r0.lower_bound ()));
2629 ASSERT_TRUE (real_identical (&r, &r0.upper_bound ()));
2630 ASSERT_TRUE (!r0.signbit_p (signbit));
2631 ASSERT_TRUE (r0.maybe_isnan ());
2632 }
2633
2634 static void
2635 range_tests_signed_zeros ()
2636 {
2637 REAL_VALUE_TYPE zero = dconst0;
2638 REAL_VALUE_TYPE neg_zero = zero;
2639 neg_zero.sign = 1;
2640 frange r0, r1;
2641 bool signbit;
2642
2643 // [0,0] contains [0,0] but not [-0,-0] and vice versa.
2644 r0 = frange_float ("0.0", "0.0");
2645 r1 = frange_float ("-0.0", "-0.0");
2646 ASSERT_TRUE (r0.contains_p (zero));
2647 ASSERT_TRUE (!r0.contains_p (neg_zero));
2648 ASSERT_TRUE (r1.contains_p (neg_zero));
2649 ASSERT_TRUE (!r1.contains_p (zero));
2650
2651 // Test contains_p() when we know the sign of the zero.
2652 r0 = frange_float ("0.0", "0.0");
2653 ASSERT_TRUE (r0.contains_p (zero));
2654 ASSERT_FALSE (r0.contains_p (neg_zero));
2655 r0 = frange_float ("-0.0", "-0.0");
2656 ASSERT_TRUE (r0.contains_p (neg_zero));
2657 ASSERT_FALSE (r0.contains_p (zero));
2658
2659 r0 = frange_float ("-0.0", "0.0");
2660 ASSERT_TRUE (r0.contains_p (neg_zero));
2661 ASSERT_TRUE (r0.contains_p (zero));
2662
2663 r0 = frange_float ("-3", "5");
2664 ASSERT_TRUE (r0.contains_p (neg_zero));
2665 ASSERT_TRUE (r0.contains_p (zero));
2666
2667 // The intersection of zeros that differ in sign is a NAN (or
2668 // undefined if not honoring NANs).
2669 r0 = frange_float ("-0.0", "-0.0");
2670 r1 = frange_float ("0.0", "0.0");
2671 r0.intersect (r1);
2672 if (HONOR_NANS (float_type_node))
2673 ASSERT_TRUE (r0.known_isnan ());
2674 else
2675 ASSERT_TRUE (r0.undefined_p ());
2676
2677 // The union of zeros that differ in sign is a zero with unknown sign.
2678 r0 = frange_float ("0.0", "0.0");
2679 r1 = frange_float ("-0.0", "-0.0");
2680 r0.union_ (r1);
2681 ASSERT_TRUE (r0.zero_p () && !r0.signbit_p (signbit));
2682
2683 // [-0, +0] has an unknown sign.
2684 r0 = frange_float ("-0.0", "0.0");
2685 ASSERT_TRUE (r0.zero_p () && !r0.signbit_p (signbit));
2686
2687 // [-0, +0] ^ [0, 0] is [0, 0]
2688 r0 = frange_float ("-0.0", "0.0");
2689 r1 = frange_float ("0.0", "0.0");
2690 r0.intersect (r1);
2691 ASSERT_TRUE (r0.zero_p ());
2692
2693 r0 = frange_float ("+0", "5");
2694 r0.clear_nan ();
2695 ASSERT_TRUE (r0.signbit_p (signbit) && !signbit);
2696
2697 r0 = frange_float ("-0", "5");
2698 r0.clear_nan ();
2699 ASSERT_TRUE (!r0.signbit_p (signbit));
2700
2701 r0 = frange_float ("-0", "10");
2702 r1 = frange_float ("0", "5");
2703 r0.intersect (r1);
2704 ASSERT_TRUE (real_iszero (&r0.lower_bound (), false));
2705
2706 r0 = frange_float ("-0", "5");
2707 r1 = frange_float ("0", "5");
2708 r0.union_ (r1);
2709 ASSERT_TRUE (real_iszero (&r0.lower_bound (), true));
2710
2711 r0 = frange_float ("-5", "-0");
2712 r0.update_nan ();
2713 r1 = frange_float ("0", "0");
2714 r1.update_nan ();
2715 r0.intersect (r1);
2716 if (HONOR_NANS (float_type_node))
2717 ASSERT_TRUE (r0.known_isnan ());
2718 else
2719 ASSERT_TRUE (r0.undefined_p ());
2720
2721 r0.set_nonnegative (float_type_node);
2722 if (HONOR_NANS (float_type_node))
2723 ASSERT_TRUE (r0.maybe_isnan ());
2724
2725 // Numbers containing zero should have an unknown SIGNBIT.
2726 r0 = frange_float ("0", "10");
2727 r0.clear_nan ();
2728 ASSERT_TRUE (r0.signbit_p (signbit) && !signbit);
2729 }
2730
2731 static void
2732 range_tests_signbit ()
2733 {
2734 frange r0, r1;
2735 bool signbit;
2736
2737 // Negative numbers should have the SIGNBIT set.
2738 r0 = frange_float ("-5", "-1");
2739 r0.clear_nan ();
2740 ASSERT_TRUE (r0.signbit_p (signbit) && signbit);
2741 // Positive numbers should have the SIGNBIT clear.
2742 r0 = frange_float ("1", "10");
2743 r0.clear_nan ();
2744 ASSERT_TRUE (r0.signbit_p (signbit) && !signbit);
2745 // Numbers spanning both positive and negative should have an
2746 // unknown SIGNBIT.
2747 r0 = frange_float ("-10", "10");
2748 r0.clear_nan ();
2749 ASSERT_TRUE (!r0.signbit_p (signbit));
2750 r0.set_varying (float_type_node);
2751 ASSERT_TRUE (!r0.signbit_p (signbit));
2752 }
2753
2754 static void
2755 range_tests_floats ()
2756 {
2757 frange r0, r1;
2758
2759 if (HONOR_NANS (float_type_node))
2760 range_tests_nan ();
2761 range_tests_signbit ();
2762
2763 if (HONOR_SIGNED_ZEROS (float_type_node))
2764 range_tests_signed_zeros ();
2765
2766 // A range of [-INF,+INF] is actually VARYING if no other properties
2767 // are set.
2768 r0 = frange_float ("-Inf", "+Inf");
2769 ASSERT_TRUE (r0.varying_p ());
2770 // ...unless it has some special property...
2771 if (HONOR_NANS (r0.type ()))
2772 {
2773 r0.clear_nan ();
2774 ASSERT_FALSE (r0.varying_p ());
2775 }
2776
2777 // For most architectures, where float and double are different
2778 // sizes, having the same endpoints does not necessarily mean the
2779 // ranges are equal.
2780 if (!types_compatible_p (float_type_node, double_type_node))
2781 {
2782 r0 = frange_float ("3.0", "3.0", float_type_node);
2783 r1 = frange_float ("3.0", "3.0", double_type_node);
2784 ASSERT_NE (r0, r1);
2785 }
2786
2787 // [3,5] U [10,12] = [3,12].
2788 r0 = frange_float ("3", "5");
2789 r1 = frange_float ("10", "12");
2790 r0.union_ (r1);
2791 ASSERT_EQ (r0, frange_float ("3", "12"));
2792
2793 // [5,10] U [4,8] = [4,10]
2794 r0 = frange_float ("5", "10");
2795 r1 = frange_float ("4", "8");
2796 r0.union_ (r1);
2797 ASSERT_EQ (r0, frange_float ("4", "10"));
2798
2799 // [3,5] U [4,10] = [3,10]
2800 r0 = frange_float ("3", "5");
2801 r1 = frange_float ("4", "10");
2802 r0.union_ (r1);
2803 ASSERT_EQ (r0, frange_float ("3", "10"));
2804
2805 // [4,10] U [5,11] = [4,11]
2806 r0 = frange_float ("4", "10");
2807 r1 = frange_float ("5", "11");
2808 r0.union_ (r1);
2809 ASSERT_EQ (r0, frange_float ("4", "11"));
2810
2811 // [3,12] ^ [10,12] = [10,12].
2812 r0 = frange_float ("3", "12");
2813 r1 = frange_float ("10", "12");
2814 r0.intersect (r1);
2815 ASSERT_EQ (r0, frange_float ("10", "12"));
2816
2817 // [10,12] ^ [11,11] = [11,11]
2818 r0 = frange_float ("10", "12");
2819 r1 = frange_float ("11", "11");
2820 r0.intersect (r1);
2821 ASSERT_EQ (r0, frange_float ("11", "11"));
2822
2823 // [10,20] ^ [5,15] = [10,15]
2824 r0 = frange_float ("10", "20");
2825 r1 = frange_float ("5", "15");
2826 r0.intersect (r1);
2827 ASSERT_EQ (r0, frange_float ("10", "15"));
2828
2829 // [10,20] ^ [15,25] = [15,20]
2830 r0 = frange_float ("10", "20");
2831 r1 = frange_float ("15", "25");
2832 r0.intersect (r1);
2833 ASSERT_EQ (r0, frange_float ("15", "20"));
2834
2835 // [10,20] ^ [21,25] = []
2836 r0 = frange_float ("10", "20");
2837 r0.clear_nan ();
2838 r1 = frange_float ("21", "25");
2839 r1.clear_nan ();
2840 r0.intersect (r1);
2841 ASSERT_TRUE (r0.undefined_p ());
2842
2843 if (HONOR_INFINITIES (float_type_node))
2844 {
2845 // Make sure [-Inf, -Inf] doesn't get normalized.
2846 r0 = frange_float ("-Inf", "-Inf");
2847 ASSERT_TRUE (real_isinf (&r0.lower_bound (), true));
2848 ASSERT_TRUE (real_isinf (&r0.upper_bound (), true));
2849 }
2850
2851 // Test that reading back a global range yields the same result as
2852 // what we wrote into it.
2853 tree ssa = make_temp_ssa_name (float_type_node, NULL, "blah");
2854 r0.set_varying (float_type_node);
2855 r0.clear_nan ();
2856 set_range_info (ssa, r0);
2857 get_global_range_query ()->range_of_expr (r1, ssa);
2858 ASSERT_EQ (r0, r1);
2859 }
2860
2861 // Run floating range tests for various combinations of NAN and INF
2862 // support.
2863
2864 static void
2865 range_tests_floats_various ()
2866 {
2867 int save_finite_math_only = flag_finite_math_only;
2868
2869 // Test -ffinite-math-only.
2870 flag_finite_math_only = 1;
2871 range_tests_floats ();
2872 // Test -fno-finite-math-only.
2873 flag_finite_math_only = 0;
2874 range_tests_floats ();
2875
2876 flag_finite_math_only = save_finite_math_only;
2877 }
2878
2879 void
2880 range_tests ()
2881 {
2882 range_tests_irange3 ();
2883 range_tests_int_range_max ();
2884 range_tests_strict_enum ();
2885 range_tests_nonzero_bits ();
2886 range_tests_floats_various ();
2887 range_tests_misc ();
2888 }
2889
2890 } // namespace selftest
2891
2892 #endif // CHECKING_P