1 /* Code for range operators.
2 Copyright (C) 2017-2024 Free Software Foundation, Inc.
3 Contributed by Andrew MacLeod <amacleod@redhat.com>
4 and Aldy Hernandez <aldyh@redhat.com>.
6 This file is part of GCC.
8 GCC is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3, or (at your option)
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
24 #include "coretypes.h"
26 #include "insn-codes.h"
31 #include "tree-pass.h"
33 #include "optabs-tree.h"
34 #include "gimple-pretty-print.h"
35 #include "diagnostic-core.h"
37 #include "fold-const.h"
38 #include "stor-layout.h"
41 #include "gimple-iterator.h"
42 #include "gimple-fold.h"
44 #include "gimple-walk.h"
47 #include "value-relation.h"
49 #include "tree-ssa-ccp.h"
50 #include "range-op-mixed.h"
53 range_operator::fold_range (prange
&, tree
, const prange
&, const prange
&,
60 range_operator::fold_range (prange
&, tree
, const prange
&, const irange
&,
67 range_operator::fold_range (irange
&, tree
, const prange
&, const prange
&,
74 range_operator::fold_range (prange
&, tree
, const irange
&, const prange
&,
81 range_operator::fold_range (irange
&, tree
, const prange
&, const irange
&,
88 range_operator::op1_op2_relation_effect (prange
&, tree
,
97 range_operator::op1_op2_relation_effect (prange
&, tree
,
106 range_operator::op1_op2_relation_effect (irange
&, tree
,
115 range_operator::op1_op2_relation_effect (prange
&, tree
,
124 range_operator::op1_op2_relation_effect (irange
&, tree
,
133 range_operator::op1_range (prange
&, tree
,
134 const prange
&lhs ATTRIBUTE_UNUSED
,
135 const prange
&op2 ATTRIBUTE_UNUSED
,
142 range_operator::op1_range (prange
&, tree
,
143 const irange
&lhs ATTRIBUTE_UNUSED
,
144 const prange
&op2 ATTRIBUTE_UNUSED
,
151 range_operator::op1_range (prange
&, tree
,
152 const prange
&lhs ATTRIBUTE_UNUSED
,
153 const irange
&op2 ATTRIBUTE_UNUSED
,
160 range_operator::op1_range (irange
&, tree
,
161 const prange
&lhs ATTRIBUTE_UNUSED
,
162 const irange
&op2 ATTRIBUTE_UNUSED
,
169 range_operator::op2_range (prange
&, tree
,
170 const irange
&lhs ATTRIBUTE_UNUSED
,
171 const prange
&op1 ATTRIBUTE_UNUSED
,
178 range_operator::op2_range (irange
&, tree
,
179 const prange
&lhs ATTRIBUTE_UNUSED
,
180 const prange
&op1 ATTRIBUTE_UNUSED
,
187 range_operator::op1_op2_relation (const irange
&lhs ATTRIBUTE_UNUSED
,
188 const prange
&op1 ATTRIBUTE_UNUSED
,
189 const prange
&op2 ATTRIBUTE_UNUSED
) const
195 range_operator::lhs_op1_relation (const prange
&lhs ATTRIBUTE_UNUSED
,
196 const irange
&op1 ATTRIBUTE_UNUSED
,
197 const irange
&op2 ATTRIBUTE_UNUSED
,
198 relation_kind rel ATTRIBUTE_UNUSED
) const
204 range_operator::lhs_op1_relation (const irange
&lhs ATTRIBUTE_UNUSED
,
205 const prange
&op1 ATTRIBUTE_UNUSED
,
206 const prange
&op2 ATTRIBUTE_UNUSED
,
207 relation_kind rel ATTRIBUTE_UNUSED
) const
213 range_operator::lhs_op1_relation (const prange
&lhs ATTRIBUTE_UNUSED
,
214 const prange
&op1 ATTRIBUTE_UNUSED
,
215 const prange
&op2 ATTRIBUTE_UNUSED
,
216 relation_kind rel ATTRIBUTE_UNUSED
) const
222 range_operator::update_bitmask (irange
&,
224 const prange
&) const
228 // Return the upper limit for a type.
230 static inline wide_int
231 max_limit (const_tree type
)
233 return wi::max_value (TYPE_PRECISION (type
), TYPE_SIGN (type
));
236 // Return the lower limit for a type.
238 static inline wide_int
239 min_limit (const_tree type
)
241 return wi::min_value (TYPE_PRECISION (type
), TYPE_SIGN (type
));
244 // Build a range that is < VAL and store it in R.
247 build_lt (prange
&r
, tree type
, const prange
&val
)
249 wi::overflow_type ov
;
250 wide_int lim
= wi::sub (val
.upper_bound (), 1, UNSIGNED
, &ov
);
252 // If val - 1 underflows, check if X < MIN, which is an empty range.
256 r
.set (type
, min_limit (type
), lim
);
259 // Build a range that is <= VAL and store it in R.
262 build_le (prange
&r
, tree type
, const prange
&val
)
264 r
.set (type
, min_limit (type
), val
.upper_bound ());
267 // Build a range that is > VAL and store it in R.
270 build_gt (prange
&r
, tree type
, const prange
&val
)
272 wi::overflow_type ov
;
273 wide_int lim
= wi::add (val
.lower_bound (), 1, UNSIGNED
, &ov
);
275 // If val + 1 overflows, check is for X > MAX, which is an empty range.
279 r
.set (type
, lim
, max_limit (type
));
283 // Build a range that is >= VAL and store it in R.
286 build_ge (prange
&r
, tree type
, const prange
&val
)
288 r
.set (type
, val
.lower_bound (), max_limit (type
));
291 class pointer_plus_operator
: public range_operator
293 using range_operator::update_bitmask
;
294 using range_operator::fold_range
;
295 using range_operator::op2_range
;
297 virtual bool fold_range (prange
&r
, tree type
,
300 relation_trio
) const final override
;
301 virtual bool op2_range (irange
&r
, tree type
,
304 relation_trio
= TRIO_VARYING
) const final override
;
305 virtual void wi_fold (irange
&r
, tree type
,
306 const wide_int
&lh_lb
,
307 const wide_int
&lh_ub
,
308 const wide_int
&rh_lb
,
309 const wide_int
&rh_ub
) const;
310 virtual bool op2_range (irange
&r
, tree type
,
313 relation_trio
= TRIO_VARYING
) const;
314 void update_bitmask (irange
&r
, const irange
&lh
, const irange
&rh
) const
315 { update_known_bitmask (r
, POINTER_PLUS_EXPR
, lh
, rh
); }
319 pointer_plus_operator::fold_range (prange
&r
, tree type
,
324 if (empty_range_varying (r
, type
, op1
, op2
))
327 const wide_int lh_lb
= op1
.lower_bound ();
328 const wide_int lh_ub
= op1
.upper_bound ();
329 const wide_int rh_lb
= op2
.lower_bound ();
330 const wide_int rh_ub
= op2
.upper_bound ();
332 // Check for [0,0] + const, and simply return the const.
333 if (lh_lb
== 0 && lh_ub
== 0 && rh_lb
== rh_ub
)
335 r
.set (type
, rh_lb
, rh_lb
);
339 // For pointer types, we are really only interested in asserting
340 // whether the expression evaluates to non-NULL.
342 // With -fno-delete-null-pointer-checks we need to be more
343 // conservative. As some object might reside at address 0,
344 // then some offset could be added to it and the same offset
345 // subtracted again and the result would be NULL.
347 // static int a[12]; where &a[0] is NULL and
350 // ptr will be NULL here, even when there is POINTER_PLUS_EXPR
351 // where the first range doesn't include zero and the second one
352 // doesn't either. As the second operand is sizetype (unsigned),
353 // consider all ranges where the MSB could be set as possible
354 // subtractions where the result might be NULL.
355 if ((!wi_includes_zero_p (type
, lh_lb
, lh_ub
)
356 || !wi_includes_zero_p (type
, rh_lb
, rh_ub
))
357 && !TYPE_OVERFLOW_WRAPS (type
)
358 && (flag_delete_null_pointer_checks
359 || !wi::sign_mask (rh_ub
)))
360 r
.set_nonzero (type
);
361 else if (lh_lb
== lh_ub
&& lh_lb
== 0
362 && rh_lb
== rh_ub
&& rh_lb
== 0)
365 r
.set_varying (type
);
367 update_known_bitmask (r
, POINTER_PLUS_EXPR
, op1
, op2
);
372 pointer_plus_operator::op2_range (irange
&r
, tree type
,
373 const prange
&lhs ATTRIBUTE_UNUSED
,
374 const prange
&op1 ATTRIBUTE_UNUSED
,
375 relation_trio trio
) const
377 relation_kind rel
= trio
.lhs_op1 ();
378 r
.set_varying (type
);
380 // If the LHS and OP1 are equal, the op2 must be zero.
383 // If the LHS and OP1 are not equal, the offset must be non-zero.
384 else if (rel
== VREL_NE
)
385 r
.set_nonzero (type
);
392 pointer_plus_operator::wi_fold (irange
&r
, tree type
,
393 const wide_int
&lh_lb
,
394 const wide_int
&lh_ub
,
395 const wide_int
&rh_lb
,
396 const wide_int
&rh_ub
) const
398 // Check for [0,0] + const, and simply return the const.
399 if (lh_lb
== 0 && lh_ub
== 0 && rh_lb
== rh_ub
)
401 r
.set (type
, rh_lb
, rh_lb
);
405 // For pointer types, we are really only interested in asserting
406 // whether the expression evaluates to non-NULL.
408 // With -fno-delete-null-pointer-checks we need to be more
409 // conservative. As some object might reside at address 0,
410 // then some offset could be added to it and the same offset
411 // subtracted again and the result would be NULL.
413 // static int a[12]; where &a[0] is NULL and
416 // ptr will be NULL here, even when there is POINTER_PLUS_EXPR
417 // where the first range doesn't include zero and the second one
418 // doesn't either. As the second operand is sizetype (unsigned),
419 // consider all ranges where the MSB could be set as possible
420 // subtractions where the result might be NULL.
421 if ((!wi_includes_zero_p (type
, lh_lb
, lh_ub
)
422 || !wi_includes_zero_p (type
, rh_lb
, rh_ub
))
423 && !TYPE_OVERFLOW_WRAPS (type
)
424 && (flag_delete_null_pointer_checks
425 || !wi::sign_mask (rh_ub
)))
426 r
.set_nonzero (type
);
427 else if (lh_lb
== lh_ub
&& lh_lb
== 0
428 && rh_lb
== rh_ub
&& rh_lb
== 0)
431 r
.set_varying (type
);
435 pointer_plus_operator::op2_range (irange
&r
, tree type
,
436 const irange
&lhs ATTRIBUTE_UNUSED
,
437 const irange
&op1 ATTRIBUTE_UNUSED
,
438 relation_trio trio
) const
440 relation_kind rel
= trio
.lhs_op1 ();
441 r
.set_varying (type
);
443 // If the LHS and OP1 are equal, the op2 must be zero.
446 // If the LHS and OP1 are not equal, the offset must be non-zero.
447 else if (rel
== VREL_NE
)
448 r
.set_nonzero (type
);
454 class pointer_min_max_operator
: public range_operator
457 virtual void wi_fold (irange
& r
, tree type
,
458 const wide_int
&lh_lb
, const wide_int
&lh_ub
,
459 const wide_int
&rh_lb
, const wide_int
&rh_ub
) const;
463 pointer_min_max_operator::wi_fold (irange
&r
, tree type
,
464 const wide_int
&lh_lb
,
465 const wide_int
&lh_ub
,
466 const wide_int
&rh_lb
,
467 const wide_int
&rh_ub
) const
469 // For MIN/MAX expressions with pointers, we only care about
470 // nullness. If both are non null, then the result is nonnull.
471 // If both are null, then the result is null. Otherwise they
473 if (!wi_includes_zero_p (type
, lh_lb
, lh_ub
)
474 && !wi_includes_zero_p (type
, rh_lb
, rh_ub
))
475 r
.set_nonzero (type
);
476 else if (wi_zero_p (type
, lh_lb
, lh_ub
) && wi_zero_p (type
, rh_lb
, rh_ub
))
479 r
.set_varying (type
);
482 class pointer_and_operator
: public range_operator
485 virtual void wi_fold (irange
&r
, tree type
,
486 const wide_int
&lh_lb
, const wide_int
&lh_ub
,
487 const wide_int
&rh_lb
, const wide_int
&rh_ub
) const;
491 pointer_and_operator::wi_fold (irange
&r
, tree type
,
492 const wide_int
&lh_lb
,
493 const wide_int
&lh_ub
,
494 const wide_int
&rh_lb ATTRIBUTE_UNUSED
,
495 const wide_int
&rh_ub ATTRIBUTE_UNUSED
) const
497 // For pointer types, we are really only interested in asserting
498 // whether the expression evaluates to non-NULL.
499 if (wi_zero_p (type
, lh_lb
, lh_ub
) || wi_zero_p (type
, lh_lb
, lh_ub
))
502 r
.set_varying (type
);
506 class pointer_or_operator
: public range_operator
509 using range_operator::op1_range
;
510 using range_operator::op2_range
;
511 virtual bool op1_range (irange
&r
, tree type
,
514 relation_trio rel
= TRIO_VARYING
) const;
515 virtual bool op2_range (irange
&r
, tree type
,
518 relation_trio rel
= TRIO_VARYING
) const;
519 virtual void wi_fold (irange
&r
, tree type
,
520 const wide_int
&lh_lb
, const wide_int
&lh_ub
,
521 const wide_int
&rh_lb
, const wide_int
&rh_ub
) const;
525 pointer_or_operator::op1_range (irange
&r
, tree type
,
527 const irange
&op2 ATTRIBUTE_UNUSED
,
530 if (lhs
.undefined_p ())
537 r
.set_varying (type
);
542 pointer_or_operator::op2_range (irange
&r
, tree type
,
547 return pointer_or_operator::op1_range (r
, type
, lhs
, op1
);
551 pointer_or_operator::wi_fold (irange
&r
, tree type
,
552 const wide_int
&lh_lb
,
553 const wide_int
&lh_ub
,
554 const wide_int
&rh_lb
,
555 const wide_int
&rh_ub
) const
557 // For pointer types, we are really only interested in asserting
558 // whether the expression evaluates to non-NULL.
559 if (!wi_includes_zero_p (type
, lh_lb
, lh_ub
)
560 && !wi_includes_zero_p (type
, rh_lb
, rh_ub
))
561 r
.set_nonzero (type
);
562 else if (wi_zero_p (type
, lh_lb
, lh_ub
) && wi_zero_p (type
, rh_lb
, rh_ub
))
565 r
.set_varying (type
);
568 class operator_pointer_diff
: public range_operator
570 using range_operator::update_bitmask
;
571 using range_operator::op1_op2_relation_effect
;
572 virtual bool op1_op2_relation_effect (irange
&lhs_range
,
574 const irange
&op1_range
,
575 const irange
&op2_range
,
576 relation_kind rel
) const;
577 virtual bool op1_op2_relation_effect (irange
&lhs_range
,
579 const prange
&op1_range
,
580 const prange
&op2_range
,
581 relation_kind rel
) const final override
;
582 void update_bitmask (irange
&r
, const irange
&lh
, const irange
&rh
) const
583 { update_known_bitmask (r
, POINTER_DIFF_EXPR
, lh
, rh
); }
584 void update_bitmask (irange
&r
,
585 const prange
&lh
, const prange
&rh
) const final override
586 { update_known_bitmask (r
, POINTER_DIFF_EXPR
, lh
, rh
); }
590 operator_pointer_diff::op1_op2_relation_effect (irange
&lhs_range
, tree type
,
591 const prange
&op1_range
,
592 const prange
&op2_range
,
593 relation_kind rel
) const
595 int_range
<2> op1
, op2
, tmp
;
596 range_op_handler
cast (CONVERT_EXPR
);
598 if (!cast
.fold_range (op1
, type
, op1_range
, tmp
)
599 || !cast
.fold_range (op2
, type
, op2_range
, tmp
))
602 return minus_op1_op2_relation_effect (lhs_range
, type
, op1
, op2
, rel
);
606 operator_pointer_diff::op1_op2_relation_effect (irange
&lhs_range
, tree type
,
607 const irange
&op1_range
,
608 const irange
&op2_range
,
609 relation_kind rel
) const
611 return minus_op1_op2_relation_effect (lhs_range
, type
, op1_range
, op2_range
,
616 operator_identity::fold_range (prange
&r
, tree type ATTRIBUTE_UNUSED
,
617 const prange
&lh ATTRIBUTE_UNUSED
,
618 const prange
&rh ATTRIBUTE_UNUSED
,
626 operator_identity::lhs_op1_relation (const prange
&lhs
,
627 const prange
&op1 ATTRIBUTE_UNUSED
,
628 const prange
&op2 ATTRIBUTE_UNUSED
,
631 if (lhs
.undefined_p ())
633 // Simply a copy, so they are equivalent.
638 operator_identity::op1_range (prange
&r
, tree type ATTRIBUTE_UNUSED
,
640 const prange
&op2 ATTRIBUTE_UNUSED
,
648 operator_cst::fold_range (prange
&r
, tree type ATTRIBUTE_UNUSED
,
650 const prange
& ATTRIBUTE_UNUSED
,
657 // Cast between pointers.
660 operator_cast::fold_range (prange
&r
, tree type
,
665 if (empty_range_varying (r
, type
, inner
, outer
))
668 r
.set (type
, inner
.lower_bound (), inner
.upper_bound ());
669 r
.update_bitmask (inner
.get_bitmask ());
673 // Cast a pointer to an integer.
676 operator_cast::fold_range (irange
&r
, tree type
,
681 if (empty_range_varying (r
, type
, inner
, outer
))
684 // Represent INNER as an integer of the same size, and then cast it
685 // to the resulting integer type.
686 tree pointer_uint_type
= make_unsigned_type (TYPE_PRECISION (inner
.type ()));
687 r
.set (pointer_uint_type
, inner
.lower_bound (), inner
.upper_bound ());
688 r
.update_bitmask (inner
.get_bitmask ());
689 range_cast (r
, type
);
693 // Cast an integer to a pointer.
696 operator_cast::fold_range (prange
&r
, tree type
,
701 if (empty_range_varying (r
, type
, inner
, outer
))
704 // Cast INNER to an integer of the same size as the pointer we want,
705 // and then copy the bounds to the resulting pointer range.
706 int_range
<2> tmp
= inner
;
707 tree pointer_uint_type
= make_unsigned_type (TYPE_PRECISION (type
));
708 range_cast (tmp
, pointer_uint_type
);
709 r
.set (type
, tmp
.lower_bound (), tmp
.upper_bound ());
710 r
.update_bitmask (tmp
.get_bitmask ());
715 operator_cast::op1_range (prange
&r
, tree type
,
718 relation_trio trio
) const
720 if (lhs
.undefined_p ())
722 gcc_checking_assert (types_compatible_p (op2
.type(), type
));
724 // Conversion from other pointers or a constant (including 0/NULL)
725 // are straightforward.
726 if (POINTER_TYPE_P (lhs
.type ())
727 || (lhs
.singleton_p ()
728 && TYPE_PRECISION (lhs
.type ()) >= TYPE_PRECISION (type
)))
729 fold_range (r
, type
, lhs
, op2
, trio
);
732 // If the LHS is not a pointer nor a singleton, then it is
733 // either VARYING or non-zero.
734 if (!lhs
.undefined_p () && !range_includes_zero_p (lhs
))
735 r
.set_nonzero (type
);
737 r
.set_varying (type
);
744 operator_cast::op1_range (irange
&r
, tree type
,
747 relation_trio trio
) const
749 if (lhs
.undefined_p ())
751 gcc_checking_assert (types_compatible_p (op2
.type(), type
));
753 // Conversion from other pointers or a constant (including 0/NULL)
754 // are straightforward.
755 if (POINTER_TYPE_P (lhs
.type ())
756 || (lhs
.singleton_p ()
757 && TYPE_PRECISION (lhs
.type ()) >= TYPE_PRECISION (type
)))
758 fold_range (r
, type
, lhs
, op2
, trio
);
761 // If the LHS is not a pointer nor a singleton, then it is
762 // either VARYING or non-zero.
763 if (!lhs
.undefined_p () && !range_includes_zero_p (lhs
))
764 r
.set_nonzero (type
);
766 r
.set_varying (type
);
773 operator_cast::op1_range (prange
&r
, tree type
,
776 relation_trio trio
) const
778 if (lhs
.undefined_p ())
780 gcc_checking_assert (types_compatible_p (op2
.type(), type
));
782 // Conversion from other pointers or a constant (including 0/NULL)
783 // are straightforward.
784 if (POINTER_TYPE_P (lhs
.type ())
785 || (lhs
.singleton_p ()
786 && TYPE_PRECISION (lhs
.type ()) >= TYPE_PRECISION (type
)))
787 fold_range (r
, type
, lhs
, op2
, trio
);
790 // If the LHS is not a pointer nor a singleton, then it is
791 // either VARYING or non-zero.
792 if (!lhs
.undefined_p () && !range_includes_zero_p (lhs
))
793 r
.set_nonzero (type
);
795 r
.set_varying (type
);
802 operator_cast::lhs_op1_relation (const prange
&lhs
,
804 const prange
&op2 ATTRIBUTE_UNUSED
,
807 if (lhs
.undefined_p () || op1
.undefined_p ())
809 unsigned lhs_prec
= TYPE_PRECISION (lhs
.type ());
810 unsigned op1_prec
= TYPE_PRECISION (op1
.type ());
811 // If the result gets sign extended into a larger type check first if this
812 // qualifies as a partial equivalence.
813 if (TYPE_SIGN (op1
.type ()) == SIGNED
&& lhs_prec
> op1_prec
)
815 // If the result is sign extended, and the LHS is larger than op1,
816 // check if op1's range can be negative as the sign extension will
817 // cause the upper bits to be 1 instead of 0, invalidating the PE.
818 int_range
<3> negs
= range_negatives (op1
.type ());
819 negs
.intersect (op1
);
820 if (!negs
.undefined_p ())
824 unsigned prec
= MIN (lhs_prec
, op1_prec
);
825 return bits_to_pe (prec
);
829 operator_cast::lhs_op1_relation (const prange
&lhs
,
831 const irange
&op2 ATTRIBUTE_UNUSED
,
834 if (lhs
.undefined_p () || op1
.undefined_p ())
836 unsigned lhs_prec
= TYPE_PRECISION (lhs
.type ());
837 unsigned op1_prec
= TYPE_PRECISION (op1
.type ());
838 // If the result gets sign extended into a larger type check first if this
839 // qualifies as a partial equivalence.
840 if (TYPE_SIGN (op1
.type ()) == SIGNED
&& lhs_prec
> op1_prec
)
842 // If the result is sign extended, and the LHS is larger than op1,
843 // check if op1's range can be negative as the sign extension will
844 // cause the upper bits to be 1 instead of 0, invalidating the PE.
845 int_range
<3> negs
= range_negatives (op1
.type ());
846 negs
.intersect (op1
);
847 if (!negs
.undefined_p ())
851 unsigned prec
= MIN (lhs_prec
, op1_prec
);
852 return bits_to_pe (prec
);
856 operator_cast::lhs_op1_relation (const irange
&lhs
,
858 const prange
&op2 ATTRIBUTE_UNUSED
,
861 if (lhs
.undefined_p () || op1
.undefined_p ())
863 unsigned lhs_prec
= TYPE_PRECISION (lhs
.type ());
864 unsigned op1_prec
= TYPE_PRECISION (op1
.type ());
865 // If the result gets sign extended into a larger type check first if this
866 // qualifies as a partial equivalence.
867 if (TYPE_SIGN (op1
.type ()) == SIGNED
&& lhs_prec
> op1_prec
)
869 // If the result is sign extended, and the LHS is larger than op1,
870 // check if op1's range can be negative as the sign extension will
871 // cause the upper bits to be 1 instead of 0, invalidating the PE.
872 int_range
<3> negs
= range_negatives (op1
.type ());
873 negs
.intersect (op1
);
874 if (!negs
.undefined_p ())
878 unsigned prec
= MIN (lhs_prec
, op1_prec
);
879 return bits_to_pe (prec
);
883 operator_min::fold_range (prange
&r
, tree type
,
888 // For MIN/MAX expressions with pointers, we only care about
889 // nullness. If both are non null, then the result is nonnull.
890 // If both are null, then the result is null. Otherwise they
892 if (!range_includes_zero_p (op1
)
893 && !range_includes_zero_p (op2
))
894 r
.set_nonzero (type
);
895 else if (op1
.zero_p () && op2
.zero_p ())
898 r
.set_varying (type
);
900 update_known_bitmask (r
, MIN_EXPR
, op1
, op2
);
905 operator_max::fold_range (prange
&r
, tree type
,
910 // For MIN/MAX expressions with pointers, we only care about
911 // nullness. If both are non null, then the result is nonnull.
912 // If both are null, then the result is null. Otherwise they
914 if (!range_includes_zero_p (op1
)
915 && !range_includes_zero_p (op2
))
916 r
.set_nonzero (type
);
917 else if (op1
.zero_p () && op2
.zero_p ())
920 r
.set_varying (type
);
922 update_known_bitmask (r
, MAX_EXPR
, op1
, op2
);
927 operator_addr_expr::op1_range (prange
&r
, tree type
,
932 if (empty_range_varying (r
, type
, lhs
, op2
))
935 // Return a non-null pointer of the LHS type (passed in op2), but only
936 // if we cant overflow, eitherwise a no-zero offset could wrap to zero.
938 if (!lhs
.undefined_p ()
939 && !range_includes_zero_p (lhs
)
940 && TYPE_OVERFLOW_UNDEFINED (type
))
941 r
.set_nonzero (type
);
943 r
.set_varying (type
);
948 operator_bitwise_and::fold_range (prange
&r
, tree type
,
950 const prange
&op2 ATTRIBUTE_UNUSED
,
953 // For pointer types, we are really only interested in asserting
954 // whether the expression evaluates to non-NULL.
955 if (op1
.zero_p () || op2
.zero_p ())
958 r
.set_varying (type
);
960 update_known_bitmask (r
, BIT_AND_EXPR
, op1
, op2
);
965 operator_equal::fold_range (irange
&r
, tree type
,
968 relation_trio rel
) const
970 if (relop_early_resolve (r
, type
, op1
, op2
, rel
, VREL_EQ
))
973 // We can be sure the values are always equal or not if both ranges
974 // consist of a single value, and then compare them.
975 bool op1_const
= wi::eq_p (op1
.lower_bound (), op1
.upper_bound ());
976 bool op2_const
= wi::eq_p (op2
.lower_bound (), op2
.upper_bound ());
977 if (op1_const
&& op2_const
)
979 if (wi::eq_p (op1
.lower_bound (), op2
.upper_bound()))
980 r
= range_true (type
);
982 r
= range_false (type
);
986 // If ranges do not intersect, we know the range is not equal,
987 // otherwise we don't know anything for sure.
990 if (tmp
.undefined_p ())
991 r
= range_false (type
);
992 // Check if a constant cannot satisfy the bitmask requirements.
993 else if (op2_const
&& !op1
.get_bitmask ().member_p (op2
.lower_bound ()))
994 r
= range_false (type
);
995 else if (op1_const
&& !op2
.get_bitmask ().member_p (op1
.lower_bound ()))
996 r
= range_false (type
);
998 r
= range_true_and_false (type
);
1001 //update_known_bitmask (r, EQ_EXPR, op1, op2);
1006 operator_equal::op1_range (prange
&r
, tree type
,
1009 relation_trio
) const
1011 switch (get_bool_state (r
, lhs
, type
))
1014 // If it's true, the result is the same as OP2.
1019 // If the result is false, the only time we know anything is
1020 // if OP2 is a constant.
1021 if (!op2
.undefined_p ()
1022 && wi::eq_p (op2
.lower_bound(), op2
.upper_bound()))
1028 r
.set_varying (type
);
1038 operator_equal::op2_range (prange
&r
, tree type
,
1041 relation_trio rel
) const
1043 return operator_equal::op1_range (r
, type
, lhs
, op1
, rel
.swap_op1_op2 ());
1047 operator_equal::op1_op2_relation (const irange
&lhs
, const prange
&,
1048 const prange
&) const
1050 if (lhs
.undefined_p ())
1051 return VREL_UNDEFINED
;
1053 // FALSE = op1 == op2 indicates NE_EXPR.
1057 // TRUE = op1 == op2 indicates EQ_EXPR.
1058 if (!range_includes_zero_p (lhs
))
1060 return VREL_VARYING
;
1064 operator_not_equal::fold_range (irange
&r
, tree type
,
1067 relation_trio rel
) const
1069 if (relop_early_resolve (r
, type
, op1
, op2
, rel
, VREL_NE
))
1072 // We can be sure the values are always equal or not if both ranges
1073 // consist of a single value, and then compare them.
1074 bool op1_const
= wi::eq_p (op1
.lower_bound (), op1
.upper_bound ());
1075 bool op2_const
= wi::eq_p (op2
.lower_bound (), op2
.upper_bound ());
1076 if (op1_const
&& op2_const
)
1078 if (wi::ne_p (op1
.lower_bound (), op2
.upper_bound()))
1079 r
= range_true (type
);
1081 r
= range_false (type
);
1085 // If ranges do not intersect, we know the range is not equal,
1086 // otherwise we don't know anything for sure.
1088 tmp
.intersect (op2
);
1089 if (tmp
.undefined_p ())
1090 r
= range_true (type
);
1091 // Check if a constant cannot satisfy the bitmask requirements.
1092 else if (op2_const
&& !op1
.get_bitmask ().member_p (op2
.lower_bound ()))
1093 r
= range_true (type
);
1094 else if (op1_const
&& !op2
.get_bitmask ().member_p (op1
.lower_bound ()))
1095 r
= range_true (type
);
1097 r
= range_true_and_false (type
);
1100 //update_known_bitmask (r, NE_EXPR, op1, op2);
1105 operator_not_equal::op1_range (prange
&r
, tree type
,
1108 relation_trio
) const
1110 switch (get_bool_state (r
, lhs
, type
))
1113 // If the result is true, the only time we know anything is if
1114 // OP2 is a constant.
1115 if (!op2
.undefined_p ()
1116 && wi::eq_p (op2
.lower_bound(), op2
.upper_bound()))
1122 r
.set_varying (type
);
1126 // If it's false, the result is the same as OP2.
1138 operator_not_equal::op2_range (prange
&r
, tree type
,
1141 relation_trio rel
) const
1143 return operator_not_equal::op1_range (r
, type
, lhs
, op1
, rel
.swap_op1_op2 ());
1147 operator_not_equal::op1_op2_relation (const irange
&lhs
, const prange
&,
1148 const prange
&) const
1150 if (lhs
.undefined_p ())
1151 return VREL_UNDEFINED
;
1153 // FALSE = op1 != op2 indicates EQ_EXPR.
1157 // TRUE = op1 != op2 indicates NE_EXPR.
1158 if (!range_includes_zero_p (lhs
))
1160 return VREL_VARYING
;
1164 operator_lt::fold_range (irange
&r
, tree type
,
1167 relation_trio rel
) const
1169 if (relop_early_resolve (r
, type
, op1
, op2
, rel
, VREL_LT
))
1172 signop sign
= TYPE_SIGN (op1
.type ());
1173 gcc_checking_assert (sign
== TYPE_SIGN (op2
.type ()));
1175 if (wi::lt_p (op1
.upper_bound (), op2
.lower_bound (), sign
))
1176 r
= range_true (type
);
1177 else if (!wi::lt_p (op1
.lower_bound (), op2
.upper_bound (), sign
))
1178 r
= range_false (type
);
1179 // Use nonzero bits to determine if < 0 is false.
1180 else if (op2
.zero_p () && !wi::neg_p (op1
.get_nonzero_bits (), sign
))
1181 r
= range_false (type
);
1183 r
= range_true_and_false (type
);
1185 //update_known_bitmask (r, LT_EXPR, op1, op2);
1190 operator_lt::op1_range (prange
&r
, tree type
,
1193 relation_trio
) const
1195 if (op2
.undefined_p ())
1198 switch (get_bool_state (r
, lhs
, type
))
1201 build_lt (r
, type
, op2
);
1205 build_ge (r
, type
, op2
);
1215 operator_lt::op2_range (prange
&r
, tree type
,
1218 relation_trio
) const
1220 if (op1
.undefined_p ())
1223 switch (get_bool_state (r
, lhs
, type
))
1226 build_gt (r
, type
, op1
);
1230 build_le (r
, type
, op1
);
1240 operator_lt::op1_op2_relation (const irange
&lhs
, const prange
&,
1241 const prange
&) const
1243 if (lhs
.undefined_p ())
1244 return VREL_UNDEFINED
;
1246 // FALSE = op1 < op2 indicates GE_EXPR.
1250 // TRUE = op1 < op2 indicates LT_EXPR.
1251 if (!range_includes_zero_p (lhs
))
1253 return VREL_VARYING
;
1257 operator_le::fold_range (irange
&r
, tree type
,
1260 relation_trio rel
) const
1262 if (relop_early_resolve (r
, type
, op1
, op2
, rel
, VREL_LE
))
1265 signop sign
= TYPE_SIGN (op1
.type ());
1266 gcc_checking_assert (sign
== TYPE_SIGN (op2
.type ()));
1268 if (wi::le_p (op1
.upper_bound (), op2
.lower_bound (), sign
))
1269 r
= range_true (type
);
1270 else if (!wi::le_p (op1
.lower_bound (), op2
.upper_bound (), sign
))
1271 r
= range_false (type
);
1273 r
= range_true_and_false (type
);
1275 //update_known_bitmask (r, LE_EXPR, op1, op2);
1280 operator_le::op1_range (prange
&r
, tree type
,
1283 relation_trio
) const
1285 if (op2
.undefined_p ())
1288 switch (get_bool_state (r
, lhs
, type
))
1291 build_le (r
, type
, op2
);
1295 build_gt (r
, type
, op2
);
1305 operator_le::op2_range (prange
&r
, tree type
,
1308 relation_trio
) const
1310 if (op1
.undefined_p ())
1313 switch (get_bool_state (r
, lhs
, type
))
1316 build_ge (r
, type
, op1
);
1320 build_lt (r
, type
, op1
);
1330 operator_le::op1_op2_relation (const irange
&lhs
, const prange
&,
1331 const prange
&) const
1333 if (lhs
.undefined_p ())
1334 return VREL_UNDEFINED
;
1336 // FALSE = op1 <= op2 indicates GT_EXPR.
1340 // TRUE = op1 <= op2 indicates LE_EXPR.
1341 if (!range_includes_zero_p (lhs
))
1343 return VREL_VARYING
;
1347 operator_gt::fold_range (irange
&r
, tree type
,
1348 const prange
&op1
, const prange
&op2
,
1349 relation_trio rel
) const
1351 if (relop_early_resolve (r
, type
, op1
, op2
, rel
, VREL_GT
))
1354 signop sign
= TYPE_SIGN (op1
.type ());
1355 gcc_checking_assert (sign
== TYPE_SIGN (op2
.type ()));
1357 if (wi::gt_p (op1
.lower_bound (), op2
.upper_bound (), sign
))
1358 r
= range_true (type
);
1359 else if (!wi::gt_p (op1
.upper_bound (), op2
.lower_bound (), sign
))
1360 r
= range_false (type
);
1362 r
= range_true_and_false (type
);
1364 //update_known_bitmask (r, GT_EXPR, op1, op2);
1369 operator_gt::op1_range (prange
&r
, tree type
,
1370 const irange
&lhs
, const prange
&op2
,
1371 relation_trio
) const
1373 if (op2
.undefined_p ())
1376 switch (get_bool_state (r
, lhs
, type
))
1379 build_gt (r
, type
, op2
);
1383 build_le (r
, type
, op2
);
1393 operator_gt::op2_range (prange
&r
, tree type
,
1396 relation_trio
) const
1398 if (op1
.undefined_p ())
1401 switch (get_bool_state (r
, lhs
, type
))
1404 build_lt (r
, type
, op1
);
1408 build_ge (r
, type
, op1
);
1418 operator_gt::op1_op2_relation (const irange
&lhs
, const prange
&,
1419 const prange
&) const
1421 if (lhs
.undefined_p ())
1422 return VREL_UNDEFINED
;
1424 // FALSE = op1 > op2 indicates LE_EXPR.
1428 // TRUE = op1 > op2 indicates GT_EXPR.
1429 if (!range_includes_zero_p (lhs
))
1431 return VREL_VARYING
;
1435 operator_ge::fold_range (irange
&r
, tree type
,
1438 relation_trio rel
) const
1440 if (relop_early_resolve (r
, type
, op1
, op2
, rel
, VREL_GE
))
1443 signop sign
= TYPE_SIGN (op1
.type ());
1444 gcc_checking_assert (sign
== TYPE_SIGN (op2
.type ()));
1446 if (wi::ge_p (op1
.lower_bound (), op2
.upper_bound (), sign
))
1447 r
= range_true (type
);
1448 else if (!wi::ge_p (op1
.upper_bound (), op2
.lower_bound (), sign
))
1449 r
= range_false (type
);
1451 r
= range_true_and_false (type
);
1453 //update_known_bitmask (r, GE_EXPR, op1, op2);
1458 operator_ge::op1_range (prange
&r
, tree type
,
1461 relation_trio
) const
1463 if (op2
.undefined_p ())
1466 switch (get_bool_state (r
, lhs
, type
))
1469 build_ge (r
, type
, op2
);
1473 build_lt (r
, type
, op2
);
1483 operator_ge::op2_range (prange
&r
, tree type
,
1486 relation_trio
) const
1488 if (op1
.undefined_p ())
1491 switch (get_bool_state (r
, lhs
, type
))
1494 build_le (r
, type
, op1
);
1498 build_gt (r
, type
, op1
);
1508 operator_ge::op1_op2_relation (const irange
&lhs
, const prange
&,
1509 const prange
&) const
1511 if (lhs
.undefined_p ())
1512 return VREL_UNDEFINED
;
1514 // FALSE = op1 >= op2 indicates LT_EXPR.
1518 // TRUE = op1 >= op2 indicates GE_EXPR.
1519 if (!range_includes_zero_p (lhs
))
1521 return VREL_VARYING
;
1524 // Initialize any pointer operators to the primary table
1527 range_op_table::initialize_pointer_ops ()
1529 set (POINTER_PLUS_EXPR
, op_pointer_plus
);
1530 set (POINTER_DIFF_EXPR
, op_pointer_diff
);