value-range.cc revision 1.1.1.2 1 /* Support routines for value ranges.
2 Copyright (C) 2019-2022 Free Software Foundation, Inc.
3 Major hacks by Aldy Hernandez <aldyh (at) redhat.com> and
4 Andrew MacLeod <amacleod (at) 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 "fold-const.h"
31 #include "gimple-range.h"
32
33 // Here we copy between any two irange's. The ranges can be legacy or
34 // multi-ranges, and copying between any combination works correctly.
35
36 irange &
37 irange::operator= (const irange &src)
38 {
39 if (legacy_mode_p ())
40 {
41 copy_to_legacy (src);
42 return *this;
43 }
44 if (src.legacy_mode_p ())
45 {
46 copy_legacy_to_multi_range (src);
47 return *this;
48 }
49
50 unsigned x;
51 unsigned lim = src.m_num_ranges;
52 if (lim > m_max_ranges)
53 lim = m_max_ranges;
54
55 for (x = 0; x < lim * 2; ++x)
56 m_base[x] = src.m_base[x];
57
58 // If the range didn't fit, the last range should cover the rest.
59 if (lim != src.m_num_ranges)
60 m_base[x - 1] = src.m_base[src.m_num_ranges * 2 - 1];
61
62 m_num_ranges = lim;
63 m_kind = src.m_kind;
64 return *this;
65 }
66
67 // Return TRUE if range is a multi-range that can be represented as a
68 // VR_ANTI_RANGE.
69
70 bool
71 irange::maybe_anti_range () const
72 {
73 tree ttype = type ();
74 unsigned int precision = TYPE_PRECISION (ttype);
75 signop sign = TYPE_SIGN (ttype);
76 return (num_pairs () > 1
77 && precision > 1
78 && lower_bound () == wi::min_value (precision, sign)
79 && upper_bound () == wi::max_value (precision, sign));
80 }
81
82 void
83 irange::copy_legacy_to_multi_range (const irange &src)
84 {
85 gcc_checking_assert (src.legacy_mode_p ());
86 gcc_checking_assert (!legacy_mode_p ());
87 if (src.undefined_p ())
88 set_undefined ();
89 else if (src.varying_p ())
90 set_varying (src.type ());
91 else
92 {
93 if (range_has_numeric_bounds_p (&src))
94 set (src.min (), src.max (), src.kind ());
95 else
96 {
97 value_range cst (src);
98 cst.normalize_symbolics ();
99 gcc_checking_assert (cst.varying_p () || cst.kind () == VR_RANGE);
100 set (cst.min (), cst.max ());
101 }
102 }
103 }
104
105 // Copy any type of irange into a legacy.
106
107 void
108 irange::copy_to_legacy (const irange &src)
109 {
110 gcc_checking_assert (legacy_mode_p ());
111 // Handle legacy to legacy and other things that are easy to copy.
112 if (src.legacy_mode_p () || src.varying_p () || src.undefined_p ())
113 {
114 m_num_ranges = src.m_num_ranges;
115 m_base[0] = src.m_base[0];
116 m_base[1] = src.m_base[1];
117 m_kind = src.m_kind;
118 return;
119 }
120 // Copy multi-range to legacy.
121 if (src.maybe_anti_range ())
122 {
123 int_range<3> r (src);
124 r.invert ();
125 // Use tree variants to save on tree -> wi -> tree conversions.
126 set (r.tree_lower_bound (0), r.tree_upper_bound (0), VR_ANTI_RANGE);
127 }
128 else
129 set (src.tree_lower_bound (), src.tree_upper_bound ());
130 }
131
132 // Swap MIN/MAX if they are out of order and adjust KIND appropriately.
133
134 static void
135 swap_out_of_order_endpoints (tree &min, tree &max, value_range_kind &kind)
136 {
137 gcc_checking_assert (kind != VR_UNDEFINED);
138 if (kind == VR_VARYING)
139 return;
140 /* Wrong order for min and max, to swap them and the VR type we need
141 to adjust them. */
142 if (tree_int_cst_lt (max, min))
143 {
144 tree one, tmp;
145
146 /* For one bit precision if max < min, then the swapped
147 range covers all values, so for VR_RANGE it is varying and
148 for VR_ANTI_RANGE empty range, so drop to varying as well. */
149 if (TYPE_PRECISION (TREE_TYPE (min)) == 1)
150 {
151 kind = VR_VARYING;
152 return;
153 }
154
155 one = build_int_cst (TREE_TYPE (min), 1);
156 tmp = int_const_binop (PLUS_EXPR, max, one);
157 max = int_const_binop (MINUS_EXPR, min, one);
158 min = tmp;
159
160 /* There's one corner case, if we had [C+1, C] before we now have
161 that again. But this represents an empty value range, so drop
162 to varying in this case. */
163 if (tree_int_cst_lt (max, min))
164 {
165 kind = VR_VARYING;
166 return;
167 }
168 kind = kind == VR_RANGE ? VR_ANTI_RANGE : VR_RANGE;
169 }
170 }
171
172 void
173 irange::irange_set (tree min, tree max)
174 {
175 gcc_checking_assert (!POLY_INT_CST_P (min));
176 gcc_checking_assert (!POLY_INT_CST_P (max));
177
178 m_base[0] = min;
179 m_base[1] = max;
180 m_num_ranges = 1;
181 m_kind = VR_RANGE;
182 normalize_kind ();
183
184 if (flag_checking)
185 verify_range ();
186 }
187
188 void
189 irange::irange_set_1bit_anti_range (tree min, tree max)
190 {
191 tree type = TREE_TYPE (min);
192 gcc_checking_assert (TYPE_PRECISION (type) == 1);
193
194 if (operand_equal_p (min, max))
195 {
196 // Since these are 1-bit quantities, they can only be [MIN,MIN]
197 // or [MAX,MAX].
198 if (vrp_val_is_min (min))
199 min = max = vrp_val_max (type);
200 else
201 min = max = vrp_val_min (type);
202 set (min, max);
203 }
204 else
205 {
206 // The only alternative is [MIN,MAX], which is the empty range.
207 gcc_checking_assert (vrp_val_is_min (min));
208 gcc_checking_assert (vrp_val_is_max (max));
209 set_undefined ();
210 }
211 if (flag_checking)
212 verify_range ();
213 }
214
215 void
216 irange::irange_set_anti_range (tree min, tree max)
217 {
218 gcc_checking_assert (!POLY_INT_CST_P (min));
219 gcc_checking_assert (!POLY_INT_CST_P (max));
220
221 if (TYPE_PRECISION (TREE_TYPE (min)) == 1)
222 {
223 irange_set_1bit_anti_range (min, max);
224 return;
225 }
226
227 // set an anti-range
228 tree type = TREE_TYPE (min);
229 signop sign = TYPE_SIGN (type);
230 int_range<2> type_range (type);
231 // Calculate INVERSE([I,J]) as [-MIN, I-1][J+1, +MAX].
232 m_num_ranges = 0;
233 wi::overflow_type ovf;
234
235 wide_int w_min = wi::to_wide (min);
236 if (wi::ne_p (w_min, type_range.lower_bound ()))
237 {
238 wide_int lim1 = wi::sub (w_min, 1, sign, &ovf);
239 gcc_checking_assert (ovf != wi::OVF_OVERFLOW);
240 m_base[0] = type_range.tree_lower_bound (0);
241 m_base[1] = wide_int_to_tree (type, lim1);
242 m_num_ranges = 1;
243 }
244 wide_int w_max = wi::to_wide (max);
245 if (wi::ne_p (w_max, type_range.upper_bound ()))
246 {
247 wide_int lim2 = wi::add (w_max, 1, sign, &ovf);
248 gcc_checking_assert (ovf != wi::OVF_OVERFLOW);
249 m_base[m_num_ranges * 2] = wide_int_to_tree (type, lim2);
250 m_base[m_num_ranges * 2 + 1] = type_range.tree_upper_bound (0);
251 ++m_num_ranges;
252 }
253
254 m_kind = VR_RANGE;
255 normalize_kind ();
256
257 if (flag_checking)
258 verify_range ();
259 }
260
261 /* Set value range to the canonical form of {VRTYPE, MIN, MAX, EQUIV}.
262 This means adjusting VRTYPE, MIN and MAX representing the case of a
263 wrapping range with MAX < MIN covering [MIN, type_max] U [type_min, MAX]
264 as anti-rage ~[MAX+1, MIN-1]. Likewise for wrapping anti-ranges.
265 In corner cases where MAX+1 or MIN-1 wraps this will fall back
266 to varying.
267 This routine exists to ease canonicalization in the case where we
268 extract ranges from var + CST op limit. */
269
270 void
271 irange::set (tree min, tree max, value_range_kind kind)
272 {
273 if (kind != VR_UNDEFINED)
274 {
275 if (TREE_OVERFLOW_P (min))
276 min = drop_tree_overflow (min);
277 if (TREE_OVERFLOW_P (max))
278 max = drop_tree_overflow (max);
279 }
280
281 if (!legacy_mode_p ())
282 {
283 if (kind == VR_RANGE)
284 irange_set (min, max);
285 else
286 {
287 gcc_checking_assert (kind == VR_ANTI_RANGE);
288 irange_set_anti_range (min, max);
289 }
290 return;
291 }
292 if (kind == VR_UNDEFINED)
293 {
294 set_undefined ();
295 return;
296 }
297
298 if (kind == VR_VARYING
299 || POLY_INT_CST_P (min)
300 || POLY_INT_CST_P (max))
301 {
302 set_varying (TREE_TYPE (min));
303 return;
304 }
305
306 // Nothing to canonicalize for symbolic ranges.
307 if (TREE_CODE (min) != INTEGER_CST
308 || TREE_CODE (max) != INTEGER_CST)
309 {
310 m_kind = kind;
311 m_base[0] = min;
312 m_base[1] = max;
313 m_num_ranges = 1;
314 return;
315 }
316
317 swap_out_of_order_endpoints (min, max, kind);
318 if (kind == VR_VARYING)
319 {
320 set_varying (TREE_TYPE (min));
321 return;
322 }
323
324 // Anti-ranges that can be represented as ranges should be so.
325 if (kind == VR_ANTI_RANGE)
326 {
327 bool is_min = vrp_val_is_min (min);
328 bool is_max = vrp_val_is_max (max);
329
330 if (is_min && is_max)
331 {
332 // Fall through. This will either be normalized as
333 // VR_UNDEFINED if the anti-range spans the entire
334 // precision, or it will remain an VR_ANTI_RANGE in the case
335 // of an -fstrict-enum where [MIN,MAX] is less than the span
336 // of underlying precision.
337 }
338 else if (TYPE_PRECISION (TREE_TYPE (min)) == 1)
339 {
340 irange_set_1bit_anti_range (min, max);
341 return;
342 }
343 else if (is_min)
344 {
345 tree one = build_int_cst (TREE_TYPE (max), 1);
346 min = int_const_binop (PLUS_EXPR, max, one);
347 max = vrp_val_max (TREE_TYPE (max));
348 kind = VR_RANGE;
349 }
350 else if (is_max)
351 {
352 tree one = build_int_cst (TREE_TYPE (min), 1);
353 max = int_const_binop (MINUS_EXPR, min, one);
354 min = vrp_val_min (TREE_TYPE (min));
355 kind = VR_RANGE;
356 }
357 }
358
359 m_kind = kind;
360 m_base[0] = min;
361 m_base[1] = max;
362 m_num_ranges = 1;
363 normalize_kind ();
364 if (flag_checking)
365 verify_range ();
366 }
367
368 // Check the validity of the range.
369
370 void
371 irange::verify_range ()
372 {
373 if (m_kind == VR_UNDEFINED)
374 {
375 gcc_checking_assert (m_num_ranges == 0);
376 return;
377 }
378 if (m_kind == VR_VARYING)
379 {
380 gcc_checking_assert (m_num_ranges == 1);
381 gcc_checking_assert (varying_compatible_p ());
382 return;
383 }
384 if (!legacy_mode_p ())
385 {
386 gcc_checking_assert (m_num_ranges != 0);
387 gcc_checking_assert (!varying_compatible_p ());
388 for (unsigned i = 0; i < m_num_ranges; ++i)
389 {
390 tree lb = tree_lower_bound (i);
391 tree ub = tree_upper_bound (i);
392 int c = compare_values (lb, ub);
393 gcc_checking_assert (c == 0 || c == -1);
394 }
395 return;
396 }
397 if (m_kind == VR_RANGE || m_kind == VR_ANTI_RANGE)
398 {
399 gcc_checking_assert (m_num_ranges == 1);
400 int cmp = compare_values (tree_lower_bound (0), tree_upper_bound (0));
401 gcc_checking_assert (cmp == 0 || cmp == -1 || cmp == -2);
402 }
403 }
404
405 // Return the lower bound for a sub-range. PAIR is the sub-range in
406 // question.
407
408 wide_int
409 irange::legacy_lower_bound (unsigned pair) const
410 {
411 gcc_checking_assert (legacy_mode_p ());
412 if (symbolic_p ())
413 {
414 value_range numeric_range (*this);
415 numeric_range.normalize_symbolics ();
416 return numeric_range.legacy_lower_bound (pair);
417 }
418 gcc_checking_assert (m_num_ranges > 0);
419 gcc_checking_assert (pair + 1 <= num_pairs ());
420 if (m_kind == VR_ANTI_RANGE)
421 {
422 tree typ = type (), t;
423 if (pair == 1 || vrp_val_is_min (min ()))
424 t = wide_int_to_tree (typ, wi::to_wide (max ()) + 1);
425 else
426 t = vrp_val_min (typ);
427 return wi::to_wide (t);
428 }
429 return wi::to_wide (tree_lower_bound (pair));
430 }
431
432 // Return the upper bound for a sub-range. PAIR is the sub-range in
433 // question.
434
435 wide_int
436 irange::legacy_upper_bound (unsigned pair) const
437 {
438 gcc_checking_assert (legacy_mode_p ());
439 if (symbolic_p ())
440 {
441 value_range numeric_range (*this);
442 numeric_range.normalize_symbolics ();
443 return numeric_range.legacy_upper_bound (pair);
444 }
445 gcc_checking_assert (m_num_ranges > 0);
446 gcc_checking_assert (pair + 1 <= num_pairs ());
447 if (m_kind == VR_ANTI_RANGE)
448 {
449 tree typ = type (), t;
450 if (pair == 1 || vrp_val_is_min (min ()))
451 t = vrp_val_max (typ);
452 else
453 t = wide_int_to_tree (typ, wi::to_wide (min ()) - 1);
454 return wi::to_wide (t);
455 }
456 return wi::to_wide (tree_upper_bound (pair));
457 }
458
459 bool
460 irange::legacy_equal_p (const irange &other) const
461 {
462 gcc_checking_assert (legacy_mode_p () && other.legacy_mode_p ());
463
464 if (m_kind != other.m_kind)
465 return false;
466 if (m_kind == VR_UNDEFINED)
467 return true;
468 if (m_kind == VR_VARYING)
469 return range_compatible_p (type (), other.type ());
470 return (vrp_operand_equal_p (tree_lower_bound (0),
471 other.tree_lower_bound (0))
472 && vrp_operand_equal_p (tree_upper_bound (0),
473 other.tree_upper_bound (0)));
474 }
475
476 bool
477 irange::equal_p (const irange &other) const
478 {
479 if (legacy_mode_p ())
480 {
481 if (other.legacy_mode_p ())
482 return legacy_equal_p (other);
483 value_range tmp (other);
484 return legacy_equal_p (tmp);
485 }
486 if (other.legacy_mode_p ())
487 {
488 value_range tmp2 (*this);
489 return tmp2.legacy_equal_p (other);
490 }
491
492 if (m_num_ranges != other.m_num_ranges)
493 return false;
494
495 for (unsigned i = 0; i < m_num_ranges; ++i)
496 {
497 tree lb = tree_lower_bound (i);
498 tree ub = tree_upper_bound (i);
499 tree lb_other = other.tree_lower_bound (i);
500 tree ub_other = other.tree_upper_bound (i);
501 if (!operand_equal_p (lb, lb_other, 0)
502 || !operand_equal_p (ub, ub_other, 0))
503 return false;
504 }
505 return true;
506 }
507
508 /* Return TRUE if this is a symbolic range. */
509
510 bool
511 irange::symbolic_p () const
512 {
513 return (m_num_ranges > 0
514 && (!is_gimple_min_invariant (min ())
515 || !is_gimple_min_invariant (max ())));
516 }
517
518 /* Return TRUE if this is a constant range. */
519
520 bool
521 irange::constant_p () const
522 {
523 return (m_num_ranges > 0
524 && TREE_CODE (min ()) == INTEGER_CST
525 && TREE_CODE (max ()) == INTEGER_CST);
526 }
527
528 /* If range is a singleton, place it in RESULT and return TRUE.
529 Note: A singleton can be any gimple invariant, not just constants.
530 So, [&x, &x] counts as a singleton. */
531
532 bool
533 irange::singleton_p (tree *result) const
534 {
535 if (!legacy_mode_p ())
536 {
537 if (num_pairs () == 1 && (wi::to_wide (tree_lower_bound ())
538 == wi::to_wide (tree_upper_bound ())))
539 {
540 if (result)
541 *result = tree_lower_bound ();
542 return true;
543 }
544 return false;
545 }
546 if (m_kind == VR_ANTI_RANGE)
547 {
548 if (nonzero_p ())
549 {
550 if (TYPE_PRECISION (type ()) == 1)
551 {
552 if (result)
553 *result = max ();
554 return true;
555 }
556 return false;
557 }
558 if (num_pairs () == 1)
559 {
560 value_range vr0, vr1;
561 ranges_from_anti_range ((const value_range *) this, &vr0, &vr1);
562 return vr0.singleton_p (result);
563 }
564 }
565 // Catches non-numeric extremes as well.
566 if (m_kind == VR_RANGE
567 && vrp_operand_equal_p (min (), max ())
568 && is_gimple_min_invariant (min ()))
569 {
570 if (result)
571 *result = min ();
572 return true;
573 }
574 return false;
575 }
576
577 /* Return 1 if VAL is inside value range.
578 0 if VAL is not inside value range.
579 -2 if we cannot tell either way.
580
581 Benchmark compile/20001226-1.c compilation time after changing this
582 function. */
583
584 int
585 irange::value_inside_range (tree val) const
586 {
587 if (varying_p ())
588 return 1;
589
590 if (undefined_p ())
591 return 0;
592
593 if (!legacy_mode_p () && TREE_CODE (val) == INTEGER_CST)
594 return contains_p (val);
595
596 int cmp1 = operand_less_p (val, min ());
597 if (cmp1 == -2)
598 return -2;
599 if (cmp1 == 1)
600 return m_kind != VR_RANGE;
601
602 int cmp2 = operand_less_p (max (), val);
603 if (cmp2 == -2)
604 return -2;
605
606 if (m_kind == VR_RANGE)
607 return !cmp2;
608 else
609 return !!cmp2;
610 }
611
612 /* Return TRUE if it is possible that range contains VAL. */
613
614 bool
615 irange::may_contain_p (tree val) const
616 {
617 return value_inside_range (val) != 0;
618 }
619
620 /* Return TRUE if range contains INTEGER_CST. */
621 /* Return 1 if VAL is inside value range.
622 0 if VAL is not inside value range.
623
624 Benchmark compile/20001226-1.c compilation time after changing this
625 function. */
626
627
628 bool
629 irange::contains_p (tree cst) const
630 {
631 if (undefined_p ())
632 return false;
633
634 if (legacy_mode_p ())
635 {
636 gcc_checking_assert (TREE_CODE (cst) == INTEGER_CST);
637 if (symbolic_p ())
638 {
639 value_range numeric_range (*this);
640 numeric_range.normalize_symbolics ();
641 return numeric_range.contains_p (cst);
642 }
643 return value_inside_range (cst) == 1;
644 }
645
646 gcc_checking_assert (TREE_CODE (cst) == INTEGER_CST);
647 signop sign = TYPE_SIGN (TREE_TYPE (cst));
648 wide_int v = wi::to_wide (cst);
649 for (unsigned r = 0; r < m_num_ranges; ++r)
650 {
651 if (wi::lt_p (v, lower_bound (r), sign))
652 return false;
653 if (wi::le_p (v, upper_bound (r), sign))
654 return true;
655 }
656
657 return false;
658 }
659
660
661 /* Normalize addresses into constants. */
662
663 void
664 irange::normalize_addresses ()
665 {
666 if (undefined_p ())
667 return;
668
669 if (!POINTER_TYPE_P (type ()) || range_has_numeric_bounds_p (this))
670 return;
671
672 if (!range_includes_zero_p (this))
673 {
674 gcc_checking_assert (TREE_CODE (min ()) == ADDR_EXPR
675 || TREE_CODE (max ()) == ADDR_EXPR);
676 set_nonzero (type ());
677 return;
678 }
679 set_varying (type ());
680 }
681
682 /* Normalize symbolics and addresses into constants. */
683
684 void
685 irange::normalize_symbolics ()
686 {
687 if (varying_p () || undefined_p ())
688 return;
689
690 tree ttype = type ();
691 bool min_symbolic = !is_gimple_min_invariant (min ());
692 bool max_symbolic = !is_gimple_min_invariant (max ());
693 if (!min_symbolic && !max_symbolic)
694 {
695 normalize_addresses ();
696 return;
697 }
698
699 // [SYM, SYM] -> VARYING
700 if (min_symbolic && max_symbolic)
701 {
702 set_varying (ttype);
703 return;
704 }
705 if (kind () == VR_RANGE)
706 {
707 // [SYM, NUM] -> [-MIN, NUM]
708 if (min_symbolic)
709 {
710 set (vrp_val_min (ttype), max ());
711 return;
712 }
713 // [NUM, SYM] -> [NUM, +MAX]
714 set (min (), vrp_val_max (ttype));
715 return;
716 }
717 gcc_checking_assert (kind () == VR_ANTI_RANGE);
718 // ~[SYM, NUM] -> [NUM + 1, +MAX]
719 if (min_symbolic)
720 {
721 if (!vrp_val_is_max (max ()))
722 {
723 tree n = wide_int_to_tree (ttype, wi::to_wide (max ()) + 1);
724 set (n, vrp_val_max (ttype));
725 return;
726 }
727 set_varying (ttype);
728 return;
729 }
730 // ~[NUM, SYM] -> [-MIN, NUM - 1]
731 if (!vrp_val_is_min (min ()))
732 {
733 tree n = wide_int_to_tree (ttype, wi::to_wide (min ()) - 1);
734 set (vrp_val_min (ttype), n);
735 return;
736 }
737 set_varying (ttype);
738 }
739
740 /* Intersect the two value-ranges { *VR0TYPE, *VR0MIN, *VR0MAX } and
741 { VR1TYPE, VR0MIN, VR0MAX } and store the result
742 in { *VR0TYPE, *VR0MIN, *VR0MAX }. This may not be the smallest
743 possible such range. The resulting range is not canonicalized. */
744
745 static void
746 intersect_ranges (enum value_range_kind *vr0type,
747 tree *vr0min, tree *vr0max,
748 enum value_range_kind vr1type,
749 tree vr1min, tree vr1max)
750 {
751 bool mineq = vrp_operand_equal_p (*vr0min, vr1min);
752 bool maxeq = vrp_operand_equal_p (*vr0max, vr1max);
753
754 /* [] is vr0, () is vr1 in the following classification comments. */
755 if (mineq && maxeq)
756 {
757 /* [( )] */
758 if (*vr0type == vr1type)
759 /* Nothing to do for equal ranges. */
760 ;
761 else if ((*vr0type == VR_RANGE
762 && vr1type == VR_ANTI_RANGE)
763 || (*vr0type == VR_ANTI_RANGE
764 && vr1type == VR_RANGE))
765 {
766 /* For anti-range with range intersection the result is empty. */
767 *vr0type = VR_UNDEFINED;
768 *vr0min = NULL_TREE;
769 *vr0max = NULL_TREE;
770 }
771 else
772 gcc_unreachable ();
773 }
774 else if (operand_less_p (*vr0max, vr1min) == 1
775 || operand_less_p (vr1max, *vr0min) == 1)
776 {
777 /* [ ] ( ) or ( ) [ ]
778 If the ranges have an empty intersection, the result of the
779 intersect operation is the range for intersecting an
780 anti-range with a range or empty when intersecting two ranges. */
781 if (*vr0type == VR_RANGE
782 && vr1type == VR_ANTI_RANGE)
783 ;
784 else if (*vr0type == VR_ANTI_RANGE
785 && vr1type == VR_RANGE)
786 {
787 *vr0type = vr1type;
788 *vr0min = vr1min;
789 *vr0max = vr1max;
790 }
791 else if (*vr0type == VR_RANGE
792 && vr1type == VR_RANGE)
793 {
794 *vr0type = VR_UNDEFINED;
795 *vr0min = NULL_TREE;
796 *vr0max = NULL_TREE;
797 }
798 else if (*vr0type == VR_ANTI_RANGE
799 && vr1type == VR_ANTI_RANGE)
800 {
801 /* If the anti-ranges are adjacent to each other merge them. */
802 if (TREE_CODE (*vr0max) == INTEGER_CST
803 && TREE_CODE (vr1min) == INTEGER_CST
804 && operand_less_p (*vr0max, vr1min) == 1
805 && integer_onep (int_const_binop (MINUS_EXPR,
806 vr1min, *vr0max)))
807 *vr0max = vr1max;
808 else if (TREE_CODE (vr1max) == INTEGER_CST
809 && TREE_CODE (*vr0min) == INTEGER_CST
810 && operand_less_p (vr1max, *vr0min) == 1
811 && integer_onep (int_const_binop (MINUS_EXPR,
812 *vr0min, vr1max)))
813 *vr0min = vr1min;
814 /* Else arbitrarily take VR0. */
815 }
816 }
817 else if ((maxeq || operand_less_p (vr1max, *vr0max) == 1)
818 && (mineq || operand_less_p (*vr0min, vr1min) == 1))
819 {
820 /* [ ( ) ] or [( ) ] or [ ( )] */
821 if (*vr0type == VR_RANGE
822 && vr1type == VR_RANGE)
823 {
824 /* If both are ranges the result is the inner one. */
825 *vr0type = vr1type;
826 *vr0min = vr1min;
827 *vr0max = vr1max;
828 }
829 else if (*vr0type == VR_RANGE
830 && vr1type == VR_ANTI_RANGE)
831 {
832 /* Choose the right gap if the left one is empty. */
833 if (mineq)
834 {
835 if (TREE_CODE (vr1max) != INTEGER_CST)
836 *vr0min = vr1max;
837 else if (TYPE_PRECISION (TREE_TYPE (vr1max)) == 1
838 && !TYPE_UNSIGNED (TREE_TYPE (vr1max)))
839 *vr0min
840 = int_const_binop (MINUS_EXPR, vr1max,
841 build_int_cst (TREE_TYPE (vr1max), -1));
842 else
843 *vr0min
844 = int_const_binop (PLUS_EXPR, vr1max,
845 build_int_cst (TREE_TYPE (vr1max), 1));
846 }
847 /* Choose the left gap if the right one is empty. */
848 else if (maxeq)
849 {
850 if (TREE_CODE (vr1min) != INTEGER_CST)
851 *vr0max = vr1min;
852 else if (TYPE_PRECISION (TREE_TYPE (vr1min)) == 1
853 && !TYPE_UNSIGNED (TREE_TYPE (vr1min)))
854 *vr0max
855 = int_const_binop (PLUS_EXPR, vr1min,
856 build_int_cst (TREE_TYPE (vr1min), -1));
857 else
858 *vr0max
859 = int_const_binop (MINUS_EXPR, vr1min,
860 build_int_cst (TREE_TYPE (vr1min), 1));
861 }
862 /* Choose the anti-range if the range is effectively varying. */
863 else if (vrp_val_is_min (*vr0min)
864 && vrp_val_is_max (*vr0max))
865 {
866 *vr0type = vr1type;
867 *vr0min = vr1min;
868 *vr0max = vr1max;
869 }
870 /* Else choose the range. */
871 }
872 else if (*vr0type == VR_ANTI_RANGE
873 && vr1type == VR_ANTI_RANGE)
874 /* If both are anti-ranges the result is the outer one. */
875 ;
876 else if (*vr0type == VR_ANTI_RANGE
877 && vr1type == VR_RANGE)
878 {
879 /* The intersection is empty. */
880 *vr0type = VR_UNDEFINED;
881 *vr0min = NULL_TREE;
882 *vr0max = NULL_TREE;
883 }
884 else
885 gcc_unreachable ();
886 }
887 else if ((maxeq || operand_less_p (*vr0max, vr1max) == 1)
888 && (mineq || operand_less_p (vr1min, *vr0min) == 1))
889 {
890 /* ( [ ] ) or ([ ] ) or ( [ ]) */
891 if (*vr0type == VR_RANGE
892 && vr1type == VR_RANGE)
893 /* Choose the inner range. */
894 ;
895 else if (*vr0type == VR_ANTI_RANGE
896 && vr1type == VR_RANGE)
897 {
898 /* Choose the right gap if the left is empty. */
899 if (mineq)
900 {
901 *vr0type = VR_RANGE;
902 if (TREE_CODE (*vr0max) != INTEGER_CST)
903 *vr0min = *vr0max;
904 else if (TYPE_PRECISION (TREE_TYPE (*vr0max)) == 1
905 && !TYPE_UNSIGNED (TREE_TYPE (*vr0max)))
906 *vr0min
907 = int_const_binop (MINUS_EXPR, *vr0max,
908 build_int_cst (TREE_TYPE (*vr0max), -1));
909 else
910 *vr0min
911 = int_const_binop (PLUS_EXPR, *vr0max,
912 build_int_cst (TREE_TYPE (*vr0max), 1));
913 *vr0max = vr1max;
914 }
915 /* Choose the left gap if the right is empty. */
916 else if (maxeq)
917 {
918 *vr0type = VR_RANGE;
919 if (TREE_CODE (*vr0min) != INTEGER_CST)
920 *vr0max = *vr0min;
921 else if (TYPE_PRECISION (TREE_TYPE (*vr0min)) == 1
922 && !TYPE_UNSIGNED (TREE_TYPE (*vr0min)))
923 *vr0max
924 = int_const_binop (PLUS_EXPR, *vr0min,
925 build_int_cst (TREE_TYPE (*vr0min), -1));
926 else
927 *vr0max
928 = int_const_binop (MINUS_EXPR, *vr0min,
929 build_int_cst (TREE_TYPE (*vr0min), 1));
930 *vr0min = vr1min;
931 }
932 /* Choose the anti-range if the range is effectively varying. */
933 else if (vrp_val_is_min (vr1min)
934 && vrp_val_is_max (vr1max))
935 ;
936 /* Choose the anti-range if it is ~[0,0], that range is special
937 enough to special case when vr1's range is relatively wide.
938 At least for types bigger than int - this covers pointers
939 and arguments to functions like ctz. */
940 else if (*vr0min == *vr0max
941 && integer_zerop (*vr0min)
942 && ((TYPE_PRECISION (TREE_TYPE (*vr0min))
943 >= TYPE_PRECISION (integer_type_node))
944 || POINTER_TYPE_P (TREE_TYPE (*vr0min)))
945 && TREE_CODE (vr1max) == INTEGER_CST
946 && TREE_CODE (vr1min) == INTEGER_CST
947 && (wi::clz (wi::to_wide (vr1max) - wi::to_wide (vr1min))
948 < TYPE_PRECISION (TREE_TYPE (*vr0min)) / 2))
949 ;
950 /* Else choose the range. */
951 else
952 {
953 *vr0type = vr1type;
954 *vr0min = vr1min;
955 *vr0max = vr1max;
956 }
957 }
958 else if (*vr0type == VR_ANTI_RANGE
959 && vr1type == VR_ANTI_RANGE)
960 {
961 /* If both are anti-ranges the result is the outer one. */
962 *vr0type = vr1type;
963 *vr0min = vr1min;
964 *vr0max = vr1max;
965 }
966 else if (vr1type == VR_ANTI_RANGE
967 && *vr0type == VR_RANGE)
968 {
969 /* The intersection is empty. */
970 *vr0type = VR_UNDEFINED;
971 *vr0min = NULL_TREE;
972 *vr0max = NULL_TREE;
973 }
974 else
975 gcc_unreachable ();
976 }
977 else if ((operand_less_p (vr1min, *vr0max) == 1
978 || operand_equal_p (vr1min, *vr0max, 0))
979 && operand_less_p (*vr0min, vr1min) == 1
980 && operand_less_p (*vr0max, vr1max) == 1)
981 {
982 /* [ ( ] ) or [ ]( ) */
983 if (*vr0type == VR_ANTI_RANGE
984 && vr1type == VR_ANTI_RANGE)
985 *vr0max = vr1max;
986 else if (*vr0type == VR_RANGE
987 && vr1type == VR_RANGE)
988 *vr0min = vr1min;
989 else if (*vr0type == VR_RANGE
990 && vr1type == VR_ANTI_RANGE)
991 {
992 if (TREE_CODE (vr1min) == INTEGER_CST)
993 *vr0max = int_const_binop (MINUS_EXPR, vr1min,
994 build_int_cst (TREE_TYPE (vr1min), 1));
995 else
996 *vr0max = vr1min;
997 }
998 else if (*vr0type == VR_ANTI_RANGE
999 && vr1type == VR_RANGE)
1000 {
1001 *vr0type = VR_RANGE;
1002 if (TREE_CODE (*vr0max) == INTEGER_CST)
1003 *vr0min = int_const_binop (PLUS_EXPR, *vr0max,
1004 build_int_cst (TREE_TYPE (*vr0max), 1));
1005 else
1006 *vr0min = *vr0max;
1007 *vr0max = vr1max;
1008 }
1009 else
1010 gcc_unreachable ();
1011 }
1012 else if ((operand_less_p (*vr0min, vr1max) == 1
1013 || operand_equal_p (*vr0min, vr1max, 0))
1014 && operand_less_p (vr1min, *vr0min) == 1
1015 && operand_less_p (vr1max, *vr0max) == 1)
1016 {
1017 /* ( [ ) ] or ( )[ ] */
1018 if (*vr0type == VR_ANTI_RANGE
1019 && vr1type == VR_ANTI_RANGE)
1020 *vr0min = vr1min;
1021 else if (*vr0type == VR_RANGE
1022 && vr1type == VR_RANGE)
1023 *vr0max = vr1max;
1024 else if (*vr0type == VR_RANGE
1025 && vr1type == VR_ANTI_RANGE)
1026 {
1027 if (TREE_CODE (vr1max) == INTEGER_CST)
1028 *vr0min = int_const_binop (PLUS_EXPR, vr1max,
1029 build_int_cst (TREE_TYPE (vr1max), 1));
1030 else
1031 *vr0min = vr1max;
1032 }
1033 else if (*vr0type == VR_ANTI_RANGE
1034 && vr1type == VR_RANGE)
1035 {
1036 *vr0type = VR_RANGE;
1037 if (TREE_CODE (*vr0min) == INTEGER_CST)
1038 *vr0max = int_const_binop (MINUS_EXPR, *vr0min,
1039 build_int_cst (TREE_TYPE (*vr0min), 1));
1040 else
1041 *vr0max = *vr0min;
1042 *vr0min = vr1min;
1043 }
1044 else
1045 gcc_unreachable ();
1046 }
1047
1048 /* If we know the intersection is empty, there's no need to
1049 conservatively add anything else to the set. */
1050 if (*vr0type == VR_UNDEFINED)
1051 return;
1052
1053 /* As a fallback simply use { *VRTYPE, *VR0MIN, *VR0MAX } as
1054 result for the intersection. That's always a conservative
1055 correct estimate unless VR1 is a constant singleton range
1056 in which case we choose that. */
1057 if (vr1type == VR_RANGE
1058 && is_gimple_min_invariant (vr1min)
1059 && vrp_operand_equal_p (vr1min, vr1max))
1060 {
1061 *vr0type = vr1type;
1062 *vr0min = vr1min;
1063 *vr0max = vr1max;
1064 }
1065 }
1066
1067 /* Helper for the intersection operation for value ranges. Given two
1068 ranges VR0 and VR1, set VR0 to the intersection of both ranges.
1069 This may not be the smallest possible such range. */
1070
1071 void
1072 irange::legacy_intersect (irange *vr0, const irange *vr1)
1073 {
1074 gcc_checking_assert (vr0->legacy_mode_p ());
1075 gcc_checking_assert (vr1->legacy_mode_p ());
1076 /* If either range is VR_VARYING the other one wins. */
1077 if (vr1->varying_p ())
1078 return;
1079 if (vr0->varying_p ())
1080 {
1081 vr0->set (vr1->min (), vr1->max (), vr1->kind ());
1082 return;
1083 }
1084
1085 /* When either range is VR_UNDEFINED the resulting range is
1086 VR_UNDEFINED, too. */
1087 if (vr0->undefined_p ())
1088 return;
1089 if (vr1->undefined_p ())
1090 {
1091 vr0->set_undefined ();
1092 return;
1093 }
1094
1095 value_range_kind vr0kind = vr0->kind ();
1096 tree vr0min = vr0->min ();
1097 tree vr0max = vr0->max ();
1098
1099 intersect_ranges (&vr0kind, &vr0min, &vr0max,
1100 vr1->kind (), vr1->min (), vr1->max ());
1101
1102 /* Make sure to canonicalize the result though as the inversion of a
1103 VR_RANGE can still be a VR_RANGE. */
1104 if (vr0kind == VR_UNDEFINED)
1105 vr0->set_undefined ();
1106 else if (vr0kind == VR_VARYING)
1107 {
1108 /* If we failed, use the original VR0. */
1109 return;
1110 }
1111 else
1112 vr0->set (vr0min, vr0max, vr0kind);
1113 }
1114
1115 /* Union the two value-ranges { *VR0TYPE, *VR0MIN, *VR0MAX } and
1116 { VR1TYPE, VR0MIN, VR0MAX } and store the result
1117 in { *VR0TYPE, *VR0MIN, *VR0MAX }. This may not be the smallest
1118 possible such range. The resulting range is not canonicalized. */
1119
1120 static void
1121 union_ranges (enum value_range_kind *vr0type,
1122 tree *vr0min, tree *vr0max,
1123 enum value_range_kind vr1type,
1124 tree vr1min, tree vr1max)
1125 {
1126 int cmpmin = compare_values (*vr0min, vr1min);
1127 int cmpmax = compare_values (*vr0max, vr1max);
1128 bool mineq = cmpmin == 0;
1129 bool maxeq = cmpmax == 0;
1130
1131 /* [] is vr0, () is vr1 in the following classification comments. */
1132 if (mineq && maxeq)
1133 {
1134 /* [( )] */
1135 if (*vr0type == vr1type)
1136 /* Nothing to do for equal ranges. */
1137 ;
1138 else if ((*vr0type == VR_RANGE
1139 && vr1type == VR_ANTI_RANGE)
1140 || (*vr0type == VR_ANTI_RANGE
1141 && vr1type == VR_RANGE))
1142 {
1143 /* For anti-range with range union the result is varying. */
1144 goto give_up;
1145 }
1146 else
1147 gcc_unreachable ();
1148 }
1149 else if (operand_less_p (*vr0max, vr1min) == 1
1150 || operand_less_p (vr1max, *vr0min) == 1)
1151 {
1152 /* [ ] ( ) or ( ) [ ]
1153 If the ranges have an empty intersection, result of the union
1154 operation is the anti-range or if both are anti-ranges
1155 it covers all. */
1156 if (*vr0type == VR_ANTI_RANGE
1157 && vr1type == VR_ANTI_RANGE)
1158 goto give_up;
1159 else if (*vr0type == VR_ANTI_RANGE
1160 && vr1type == VR_RANGE)
1161 ;
1162 else if (*vr0type == VR_RANGE
1163 && vr1type == VR_ANTI_RANGE)
1164 {
1165 *vr0type = vr1type;
1166 *vr0min = vr1min;
1167 *vr0max = vr1max;
1168 }
1169 else if (*vr0type == VR_RANGE
1170 && vr1type == VR_RANGE)
1171 {
1172 /* The result is the convex hull of both ranges. */
1173 if (operand_less_p (*vr0max, vr1min) == 1)
1174 {
1175 /* If the result can be an anti-range, create one. */
1176 if (TREE_CODE (*vr0max) == INTEGER_CST
1177 && TREE_CODE (vr1min) == INTEGER_CST
1178 && vrp_val_is_min (*vr0min)
1179 && vrp_val_is_max (vr1max))
1180 {
1181 tree min = int_const_binop (PLUS_EXPR,
1182 *vr0max,
1183 build_int_cst (TREE_TYPE (*vr0max), 1));
1184 tree max = int_const_binop (MINUS_EXPR,
1185 vr1min,
1186 build_int_cst (TREE_TYPE (vr1min), 1));
1187 if (!operand_less_p (max, min))
1188 {
1189 *vr0type = VR_ANTI_RANGE;
1190 *vr0min = min;
1191 *vr0max = max;
1192 }
1193 else
1194 *vr0max = vr1max;
1195 }
1196 else
1197 *vr0max = vr1max;
1198 }
1199 else
1200 {
1201 /* If the result can be an anti-range, create one. */
1202 if (TREE_CODE (vr1max) == INTEGER_CST
1203 && TREE_CODE (*vr0min) == INTEGER_CST
1204 && vrp_val_is_min (vr1min)
1205 && vrp_val_is_max (*vr0max))
1206 {
1207 tree min = int_const_binop (PLUS_EXPR,
1208 vr1max,
1209 build_int_cst (TREE_TYPE (vr1max), 1));
1210 tree max = int_const_binop (MINUS_EXPR,
1211 *vr0min,
1212 build_int_cst (TREE_TYPE (*vr0min), 1));
1213 if (!operand_less_p (max, min))
1214 {
1215 *vr0type = VR_ANTI_RANGE;
1216 *vr0min = min;
1217 *vr0max = max;
1218 }
1219 else
1220 *vr0min = vr1min;
1221 }
1222 else
1223 *vr0min = vr1min;
1224 }
1225 }
1226 else
1227 gcc_unreachable ();
1228 }
1229 else if ((maxeq || cmpmax == 1)
1230 && (mineq || cmpmin == -1))
1231 {
1232 /* [ ( ) ] or [( ) ] or [ ( )] */
1233 if (*vr0type == VR_RANGE
1234 && vr1type == VR_RANGE)
1235 ;
1236 else if (*vr0type == VR_ANTI_RANGE
1237 && vr1type == VR_ANTI_RANGE)
1238 {
1239 *vr0type = vr1type;
1240 *vr0min = vr1min;
1241 *vr0max = vr1max;
1242 }
1243 else if (*vr0type == VR_ANTI_RANGE
1244 && vr1type == VR_RANGE)
1245 {
1246 /* Arbitrarily choose the right or left gap. */
1247 if (!mineq && TREE_CODE (vr1min) == INTEGER_CST)
1248 *vr0max = int_const_binop (MINUS_EXPR, vr1min,
1249 build_int_cst (TREE_TYPE (vr1min), 1));
1250 else if (!maxeq && TREE_CODE (vr1max) == INTEGER_CST)
1251 *vr0min = int_const_binop (PLUS_EXPR, vr1max,
1252 build_int_cst (TREE_TYPE (vr1max), 1));
1253 else
1254 goto give_up;
1255 }
1256 else if (*vr0type == VR_RANGE
1257 && vr1type == VR_ANTI_RANGE)
1258 /* The result covers everything. */
1259 goto give_up;
1260 else
1261 gcc_unreachable ();
1262 }
1263 else if ((maxeq || cmpmax == -1)
1264 && (mineq || cmpmin == 1))
1265 {
1266 /* ( [ ] ) or ([ ] ) or ( [ ]) */
1267 if (*vr0type == VR_RANGE
1268 && vr1type == VR_RANGE)
1269 {
1270 *vr0type = vr1type;
1271 *vr0min = vr1min;
1272 *vr0max = vr1max;
1273 }
1274 else if (*vr0type == VR_ANTI_RANGE
1275 && vr1type == VR_ANTI_RANGE)
1276 ;
1277 else if (*vr0type == VR_RANGE
1278 && vr1type == VR_ANTI_RANGE)
1279 {
1280 *vr0type = VR_ANTI_RANGE;
1281 if (!mineq && TREE_CODE (*vr0min) == INTEGER_CST)
1282 {
1283 *vr0max = int_const_binop (MINUS_EXPR, *vr0min,
1284 build_int_cst (TREE_TYPE (*vr0min), 1));
1285 *vr0min = vr1min;
1286 }
1287 else if (!maxeq && TREE_CODE (*vr0max) == INTEGER_CST)
1288 {
1289 *vr0min = int_const_binop (PLUS_EXPR, *vr0max,
1290 build_int_cst (TREE_TYPE (*vr0max), 1));
1291 *vr0max = vr1max;
1292 }
1293 else
1294 goto give_up;
1295 }
1296 else if (*vr0type == VR_ANTI_RANGE
1297 && vr1type == VR_RANGE)
1298 /* The result covers everything. */
1299 goto give_up;
1300 else
1301 gcc_unreachable ();
1302 }
1303 else if (cmpmin == -1
1304 && cmpmax == -1
1305 && (operand_less_p (vr1min, *vr0max) == 1
1306 || operand_equal_p (vr1min, *vr0max, 0)))
1307 {
1308 /* [ ( ] ) or [ ]( ) */
1309 if (*vr0type == VR_RANGE
1310 && vr1type == VR_RANGE)
1311 *vr0max = vr1max;
1312 else if (*vr0type == VR_ANTI_RANGE
1313 && vr1type == VR_ANTI_RANGE)
1314 *vr0min = vr1min;
1315 else if (*vr0type == VR_ANTI_RANGE
1316 && vr1type == VR_RANGE)
1317 {
1318 if (TREE_CODE (vr1min) == INTEGER_CST)
1319 *vr0max = int_const_binop (MINUS_EXPR, vr1min,
1320 build_int_cst (TREE_TYPE (vr1min), 1));
1321 else
1322 goto give_up;
1323 }
1324 else if (*vr0type == VR_RANGE
1325 && vr1type == VR_ANTI_RANGE)
1326 {
1327 if (TREE_CODE (*vr0max) == INTEGER_CST)
1328 {
1329 *vr0type = vr1type;
1330 *vr0min = int_const_binop (PLUS_EXPR, *vr0max,
1331 build_int_cst (TREE_TYPE (*vr0max), 1));
1332 *vr0max = vr1max;
1333 }
1334 else
1335 goto give_up;
1336 }
1337 else
1338 gcc_unreachable ();
1339 }
1340 else if (cmpmin == 1
1341 && cmpmax == 1
1342 && (operand_less_p (*vr0min, vr1max) == 1
1343 || operand_equal_p (*vr0min, vr1max, 0)))
1344 {
1345 /* ( [ ) ] or ( )[ ] */
1346 if (*vr0type == VR_RANGE
1347 && vr1type == VR_RANGE)
1348 *vr0min = vr1min;
1349 else if (*vr0type == VR_ANTI_RANGE
1350 && vr1type == VR_ANTI_RANGE)
1351 *vr0max = vr1max;
1352 else if (*vr0type == VR_ANTI_RANGE
1353 && vr1type == VR_RANGE)
1354 {
1355 if (TREE_CODE (vr1max) == INTEGER_CST)
1356 *vr0min = int_const_binop (PLUS_EXPR, vr1max,
1357 build_int_cst (TREE_TYPE (vr1max), 1));
1358 else
1359 goto give_up;
1360 }
1361 else if (*vr0type == VR_RANGE
1362 && vr1type == VR_ANTI_RANGE)
1363 {
1364 if (TREE_CODE (*vr0min) == INTEGER_CST)
1365 {
1366 *vr0type = vr1type;
1367 *vr0max = int_const_binop (MINUS_EXPR, *vr0min,
1368 build_int_cst (TREE_TYPE (*vr0min), 1));
1369 *vr0min = vr1min;
1370 }
1371 else
1372 goto give_up;
1373 }
1374 else
1375 gcc_unreachable ();
1376 }
1377 else
1378 goto give_up;
1379
1380 return;
1381
1382 give_up:
1383 *vr0type = VR_VARYING;
1384 *vr0min = NULL_TREE;
1385 *vr0max = NULL_TREE;
1386 }
1387
1388 /* Helper for meet operation for value ranges. Given two ranges VR0
1389 and VR1, set VR0 to the union of both ranges. This may not be the
1390 smallest possible such range. */
1391
1392 void
1393 irange::legacy_union (irange *vr0, const irange *vr1)
1394 {
1395 gcc_checking_assert (vr0->legacy_mode_p ());
1396 gcc_checking_assert (vr1->legacy_mode_p ());
1397
1398 /* VR0 has the resulting range if VR1 is undefined or VR0 is varying. */
1399 if (vr1->undefined_p ()
1400 || vr0->varying_p ())
1401 return;
1402
1403 /* VR1 has the resulting range if VR0 is undefined or VR1 is varying. */
1404 if (vr0->undefined_p ())
1405 {
1406 vr0->set (vr1->min (), vr1->max (), vr1->kind ());
1407 return;
1408 }
1409
1410 if (vr1->varying_p ())
1411 {
1412 vr0->set_varying (vr1->type ());
1413 return;
1414 }
1415
1416 value_range_kind vr0kind = vr0->kind ();
1417 tree vr0min = vr0->min ();
1418 tree vr0max = vr0->max ();
1419
1420 union_ranges (&vr0kind, &vr0min, &vr0max,
1421 vr1->kind (), vr1->min (), vr1->max ());
1422
1423 if (vr0kind == VR_UNDEFINED)
1424 vr0->set_undefined ();
1425 else if (vr0kind == VR_VARYING)
1426 {
1427 /* Failed to find an efficient meet. Before giving up and
1428 setting the result to VARYING, see if we can at least derive
1429 a non-zero range. */
1430 if (range_includes_zero_p (vr0) == 0
1431 && range_includes_zero_p (vr1) == 0)
1432 vr0->set_nonzero (vr0->type ());
1433 else
1434 vr0->set_varying (vr0->type ());
1435 }
1436 else
1437 vr0->set (vr0min, vr0max, vr0kind);
1438 }
1439
1440 /* Meet operation for value ranges. Given two value ranges VR0 and
1441 VR1, store in VR0 a range that contains both VR0 and VR1. This
1442 may not be the smallest possible such range. */
1443
1444 void
1445 irange::union_ (const irange *other)
1446 {
1447 if (legacy_mode_p ())
1448 {
1449 if (!other->legacy_mode_p ())
1450 {
1451 int_range<1> tmp = *other;
1452 legacy_union (this, &tmp);
1453 return;
1454 }
1455 if (dump_file && (dump_flags & TDF_DETAILS))
1456 {
1457 fprintf (dump_file, "Meeting\n ");
1458 dump_value_range (dump_file, this);
1459 fprintf (dump_file, "\nand\n ");
1460 dump_value_range (dump_file, other);
1461 fprintf (dump_file, "\n");
1462 }
1463
1464 legacy_union (this, other);
1465
1466 if (dump_file && (dump_flags & TDF_DETAILS))
1467 {
1468 fprintf (dump_file, "to\n ");
1469 dump_value_range (dump_file, this);
1470 fprintf (dump_file, "\n");
1471 }
1472 return;
1473 }
1474
1475 if (other->legacy_mode_p ())
1476 {
1477 int_range<2> wider = *other;
1478 irange_union (wider);
1479 }
1480 else
1481 irange_union (*other);
1482 }
1483
1484 void
1485 irange::intersect (const irange *other)
1486 {
1487 if (legacy_mode_p ())
1488 {
1489 if (!other->legacy_mode_p ())
1490 {
1491 int_range<1> tmp = *other;
1492 legacy_intersect (this, &tmp);
1493 return;
1494 }
1495 if (dump_file && (dump_flags & TDF_DETAILS))
1496 {
1497 fprintf (dump_file, "Intersecting\n ");
1498 dump_value_range (dump_file, this);
1499 fprintf (dump_file, "\nand\n ");
1500 dump_value_range (dump_file, other);
1501 fprintf (dump_file, "\n");
1502 }
1503
1504 legacy_intersect (this, other);
1505
1506 if (dump_file && (dump_flags & TDF_DETAILS))
1507 {
1508 fprintf (dump_file, "to\n ");
1509 dump_value_range (dump_file, this);
1510 fprintf (dump_file, "\n");
1511 }
1512 return;
1513 }
1514
1515 if (other->legacy_mode_p ())
1516 {
1517 int_range<2> wider;
1518 wider = *other;
1519 irange_intersect (wider);
1520 }
1521 else
1522 irange_intersect (*other);
1523 }
1524
1525 // union_ for multi-ranges.
1526
1527 void
1528 irange::irange_union (const irange &r)
1529 {
1530 gcc_checking_assert (!legacy_mode_p () && !r.legacy_mode_p ());
1531
1532 if (r.undefined_p () || varying_p ())
1533 return;
1534
1535 if (undefined_p () || r.varying_p ())
1536 {
1537 operator= (r);
1538 return;
1539 }
1540
1541 // Do not worry about merging and such by reserving twice as many
1542 // pairs as needed, and then simply sort the 2 ranges into this
1543 // intermediate form.
1544 //
1545 // The intermediate result will have the property that the beginning
1546 // of each range is <= the beginning of the next range. There may
1547 // be overlapping ranges at this point. I.e. this would be valid
1548 // [-20, 10], [-10, 0], [0, 20], [40, 90] as it satisfies this
1549 // contraint : -20 < -10 < 0 < 40. When the range is rebuilt into r,
1550 // the merge is performed.
1551 //
1552 // [Xi,Yi]..[Xn,Yn] U [Xj,Yj]..[Xm,Ym] --> [Xk,Yk]..[Xp,Yp]
1553 auto_vec<tree, 20> res (m_num_ranges * 2 + r.m_num_ranges * 2);
1554 unsigned i = 0, j = 0, k = 0;
1555
1556 while (i < m_num_ranges * 2 && j < r.m_num_ranges * 2)
1557 {
1558 // lower of Xi and Xj is the lowest point.
1559 if (wi::to_widest (m_base[i]) <= wi::to_widest (r.m_base[j]))
1560 {
1561 res.quick_push (m_base[i]);
1562 res.quick_push (m_base[i + 1]);
1563 k += 2;
1564 i += 2;
1565 }
1566 else
1567 {
1568 res.quick_push (r.m_base[j]);
1569 res.quick_push (r.m_base[j + 1]);
1570 k += 2;
1571 j += 2;
1572 }
1573 }
1574 for ( ; i < m_num_ranges * 2; i += 2)
1575 {
1576 res.quick_push (m_base[i]);
1577 res.quick_push (m_base[i + 1]);
1578 k += 2;
1579 }
1580 for ( ; j < r.m_num_ranges * 2; j += 2)
1581 {
1582 res.quick_push (r.m_base[j]);
1583 res.quick_push (r.m_base[j + 1]);
1584 k += 2;
1585 }
1586
1587 // Now normalize the vector removing any overlaps.
1588 i = 2;
1589 for (j = 2; j < k ; j += 2)
1590 {
1591 // Current upper+1 is >= lower bound next pair, then we merge ranges.
1592 if (wi::to_widest (res[i - 1]) + 1 >= wi::to_widest (res[j]))
1593 {
1594 // New upper bounds is greater of current or the next one.
1595 if (wi::to_widest (res[j + 1]) > wi::to_widest (res[i - 1]))
1596 res[i - 1] = res[j + 1];
1597 }
1598 else
1599 {
1600 // This is a new distinct range, but no point in copying it
1601 // if it is already in the right place.
1602 if (i != j)
1603 {
1604 res[i++] = res[j];
1605 res[i++] = res[j + 1];
1606 }
1607 else
1608 i += 2;
1609 }
1610 }
1611
1612 // At this point, the vector should have i ranges, none overlapping.
1613 // Now it simply needs to be copied, and if there are too many
1614 // ranges, merge some. We wont do any analysis as to what the
1615 // "best" merges are, simply combine the final ranges into one.
1616 if (i > m_max_ranges * 2)
1617 {
1618 res[m_max_ranges * 2 - 1] = res[i - 1];
1619 i = m_max_ranges * 2;
1620 }
1621
1622 for (j = 0; j < i ; j++)
1623 m_base[j] = res [j];
1624 m_num_ranges = i / 2;
1625
1626 m_kind = VR_RANGE;
1627 normalize_kind ();
1628
1629 if (flag_checking)
1630 verify_range ();
1631 }
1632
1633 // intersect for multi-ranges.
1634
1635 void
1636 irange::irange_intersect (const irange &r)
1637 {
1638 gcc_checking_assert (!legacy_mode_p () && !r.legacy_mode_p ());
1639 gcc_checking_assert (undefined_p () || r.undefined_p ()
1640 || range_compatible_p (type (), r.type ()));
1641
1642 if (undefined_p () || r.varying_p ())
1643 return;
1644 if (r.undefined_p ())
1645 {
1646 set_undefined ();
1647 return;
1648 }
1649 if (varying_p ())
1650 {
1651 operator= (r);
1652 return;
1653 }
1654
1655 if (r.num_pairs () == 1)
1656 {
1657 // R cannot be undefined, use more efficent pair routine.
1658 intersect (r.lower_bound(), r.upper_bound ());
1659 return;
1660 }
1661
1662 signop sign = TYPE_SIGN (TREE_TYPE(m_base[0]));
1663 unsigned bld_pair = 0;
1664 unsigned bld_lim = m_max_ranges;
1665 int_range_max r2 (*this);
1666 unsigned r2_lim = r2.num_pairs ();
1667 unsigned i2 = 0;
1668 for (unsigned i = 0; i < r.num_pairs (); )
1669 {
1670 // If r1's upper is < r2's lower, we can skip r1's pair.
1671 tree ru = r.m_base[i * 2 + 1];
1672 tree r2l = r2.m_base[i2 * 2];
1673 if (wi::lt_p (wi::to_wide (ru), wi::to_wide (r2l), sign))
1674 {
1675 i++;
1676 continue;
1677 }
1678 // Likewise, skip r2's pair if its excluded.
1679 tree r2u = r2.m_base[i2 * 2 + 1];
1680 tree rl = r.m_base[i * 2];
1681 if (wi::lt_p (wi::to_wide (r2u), wi::to_wide (rl), sign))
1682 {
1683 i2++;
1684 if (i2 < r2_lim)
1685 continue;
1686 // No more r2, break.
1687 break;
1688 }
1689
1690 // Must be some overlap. Find the highest of the lower bounds,
1691 // and set it, unless the build limits lower bounds is already
1692 // set.
1693 if (bld_pair < bld_lim)
1694 {
1695 if (wi::ge_p (wi::to_wide (rl), wi::to_wide (r2l), sign))
1696 m_base[bld_pair * 2] = rl;
1697 else
1698 m_base[bld_pair * 2] = r2l;
1699 }
1700 else
1701 // Decrease and set a new upper.
1702 bld_pair--;
1703
1704 // ...and choose the lower of the upper bounds.
1705 if (wi::le_p (wi::to_wide (ru), wi::to_wide (r2u), sign))
1706 {
1707 m_base[bld_pair * 2 + 1] = ru;
1708 bld_pair++;
1709 // Move past the r1 pair and keep trying.
1710 i++;
1711 continue;
1712 }
1713 else
1714 {
1715 m_base[bld_pair * 2 + 1] = r2u;
1716 bld_pair++;
1717 i2++;
1718 if (i2 < r2_lim)
1719 continue;
1720 // No more r2, break.
1721 break;
1722 }
1723 // r2 has the higher lower bound.
1724 }
1725
1726 // At the exit of this loop, it is one of 2 things:
1727 // ran out of r1, or r2, but either means we are done.
1728 m_num_ranges = bld_pair;
1729
1730 m_kind = VR_RANGE;
1731 normalize_kind ();
1732
1733 if (flag_checking)
1734 verify_range ();
1735 }
1736
1737 // Multirange intersect for a specified wide_int [lb, ub] range.
1738
1739 void
1740 irange::intersect (const wide_int& lb, const wide_int& ub)
1741 {
1742 // Undefined remains undefined.
1743 if (undefined_p ())
1744 return;
1745
1746 if (legacy_mode_p ())
1747 {
1748 intersect (int_range<1> (type (), lb, ub));
1749 return;
1750 }
1751
1752 tree range_type = type();
1753 signop sign = TYPE_SIGN (range_type);
1754
1755 gcc_checking_assert (TYPE_PRECISION (range_type) == wi::get_precision (lb));
1756 gcc_checking_assert (TYPE_PRECISION (range_type) == wi::get_precision (ub));
1757
1758 unsigned bld_index = 0;
1759 unsigned pair_lim = num_pairs ();
1760 for (unsigned i = 0; i < pair_lim; i++)
1761 {
1762 tree pairl = m_base[i * 2];
1763 tree pairu = m_base[i * 2 + 1];
1764 // Once UB is less than a pairs lower bound, we're done.
1765 if (wi::lt_p (ub, wi::to_wide (pairl), sign))
1766 break;
1767 // if LB is greater than this pairs upper, this pair is excluded.
1768 if (wi::lt_p (wi::to_wide (pairu), lb, sign))
1769 continue;
1770
1771 // Must be some overlap. Find the highest of the lower bounds,
1772 // and set it
1773 if (wi::gt_p (lb, wi::to_wide (pairl), sign))
1774 m_base[bld_index * 2] = wide_int_to_tree (range_type, lb);
1775 else
1776 m_base[bld_index * 2] = pairl;
1777
1778 // ...and choose the lower of the upper bounds and if the base pair
1779 // has the lower upper bound, need to check next pair too.
1780 if (wi::lt_p (ub, wi::to_wide (pairu), sign))
1781 {
1782 m_base[bld_index++ * 2 + 1] = wide_int_to_tree (range_type, ub);
1783 break;
1784 }
1785 else
1786 m_base[bld_index++ * 2 + 1] = pairu;
1787 }
1788
1789 m_num_ranges = bld_index;
1790
1791 m_kind = VR_RANGE;
1792 normalize_kind ();
1793
1794 if (flag_checking)
1795 verify_range ();
1796 }
1797 // Signed 1-bits are strange. You can't subtract 1, because you can't
1798 // represent the number 1. This works around that for the invert routine.
1799
1800 static wide_int inline
1801 subtract_one (const wide_int &x, tree type, wi::overflow_type &overflow)
1802 {
1803 if (TYPE_SIGN (type) == SIGNED)
1804 return wi::add (x, -1, SIGNED, &overflow);
1805 else
1806 return wi::sub (x, 1, UNSIGNED, &overflow);
1807 }
1808
1809 // The analogous function for adding 1.
1810
1811 static wide_int inline
1812 add_one (const wide_int &x, tree type, wi::overflow_type &overflow)
1813 {
1814 if (TYPE_SIGN (type) == SIGNED)
1815 return wi::sub (x, -1, SIGNED, &overflow);
1816 else
1817 return wi::add (x, 1, UNSIGNED, &overflow);
1818 }
1819
1820 // Return the inverse of a range.
1821
1822 void
1823 irange::invert ()
1824 {
1825 if (legacy_mode_p ())
1826 {
1827 // We can't just invert VR_RANGE and VR_ANTI_RANGE because we may
1828 // create non-canonical ranges. Use the constructors instead.
1829 if (m_kind == VR_RANGE)
1830 *this = value_range (min (), max (), VR_ANTI_RANGE);
1831 else if (m_kind == VR_ANTI_RANGE)
1832 *this = value_range (min (), max ());
1833 else
1834 gcc_unreachable ();
1835 return;
1836 }
1837
1838 gcc_checking_assert (!undefined_p () && !varying_p ());
1839
1840 // We always need one more set of bounds to represent an inverse, so
1841 // if we're at the limit, we can't properly represent things.
1842 //
1843 // For instance, to represent the inverse of a 2 sub-range set
1844 // [5, 10][20, 30], we would need a 3 sub-range set
1845 // [-MIN, 4][11, 19][31, MAX].
1846 //
1847 // In this case, return the most conservative thing.
1848 //
1849 // However, if any of the extremes of the range are -MIN/+MAX, we
1850 // know we will not need an extra bound. For example:
1851 //
1852 // INVERT([-MIN,20][30,40]) => [21,29][41,+MAX]
1853 // INVERT([-MIN,20][30,MAX]) => [21,29]
1854 tree ttype = type ();
1855 unsigned prec = TYPE_PRECISION (ttype);
1856 signop sign = TYPE_SIGN (ttype);
1857 wide_int type_min = wi::min_value (prec, sign);
1858 wide_int type_max = wi::max_value (prec, sign);
1859 // The algorithm is as follows. To calculate INVERT ([a,b][c,d]), we
1860 // generate [-MIN, a-1][b+1, c-1][d+1, MAX].
1861 //
1862 // If there is an over/underflow in the calculation for any
1863 // sub-range, we eliminate that subrange. This allows us to easily
1864 // calculate INVERT([-MIN, 5]) with: [-MIN, -MIN-1][6, MAX]. And since
1865 // we eliminate the underflow, only [6, MAX] remains.
1866 unsigned i = 0;
1867 wi::overflow_type ovf;
1868 // Construct leftmost range.
1869 int_range_max orig_range (*this);
1870 unsigned nitems = 0;
1871 wide_int tmp;
1872 // If this is going to underflow on the MINUS 1, don't even bother
1873 // checking. This also handles subtracting one from an unsigned 0,
1874 // which doesn't set the underflow bit.
1875 if (type_min != orig_range.lower_bound ())
1876 {
1877 m_base[nitems++] = wide_int_to_tree (ttype, type_min);
1878 tmp = subtract_one (orig_range.lower_bound (), ttype, ovf);
1879 m_base[nitems++] = wide_int_to_tree (ttype, tmp);
1880 if (ovf)
1881 nitems = 0;
1882 }
1883 i++;
1884 // Construct middle ranges if applicable.
1885 if (orig_range.num_pairs () > 1)
1886 {
1887 unsigned j = i;
1888 for (; j < (orig_range.num_pairs () * 2) - 1; j += 2)
1889 {
1890 // The middle ranges cannot have MAX/MIN, so there's no need
1891 // to check for unsigned overflow on the +1 and -1 here.
1892 tmp = wi::add (wi::to_wide (orig_range.m_base[j]), 1, sign, &ovf);
1893 m_base[nitems++] = wide_int_to_tree (ttype, tmp);
1894 tmp = subtract_one (wi::to_wide (orig_range.m_base[j + 1]),
1895 ttype, ovf);
1896 m_base[nitems++] = wide_int_to_tree (ttype, tmp);
1897 if (ovf)
1898 nitems -= 2;
1899 }
1900 i = j;
1901 }
1902 // Construct rightmost range.
1903 //
1904 // However, if this will overflow on the PLUS 1, don't even bother.
1905 // This also handles adding one to an unsigned MAX, which doesn't
1906 // set the overflow bit.
1907 if (type_max != wi::to_wide (orig_range.m_base[i]))
1908 {
1909 tmp = add_one (wi::to_wide (orig_range.m_base[i]), ttype, ovf);
1910 m_base[nitems++] = wide_int_to_tree (ttype, tmp);
1911 m_base[nitems++] = wide_int_to_tree (ttype, type_max);
1912 if (ovf)
1913 nitems -= 2;
1914 }
1915 m_num_ranges = nitems / 2;
1916
1917 // We disallow undefined or varying coming in, so the result can
1918 // only be a VR_RANGE.
1919 gcc_checking_assert (m_kind == VR_RANGE);
1920
1921 if (flag_checking)
1922 verify_range ();
1923 }
1924
1925 static void
1926 dump_bound_with_infinite_markers (FILE *file, tree bound)
1927 {
1928 tree type = TREE_TYPE (bound);
1929 wide_int type_min = wi::min_value (TYPE_PRECISION (type), TYPE_SIGN (type));
1930 wide_int type_max = wi::max_value (TYPE_PRECISION (type), TYPE_SIGN (type));
1931
1932 if (INTEGRAL_TYPE_P (type)
1933 && !TYPE_UNSIGNED (type)
1934 && TREE_CODE (bound) == INTEGER_CST
1935 && wi::to_wide (bound) == type_min
1936 && TYPE_PRECISION (type) != 1)
1937 fprintf (file, "-INF");
1938 else if (TREE_CODE (bound) == INTEGER_CST
1939 && wi::to_wide (bound) == type_max
1940 && TYPE_PRECISION (type) != 1)
1941 fprintf (file, "+INF");
1942 else
1943 print_generic_expr (file, bound);
1944 }
1945
1946 void
1947 irange::dump (FILE *file) const
1948 {
1949 if (undefined_p ())
1950 {
1951 fprintf (file, "UNDEFINED");
1952 return;
1953 }
1954 print_generic_expr (file, type ());
1955 fprintf (file, " ");
1956 if (varying_p ())
1957 {
1958 fprintf (file, "VARYING");
1959 return;
1960 }
1961 if (legacy_mode_p ())
1962 {
1963 fprintf (file, "%s[", (m_kind == VR_ANTI_RANGE) ? "~" : "");
1964 dump_bound_with_infinite_markers (file, min ());
1965 fprintf (file, ", ");
1966 dump_bound_with_infinite_markers (file, max ());
1967 fprintf (file, "]");
1968 return;
1969 }
1970 for (unsigned i = 0; i < m_num_ranges; ++i)
1971 {
1972 tree lb = m_base[i * 2];
1973 tree ub = m_base[i * 2 + 1];
1974 fprintf (file, "[");
1975 dump_bound_with_infinite_markers (file, lb);
1976 fprintf (file, ", ");
1977 dump_bound_with_infinite_markers (file, ub);
1978 fprintf (file, "]");
1979 }
1980 }
1981
1982 void
1983 irange::debug () const
1984 {
1985 dump (stderr);
1986 fprintf (stderr, "\n");
1987 }
1988
1989 void
1990 dump_value_range (FILE *file, const irange *vr)
1991 {
1992 vr->dump (file);
1993 }
1994
1995 DEBUG_FUNCTION void
1996 debug (const irange *vr)
1997 {
1998 dump_value_range (stderr, vr);
1999 fprintf (stderr, "\n");
2000 }
2001
2002 DEBUG_FUNCTION void
2003 debug (const irange &vr)
2004 {
2005 debug (&vr);
2006 }
2007
2008 DEBUG_FUNCTION void
2009 debug (const value_range *vr)
2010 {
2011 dump_value_range (stderr, vr);
2012 fprintf (stderr, "\n");
2013 }
2014
2015 DEBUG_FUNCTION void
2016 debug (const value_range &vr)
2017 {
2018 dump_value_range (stderr, &vr);
2019 fprintf (stderr, "\n");
2020 }
2021
2022 /* Create two value-ranges in *VR0 and *VR1 from the anti-range *AR
2023 so that *VR0 U *VR1 == *AR. Returns true if that is possible,
2024 false otherwise. If *AR can be represented with a single range
2025 *VR1 will be VR_UNDEFINED. */
2026
2027 bool
2028 ranges_from_anti_range (const value_range *ar,
2029 value_range *vr0, value_range *vr1)
2030 {
2031 tree type = ar->type ();
2032
2033 vr0->set_undefined ();
2034 vr1->set_undefined ();
2035
2036 /* As a future improvement, we could handle ~[0, A] as: [-INF, -1] U
2037 [A+1, +INF]. Not sure if this helps in practice, though. */
2038
2039 if (ar->kind () != VR_ANTI_RANGE
2040 || TREE_CODE (ar->min ()) != INTEGER_CST
2041 || TREE_CODE (ar->max ()) != INTEGER_CST
2042 || !vrp_val_min (type)
2043 || !vrp_val_max (type))
2044 return false;
2045
2046 if (tree_int_cst_lt (vrp_val_min (type), ar->min ()))
2047 vr0->set (vrp_val_min (type),
2048 wide_int_to_tree (type, wi::to_wide (ar->min ()) - 1));
2049 if (tree_int_cst_lt (ar->max (), vrp_val_max (type)))
2050 vr1->set (wide_int_to_tree (type, wi::to_wide (ar->max ()) + 1),
2051 vrp_val_max (type));
2052 if (vr0->undefined_p ())
2053 {
2054 *vr0 = *vr1;
2055 vr1->set_undefined ();
2056 }
2057
2058 return !vr0->undefined_p ();
2059 }
2060
2061 bool
2062 range_has_numeric_bounds_p (const irange *vr)
2063 {
2064 return (!vr->undefined_p ()
2065 && TREE_CODE (vr->min ()) == INTEGER_CST
2066 && TREE_CODE (vr->max ()) == INTEGER_CST);
2067 }
2068
2069 /* Return whether VAL is equal to the maximum value of its type.
2070 We can't do a simple equality comparison with TYPE_MAX_VALUE because
2071 C typedefs and Ada subtypes can produce types whose TYPE_MAX_VALUE
2072 is not == to the integer constant with the same value in the type. */
2073
2074 bool
2075 vrp_val_is_max (const_tree val)
2076 {
2077 tree type_max = vrp_val_max (TREE_TYPE (val));
2078 return (val == type_max
2079 || (type_max != NULL_TREE
2080 && operand_equal_p (val, type_max, 0)));
2081 }
2082
2083 /* Return whether VAL is equal to the minimum value of its type. */
2084
2085 bool
2086 vrp_val_is_min (const_tree val)
2087 {
2088 tree type_min = vrp_val_min (TREE_TYPE (val));
2089 return (val == type_min
2090 || (type_min != NULL_TREE
2091 && operand_equal_p (val, type_min, 0)));
2092 }
2093
2094 /* Return true, if VAL1 and VAL2 are equal values for VRP purposes. */
2095
2096 bool
2097 vrp_operand_equal_p (const_tree val1, const_tree val2)
2098 {
2099 if (val1 == val2)
2100 return true;
2101 if (!val1 || !val2 || !operand_equal_p (val1, val2, 0))
2102 return false;
2103 return true;
2104 }
2105
2106 // ?? These stubs are for ipa-prop.cc which use a value_range in a
2107 // hash_traits. hash-traits.h defines an extern of gt_ggc_mx (T &)
2108 // instead of picking up the gt_ggc_mx (T *) version.
2109 void
2110 gt_pch_nx (int_range<1> *&x)
2111 {
2112 return gt_pch_nx ((irange *) x);
2113 }
2114
2115 void
2116 gt_ggc_mx (int_range<1> *&x)
2117 {
2118 return gt_ggc_mx ((irange *) x);
2119 }
2120
2121 #define DEFINE_INT_RANGE_INSTANCE(N) \
2122 template int_range<N>::int_range(tree, tree, value_range_kind); \
2123 template int_range<N>::int_range(tree_node *, \
2124 const wide_int &, \
2125 const wide_int &, \
2126 value_range_kind); \
2127 template int_range<N>::int_range(tree); \
2128 template int_range<N>::int_range(const irange &); \
2129 template int_range<N>::int_range(const int_range &); \
2130 template int_range<N>& int_range<N>::operator= (const int_range &);
2131
2132 DEFINE_INT_RANGE_INSTANCE(1)
2133 DEFINE_INT_RANGE_INSTANCE(2)
2134 DEFINE_INT_RANGE_INSTANCE(3)
2135 DEFINE_INT_RANGE_INSTANCE(255)
2136
2137 #if CHECKING_P
2138 #include "selftest.h"
2139
2140 namespace selftest
2141 {
2142 #define INT(N) build_int_cst (integer_type_node, (N))
2143 #define UINT(N) build_int_cstu (unsigned_type_node, (N))
2144 #define UINT128(N) build_int_cstu (u128_type, (N))
2145 #define UCHAR(N) build_int_cstu (unsigned_char_type_node, (N))
2146 #define SCHAR(N) build_int_cst (signed_char_type_node, (N))
2147
2148 static int_range<3>
2149 build_range3 (int a, int b, int c, int d, int e, int f)
2150 {
2151 int_range<3> i1 (INT (a), INT (b));
2152 int_range<3> i2 (INT (c), INT (d));
2153 int_range<3> i3 (INT (e), INT (f));
2154 i1.union_ (i2);
2155 i1.union_ (i3);
2156 return i1;
2157 }
2158
2159 static void
2160 range_tests_irange3 ()
2161 {
2162 typedef int_range<3> int_range3;
2163 int_range3 r0, r1, r2;
2164 int_range3 i1, i2, i3;
2165
2166 // ([10,20] U [5,8]) U [1,3] ==> [1,3][5,8][10,20].
2167 r0 = int_range3 (INT (10), INT (20));
2168 r1 = int_range3 (INT (5), INT (8));
2169 r0.union_ (r1);
2170 r1 = int_range3 (INT (1), INT (3));
2171 r0.union_ (r1);
2172 ASSERT_TRUE (r0 == build_range3 (1, 3, 5, 8, 10, 20));
2173
2174 // [1,3][5,8][10,20] U [-5,0] => [-5,3][5,8][10,20].
2175 r1 = int_range3 (INT (-5), INT (0));
2176 r0.union_ (r1);
2177 ASSERT_TRUE (r0 == build_range3 (-5, 3, 5, 8, 10, 20));
2178
2179 // [10,20][30,40] U [50,60] ==> [10,20][30,40][50,60].
2180 r1 = int_range3 (INT (50), INT (60));
2181 r0 = int_range3 (INT (10), INT (20));
2182 r0.union_ (int_range3 (INT (30), INT (40)));
2183 r0.union_ (r1);
2184 ASSERT_TRUE (r0 == build_range3 (10, 20, 30, 40, 50, 60));
2185 // [10,20][30,40][50,60] U [70, 80] ==> [10,20][30,40][50,60][70,80].
2186 r1 = int_range3 (INT (70), INT (80));
2187 r0.union_ (r1);
2188
2189 r2 = build_range3 (10, 20, 30, 40, 50, 60);
2190 r2.union_ (int_range3 (INT (70), INT (80)));
2191 ASSERT_TRUE (r0 == r2);
2192
2193 // [10,20][30,40][50,60] U [6,35] => [6,40][50,60].
2194 r0 = build_range3 (10, 20, 30, 40, 50, 60);
2195 r1 = int_range3 (INT (6), INT (35));
2196 r0.union_ (r1);
2197 r1 = int_range3 (INT (6), INT (40));
2198 r1.union_ (int_range3 (INT (50), INT (60)));
2199 ASSERT_TRUE (r0 == r1);
2200
2201 // [10,20][30,40][50,60] U [6,60] => [6,60].
2202 r0 = build_range3 (10, 20, 30, 40, 50, 60);
2203 r1 = int_range3 (INT (6), INT (60));
2204 r0.union_ (r1);
2205 ASSERT_TRUE (r0 == int_range3 (INT (6), INT (60)));
2206
2207 // [10,20][30,40][50,60] U [6,70] => [6,70].
2208 r0 = build_range3 (10, 20, 30, 40, 50, 60);
2209 r1 = int_range3 (INT (6), INT (70));
2210 r0.union_ (r1);
2211 ASSERT_TRUE (r0 == int_range3 (INT (6), INT (70)));
2212
2213 // [10,20][30,40][50,60] U [35,70] => [10,20][30,70].
2214 r0 = build_range3 (10, 20, 30, 40, 50, 60);
2215 r1 = int_range3 (INT (35), INT (70));
2216 r0.union_ (r1);
2217 r1 = int_range3 (INT (10), INT (20));
2218 r1.union_ (int_range3 (INT (30), INT (70)));
2219 ASSERT_TRUE (r0 == r1);
2220
2221 // [10,20][30,40][50,60] U [15,35] => [10,40][50,60].
2222 r0 = build_range3 (10, 20, 30, 40, 50, 60);
2223 r1 = int_range3 (INT (15), INT (35));
2224 r0.union_ (r1);
2225 r1 = int_range3 (INT (10), INT (40));
2226 r1.union_ (int_range3 (INT (50), INT (60)));
2227 ASSERT_TRUE (r0 == r1);
2228
2229 // [10,20][30,40][50,60] U [35,35] => [10,20][30,40][50,60].
2230 r0 = build_range3 (10, 20, 30, 40, 50, 60);
2231 r1 = int_range3 (INT (35), INT (35));
2232 r0.union_ (r1);
2233 ASSERT_TRUE (r0 == build_range3 (10, 20, 30, 40, 50, 60));
2234 }
2235
2236 static void
2237 range_tests_int_range_max ()
2238 {
2239 int_range_max big;
2240 unsigned int nrange;
2241
2242 // Build a huge multi-range range.
2243 for (nrange = 0; nrange < 50; ++nrange)
2244 {
2245 int_range<1> tmp (INT (nrange*10), INT (nrange*10 + 5));
2246 big.union_ (tmp);
2247 }
2248 ASSERT_TRUE (big.num_pairs () == nrange);
2249
2250 // Verify that we can copy it without loosing precision.
2251 int_range_max copy (big);
2252 ASSERT_TRUE (copy.num_pairs () == nrange);
2253
2254 // Inverting it should produce one more sub-range.
2255 big.invert ();
2256 ASSERT_TRUE (big.num_pairs () == nrange + 1);
2257
2258 int_range<1> tmp (INT (5), INT (37));
2259 big.intersect (tmp);
2260 ASSERT_TRUE (big.num_pairs () == 4);
2261
2262 // Test that [10,10][20,20] does NOT contain 15.
2263 {
2264 int_range_max i1 (build_int_cst (integer_type_node, 10),
2265 build_int_cst (integer_type_node, 10));
2266 int_range_max i2 (build_int_cst (integer_type_node, 20),
2267 build_int_cst (integer_type_node, 20));
2268 i1.union_ (i2);
2269 ASSERT_FALSE (i1.contains_p (build_int_cst (integer_type_node, 15)));
2270 }
2271 }
2272
2273 static void
2274 range_tests_legacy ()
2275 {
2276 // Test truncating copy to int_range<1>.
2277 int_range<3> big = build_range3 (10, 20, 30, 40, 50, 60);
2278 int_range<1> small = big;
2279 ASSERT_TRUE (small == int_range<1> (INT (10), INT (60)));
2280
2281 // Test truncating copy to int_range<2>.
2282 int_range<2> medium = big;
2283 ASSERT_TRUE (!medium.undefined_p ());
2284
2285 // Test that a truncating copy of [MIN,20][22,40][80,MAX]
2286 // ends up as a conservative anti-range of ~[21,21].
2287 big = int_range<3> (vrp_val_min (integer_type_node), INT (20));
2288 big.union_ (int_range<1> (INT (22), INT (40)));
2289 big.union_ (int_range<1> (INT (80), vrp_val_max (integer_type_node)));
2290 small = big;
2291 ASSERT_TRUE (small == int_range<1> (INT (21), INT (21), VR_ANTI_RANGE));
2292
2293 // Copying a legacy symbolic to an int_range should normalize the
2294 // symbolic at copy time.
2295 {
2296 tree ssa = make_ssa_name (integer_type_node);
2297 value_range legacy_range (ssa, INT (25));
2298 int_range<2> copy = legacy_range;
2299 ASSERT_TRUE (copy == int_range<2> (vrp_val_min (integer_type_node),
2300 INT (25)));
2301
2302 // Test that copying ~[abc_23, abc_23] to a multi-range yields varying.
2303 legacy_range = value_range (ssa, ssa, VR_ANTI_RANGE);
2304 copy = legacy_range;
2305 ASSERT_TRUE (copy.varying_p ());
2306 }
2307
2308 // VARYING of different sizes should not be equal.
2309 tree big_type = build_nonstandard_integer_type (32, 1);
2310 tree small_type = build_nonstandard_integer_type (16, 1);
2311 int_range_max r0 (big_type);
2312 int_range_max r1 (small_type);
2313 ASSERT_TRUE (r0 != r1);
2314 value_range vr0 (big_type);
2315 int_range_max vr1 (small_type);
2316 ASSERT_TRUE (vr0 != vr1);
2317 }
2318
2319 // Simulate -fstrict-enums where the domain of a type is less than the
2320 // underlying type.
2321
2322 static void
2323 range_tests_strict_enum ()
2324 {
2325 // The enum can only hold [0, 3].
2326 tree rtype = copy_node (unsigned_type_node);
2327 TYPE_MIN_VALUE (rtype) = build_int_cstu (rtype, 0);
2328 TYPE_MAX_VALUE (rtype) = build_int_cstu (rtype, 3);
2329
2330 // Test that even though vr1 covers the strict enum domain ([0, 3]),
2331 // it does not cover the domain of the underlying type.
2332 int_range<1> vr1 (build_int_cstu (rtype, 0), build_int_cstu (rtype, 1));
2333 int_range<1> vr2 (build_int_cstu (rtype, 2), build_int_cstu (rtype, 3));
2334 vr1.union_ (vr2);
2335 ASSERT_TRUE (vr1 == int_range<1> (build_int_cstu (rtype, 0),
2336 build_int_cstu (rtype, 3)));
2337 ASSERT_FALSE (vr1.varying_p ());
2338
2339 // Test that copying to a multi-range does not change things.
2340 int_range<2> ir1 (vr1);
2341 ASSERT_TRUE (ir1 == vr1);
2342 ASSERT_FALSE (ir1.varying_p ());
2343
2344 // The same test as above, but using TYPE_{MIN,MAX}_VALUE instead of [0,3].
2345 vr1 = int_range<1> (TYPE_MIN_VALUE (rtype), TYPE_MAX_VALUE (rtype));
2346 ir1 = vr1;
2347 ASSERT_TRUE (ir1 == vr1);
2348 ASSERT_FALSE (ir1.varying_p ());
2349 }
2350
2351 static void
2352 range_tests_misc ()
2353 {
2354 tree u128_type = build_nonstandard_integer_type (128, /*unsigned=*/1);
2355 int_range<1> i1, i2, i3;
2356 int_range<1> r0, r1, rold;
2357
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 tree one_bit_min = vrp_val_min (one_bit_type);
2362 tree one_bit_max = vrp_val_max (one_bit_type);
2363 {
2364 int_range<2> min (one_bit_min, one_bit_min);
2365 int_range<2> max (one_bit_max, one_bit_max);
2366 max.union_ (min);
2367 ASSERT_TRUE (max.varying_p ());
2368 }
2369
2370 // Test inversion of 1-bit signed integers.
2371 {
2372 int_range<2> min (one_bit_min, one_bit_min);
2373 int_range<2> max (one_bit_max, one_bit_max);
2374 int_range<2> t;
2375 t = min;
2376 t.invert ();
2377 ASSERT_TRUE (t == max);
2378 t = max;
2379 t.invert ();
2380 ASSERT_TRUE (t == min);
2381 }
2382
2383 // Test that NOT(255) is [0..254] in 8-bit land.
2384 int_range<1> not_255 (UCHAR (255), UCHAR (255), VR_ANTI_RANGE);
2385 ASSERT_TRUE (not_255 == int_range<1> (UCHAR (0), UCHAR (254)));
2386
2387 // Test that NOT(0) is [1..255] in 8-bit land.
2388 int_range<1> not_zero = range_nonzero (unsigned_char_type_node);
2389 ASSERT_TRUE (not_zero == int_range<1> (UCHAR (1), UCHAR (255)));
2390
2391 // Check that [0,127][0x..ffffff80,0x..ffffff]
2392 // => ~[128, 0x..ffffff7f].
2393 r0 = int_range<1> (UINT128 (0), UINT128 (127));
2394 tree high = build_minus_one_cst (u128_type);
2395 // low = -1 - 127 => 0x..ffffff80.
2396 tree low = fold_build2 (MINUS_EXPR, u128_type, high, UINT128(127));
2397 r1 = int_range<1> (low, high); // [0x..ffffff80, 0x..ffffffff]
2398 // r0 = [0,127][0x..ffffff80,0x..fffffff].
2399 r0.union_ (r1);
2400 // r1 = [128, 0x..ffffff7f].
2401 r1 = int_range<1> (UINT128(128),
2402 fold_build2 (MINUS_EXPR, u128_type,
2403 build_minus_one_cst (u128_type),
2404 UINT128(128)));
2405 r0.invert ();
2406 ASSERT_TRUE (r0 == r1);
2407
2408 r0.set_varying (integer_type_node);
2409 tree minint = wide_int_to_tree (integer_type_node, r0.lower_bound ());
2410 tree maxint = wide_int_to_tree (integer_type_node, r0.upper_bound ());
2411
2412 r0.set_varying (short_integer_type_node);
2413
2414 r0.set_varying (unsigned_type_node);
2415 tree maxuint = wide_int_to_tree (unsigned_type_node, r0.upper_bound ());
2416
2417 // Check that ~[0,5] => [6,MAX] for unsigned int.
2418 r0 = int_range<1> (UINT (0), UINT (5));
2419 r0.invert ();
2420 ASSERT_TRUE (r0 == int_range<1> (UINT(6), maxuint));
2421
2422 // Check that ~[10,MAX] => [0,9] for unsigned int.
2423 r0 = int_range<1> (UINT(10), maxuint);
2424 r0.invert ();
2425 ASSERT_TRUE (r0 == int_range<1> (UINT (0), UINT (9)));
2426
2427 // Check that ~[0,5] => [6,MAX] for unsigned 128-bit numbers.
2428 r0 = int_range<1> (UINT128 (0), UINT128 (5), VR_ANTI_RANGE);
2429 r1 = int_range<1> (UINT128(6), build_minus_one_cst (u128_type));
2430 ASSERT_TRUE (r0 == r1);
2431
2432 // Check that [~5] is really [-MIN,4][6,MAX].
2433 r0 = int_range<1> (INT (5), INT (5), VR_ANTI_RANGE);
2434 r1 = int_range<1> (minint, INT (4));
2435 r1.union_ (int_range<1> (INT (6), maxint));
2436 ASSERT_FALSE (r1.undefined_p ());
2437 ASSERT_TRUE (r0 == r1);
2438
2439 r1 = int_range<1> (INT (5), INT (5));
2440 int_range<1> r2 (r1);
2441 ASSERT_TRUE (r1 == r2);
2442
2443 r1 = int_range<1> (INT (5), INT (10));
2444
2445 r1 = int_range<1> (integer_type_node,
2446 wi::to_wide (INT (5)), wi::to_wide (INT (10)));
2447 ASSERT_TRUE (r1.contains_p (INT (7)));
2448
2449 r1 = int_range<1> (SCHAR (0), SCHAR (20));
2450 ASSERT_TRUE (r1.contains_p (SCHAR(15)));
2451 ASSERT_FALSE (r1.contains_p (SCHAR(300)));
2452
2453 // NOT([10,20]) ==> [-MIN,9][21,MAX].
2454 r0 = r1 = int_range<1> (INT (10), INT (20));
2455 r2 = int_range<1> (minint, INT(9));
2456 r2.union_ (int_range<1> (INT(21), maxint));
2457 ASSERT_FALSE (r2.undefined_p ());
2458 r1.invert ();
2459 ASSERT_TRUE (r1 == r2);
2460 // Test that NOT(NOT(x)) == x.
2461 r2.invert ();
2462 ASSERT_TRUE (r0 == r2);
2463
2464 // Test that booleans and their inverse work as expected.
2465 r0 = range_zero (boolean_type_node);
2466 ASSERT_TRUE (r0 == int_range<1> (build_zero_cst (boolean_type_node),
2467 build_zero_cst (boolean_type_node)));
2468 r0.invert ();
2469 ASSERT_TRUE (r0 == int_range<1> (build_one_cst (boolean_type_node),
2470 build_one_cst (boolean_type_node)));
2471
2472 // Make sure NULL and non-NULL of pointer types work, and that
2473 // inverses of them are consistent.
2474 tree voidp = build_pointer_type (void_type_node);
2475 r0 = range_zero (voidp);
2476 r1 = r0;
2477 r0.invert ();
2478 r0.invert ();
2479 ASSERT_TRUE (r0 == r1);
2480
2481 // [10,20] U [15, 30] => [10, 30].
2482 r0 = int_range<1> (INT (10), INT (20));
2483 r1 = int_range<1> (INT (15), INT (30));
2484 r0.union_ (r1);
2485 ASSERT_TRUE (r0 == int_range<1> (INT (10), INT (30)));
2486
2487 // [15,40] U [] => [15,40].
2488 r0 = int_range<1> (INT (15), INT (40));
2489 r1.set_undefined ();
2490 r0.union_ (r1);
2491 ASSERT_TRUE (r0 == int_range<1> (INT (15), INT (40)));
2492
2493 // [10,20] U [10,10] => [10,20].
2494 r0 = int_range<1> (INT (10), INT (20));
2495 r1 = int_range<1> (INT (10), INT (10));
2496 r0.union_ (r1);
2497 ASSERT_TRUE (r0 == int_range<1> (INT (10), INT (20)));
2498
2499 // [10,20] U [9,9] => [9,20].
2500 r0 = int_range<1> (INT (10), INT (20));
2501 r1 = int_range<1> (INT (9), INT (9));
2502 r0.union_ (r1);
2503 ASSERT_TRUE (r0 == int_range<1> (INT (9), INT (20)));
2504
2505 // [10,20] ^ [15,30] => [15,20].
2506 r0 = int_range<1> (INT (10), INT (20));
2507 r1 = int_range<1> (INT (15), INT (30));
2508 r0.intersect (r1);
2509 ASSERT_TRUE (r0 == int_range<1> (INT (15), INT (20)));
2510
2511 // Test the internal sanity of wide_int's wrt HWIs.
2512 ASSERT_TRUE (wi::max_value (TYPE_PRECISION (boolean_type_node),
2513 TYPE_SIGN (boolean_type_node))
2514 == wi::uhwi (1, TYPE_PRECISION (boolean_type_node)));
2515
2516 // Test zero_p().
2517 r0 = int_range<1> (INT (0), INT (0));
2518 ASSERT_TRUE (r0.zero_p ());
2519
2520 // Test nonzero_p().
2521 r0 = int_range<1> (INT (0), INT (0));
2522 r0.invert ();
2523 ASSERT_TRUE (r0.nonzero_p ());
2524
2525 // test legacy interaction
2526 // r0 = ~[1,1]
2527 r0 = int_range<1> (UINT (1), UINT (1), VR_ANTI_RANGE);
2528 // r1 = ~[3,3]
2529 r1 = int_range<1> (UINT (3), UINT (3), VR_ANTI_RANGE);
2530
2531 // vv = [0,0][2,2][4, MAX]
2532 int_range<3> vv = r0;
2533 vv.intersect (r1);
2534
2535 ASSERT_TRUE (vv.contains_p (UINT (2)));
2536 ASSERT_TRUE (vv.num_pairs () == 3);
2537
2538 // create r0 as legacy [1,1]
2539 r0 = int_range<1> (UINT (1), UINT (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 (UINT (2)));
2544 }
2545
2546 void
2547 range_tests ()
2548 {
2549 range_tests_legacy ();
2550 range_tests_irange3 ();
2551 range_tests_int_range_max ();
2552 range_tests_strict_enum ();
2553 range_tests_misc ();
2554 }
2555
2556 } // namespace selftest
2557
2558 #endif // CHECKING_P
2559