ada: Fix wrong resolution for hidden discriminant in predicate
[official-gcc.git] / gcc / gimple-range-op.cc
blob72c7b866f90d78b3639e6d80a534838fb8f7a331
1 /* Code for GIMPLE range op related routines.
2 Copyright (C) 2019-2023 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)
11 any later version.
13 GCC is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "backend.h"
26 #include "insn-codes.h"
27 #include "tree.h"
28 #include "gimple.h"
29 #include "ssa.h"
30 #include "gimple-pretty-print.h"
31 #include "optabs-tree.h"
32 #include "gimple-iterator.h"
33 #include "gimple-fold.h"
34 #include "wide-int.h"
35 #include "fold-const.h"
36 #include "case-cfn-macros.h"
37 #include "omp-general.h"
38 #include "cfgloop.h"
39 #include "tree-ssa-loop.h"
40 #include "tree-scalar-evolution.h"
41 #include "langhooks.h"
42 #include "vr-values.h"
43 #include "range.h"
44 #include "value-query.h"
45 #include "gimple-range.h"
46 #include "attr-fnspec.h"
47 #include "realmpfr.h"
49 // Given stmt S, fill VEC, up to VEC_SIZE elements, with relevant ssa-names
50 // on the statement. For efficiency, it is an error to not pass in enough
51 // elements for the vector. Return the number of ssa-names.
53 unsigned
54 gimple_range_ssa_names (tree *vec, unsigned vec_size, gimple *stmt)
56 tree ssa;
57 int count = 0;
59 gimple_range_op_handler handler (stmt);
60 if (handler)
62 gcc_checking_assert (vec_size >= 2);
63 if ((ssa = gimple_range_ssa_p (handler.operand1 ())))
64 vec[count++] = ssa;
65 if ((ssa = gimple_range_ssa_p (handler.operand2 ())))
66 vec[count++] = ssa;
68 else if (is_a<gassign *> (stmt)
69 && gimple_assign_rhs_code (stmt) == COND_EXPR)
71 gcc_checking_assert (vec_size >= 3);
72 gassign *st = as_a<gassign *> (stmt);
73 if ((ssa = gimple_range_ssa_p (gimple_assign_rhs1 (st))))
74 vec[count++] = ssa;
75 if ((ssa = gimple_range_ssa_p (gimple_assign_rhs2 (st))))
76 vec[count++] = ssa;
77 if ((ssa = gimple_range_ssa_p (gimple_assign_rhs3 (st))))
78 vec[count++] = ssa;
80 return count;
83 // Return the base of the RHS of an assignment.
85 static tree
86 gimple_range_base_of_assignment (const gimple *stmt)
88 gcc_checking_assert (gimple_code (stmt) == GIMPLE_ASSIGN);
89 tree op1 = gimple_assign_rhs1 (stmt);
90 if (gimple_assign_rhs_code (stmt) == ADDR_EXPR)
91 return get_base_address (TREE_OPERAND (op1, 0));
92 return op1;
95 // If statement is supported by range-ops, set the CODE and return the TYPE.
97 static inline enum tree_code
98 get_code (gimple *s)
100 if (const gassign *ass = dyn_cast<const gassign *> (s))
101 return gimple_assign_rhs_code (ass);
102 if (const gcond *cond = dyn_cast<const gcond *> (s))
103 return gimple_cond_code (cond);
104 return ERROR_MARK;
107 // If statement S has a supported range_op handler return TRUE.
109 bool
110 gimple_range_op_handler::supported_p (gimple *s)
112 enum tree_code code = get_code (s);
113 if (range_op_handler (code))
114 return true;
115 if (is_a <gcall *> (s) && gimple_range_op_handler (s))
116 return true;
117 return false;
120 // Construct a handler object for statement S.
122 gimple_range_op_handler::gimple_range_op_handler (gimple *s)
124 range_op_handler oper (get_code (s));
125 m_stmt = s;
126 m_op1 = NULL_TREE;
127 m_op2 = NULL_TREE;
129 if (oper)
130 switch (gimple_code (m_stmt))
132 case GIMPLE_COND:
133 m_op1 = gimple_cond_lhs (m_stmt);
134 m_op2 = gimple_cond_rhs (m_stmt);
135 // Check that operands are supported types. One check is enough.
136 if (Value_Range::supports_type_p (TREE_TYPE (m_op1)))
137 m_operator = oper.range_op ();
138 gcc_checking_assert (m_operator);
139 return;
140 case GIMPLE_ASSIGN:
141 m_op1 = gimple_range_base_of_assignment (m_stmt);
142 if (m_op1 && TREE_CODE (m_op1) == MEM_REF)
144 // If the base address is an SSA_NAME, we return it
145 // here. This allows processing of the range of that
146 // name, while the rest of the expression is simply
147 // ignored. The code in range_ops will see the
148 // ADDR_EXPR and do the right thing.
149 tree ssa = TREE_OPERAND (m_op1, 0);
150 if (TREE_CODE (ssa) == SSA_NAME)
151 m_op1 = ssa;
153 if (gimple_num_ops (m_stmt) >= 3)
154 m_op2 = gimple_assign_rhs2 (m_stmt);
155 // Check that operands are supported types. One check is enough.
156 if ((m_op1 && !Value_Range::supports_type_p (TREE_TYPE (m_op1))))
157 return;
158 m_operator = oper.range_op ();
159 gcc_checking_assert (m_operator);
160 return;
161 default:
162 gcc_unreachable ();
163 return;
165 // If no range-op table entry handled this stmt, check for other supported
166 // statements.
167 if (is_a <gcall *> (m_stmt))
168 maybe_builtin_call ();
169 else
170 maybe_non_standard ();
171 gcc_checking_assert (m_operator);
174 // Calculate what we can determine of the range of this unary
175 // statement's operand if the lhs of the expression has the range
176 // LHS_RANGE. Return false if nothing can be determined.
178 bool
179 gimple_range_op_handler::calc_op1 (vrange &r, const vrange &lhs_range)
181 gcc_checking_assert (gimple_num_ops (m_stmt) < 3);
182 // Give up on empty ranges.
183 if (lhs_range.undefined_p ())
184 return false;
186 // Unary operations require the type of the first operand in the
187 // second range position.
188 tree type = TREE_TYPE (operand1 ());
189 Value_Range type_range (type);
190 type_range.set_varying (type);
191 return op1_range (r, type, lhs_range, type_range);
194 // Calculate what we can determine of the range of this statement's
195 // first operand if the lhs of the expression has the range LHS_RANGE
196 // and the second operand has the range OP2_RANGE. Return false if
197 // nothing can be determined.
199 bool
200 gimple_range_op_handler::calc_op1 (vrange &r, const vrange &lhs_range,
201 const vrange &op2_range, relation_trio k)
203 // Give up on empty ranges.
204 if (lhs_range.undefined_p ())
205 return false;
207 // Unary operation are allowed to pass a range in for second operand
208 // as there are often additional restrictions beyond the type which
209 // can be imposed. See operator_cast::op1_range().
210 tree type = TREE_TYPE (operand1 ());
211 // If op2 is undefined, solve as if it is varying.
212 if (op2_range.undefined_p ())
214 if (gimple_num_ops (m_stmt) < 3)
215 return false;
216 tree op2_type;
217 // This is sometimes invoked on single operand stmts.
218 if (operand2 ())
219 op2_type = TREE_TYPE (operand2 ());
220 else
221 op2_type = TREE_TYPE (operand1 ());
222 Value_Range trange (op2_type);
223 trange.set_varying (op2_type);
224 return op1_range (r, type, lhs_range, trange, k);
226 return op1_range (r, type, lhs_range, op2_range, k);
229 // Calculate what we can determine of the range of this statement's
230 // second operand if the lhs of the expression has the range LHS_RANGE
231 // and the first operand has the range OP1_RANGE. Return false if
232 // nothing can be determined.
234 bool
235 gimple_range_op_handler::calc_op2 (vrange &r, const vrange &lhs_range,
236 const vrange &op1_range, relation_trio k)
238 // Give up on empty ranges.
239 if (lhs_range.undefined_p ())
240 return false;
242 tree type = TREE_TYPE (operand2 ());
243 // If op1 is undefined, solve as if it is varying.
244 if (op1_range.undefined_p ())
246 tree op1_type = TREE_TYPE (operand1 ());
247 Value_Range trange (op1_type);
248 trange.set_varying (op1_type);
249 return op2_range (r, type, lhs_range, trange, k);
251 return op2_range (r, type, lhs_range, op1_range, k);
254 // --------------------------------------------------------------------
256 // Implement range operator for float CFN_BUILT_IN_CONSTANT_P.
257 class cfn_constant_float_p : public range_operator
259 public:
260 using range_operator::fold_range;
261 virtual bool fold_range (irange &r, tree type, const frange &lh,
262 const irange &, relation_trio) const
264 if (lh.singleton_p ())
266 wide_int one = wi::one (TYPE_PRECISION (type));
267 r.set (type, one, one);
268 return true;
270 if (cfun->after_inlining)
272 r.set_zero (type);
273 return true;
275 return false;
277 } op_cfn_constant_float_p;
279 // Implement range operator for integral CFN_BUILT_IN_CONSTANT_P.
280 class cfn_constant_p : public range_operator
282 public:
283 using range_operator::fold_range;
284 virtual bool fold_range (irange &r, tree type, const irange &lh,
285 const irange &, relation_trio) const
287 if (lh.singleton_p ())
289 wide_int one = wi::one (TYPE_PRECISION (type));
290 r.set (type, one, one);
291 return true;
293 if (cfun->after_inlining)
295 r.set_zero (type);
296 return true;
298 return false;
300 } op_cfn_constant_p;
302 // Implement range operator for integral/pointer functions returning
303 // the first argument.
304 class cfn_pass_through_arg1 : public range_operator
306 public:
307 using range_operator::fold_range;
308 using range_operator::op1_range;
309 virtual bool fold_range (irange &r, tree, const irange &lh,
310 const irange &, relation_trio) const
312 r = lh;
313 return true;
315 virtual bool op1_range (irange &r, tree, const irange &lhs,
316 const irange &, relation_trio) const
318 r = lhs;
319 return true;
321 } op_cfn_pass_through_arg1;
323 // Implement range operator for CFN_BUILT_IN_SIGNBIT.
324 class cfn_signbit : public range_operator
326 public:
327 using range_operator::fold_range;
328 using range_operator::op1_range;
329 virtual bool fold_range (irange &r, tree type, const frange &lh,
330 const irange &, relation_trio) const override
332 bool signbit;
333 if (lh.signbit_p (signbit))
335 if (signbit)
336 r.set_nonzero (type);
337 else
338 r.set_zero (type);
339 return true;
341 return false;
343 virtual bool op1_range (frange &r, tree type, const irange &lhs,
344 const frange &, relation_trio) const override
346 if (lhs.zero_p ())
348 r.set (type, dconst0, frange_val_max (type));
349 r.update_nan (false);
350 return true;
352 if (!lhs.contains_p (wi::zero (TYPE_PRECISION (lhs.type ()))))
354 r.set (type, frange_val_min (type), dconstm0);
355 r.update_nan (true);
356 return true;
358 return false;
360 } op_cfn_signbit;
362 // Implement range operator for CFN_BUILT_IN_COPYSIGN
363 class cfn_copysign : public range_operator
365 public:
366 using range_operator::fold_range;
367 virtual bool fold_range (frange &r, tree type, const frange &lh,
368 const frange &rh, relation_trio) const override
370 frange neg;
371 if (!range_op_handler (ABS_EXPR).fold_range (r, type, lh, frange (type)))
372 return false;
373 if (!range_op_handler (NEGATE_EXPR).fold_range (neg, type, r,
374 frange (type)))
375 return false;
377 bool signbit;
378 if (rh.signbit_p (signbit))
380 // If the sign is negative, flip the result from ABS,
381 // otherwise leave things positive.
382 if (signbit)
383 r = neg;
385 else
386 // If the sign is unknown, keep the positive and negative
387 // alternatives.
388 r.union_ (neg);
389 return true;
391 } op_cfn_copysign;
393 /* Compute FUNC (ARG) where FUNC is a mpfr function. If RES_LOW is non-NULL,
394 set it to low bound of possible range if the function is expected to have
395 ULPS precision and similarly if RES_HIGH is non-NULL, set it to high bound.
396 If the function returns false, the results weren't set. */
398 static bool
399 frange_mpfr_arg1 (REAL_VALUE_TYPE *res_low, REAL_VALUE_TYPE *res_high,
400 int (*func) (mpfr_ptr, mpfr_srcptr, mpfr_rnd_t),
401 const REAL_VALUE_TYPE &arg, tree type, unsigned ulps)
403 if (ulps == ~0U || !real_isfinite (&arg))
404 return false;
405 machine_mode mode = TYPE_MODE (type);
406 const real_format *format = REAL_MODE_FORMAT (mode);
407 auto_mpfr m (format->p);
408 mpfr_from_real (m, &arg, MPFR_RNDN);
409 mpfr_clear_flags ();
410 bool inexact = func (m, m, MPFR_RNDN);
411 if (!mpfr_number_p (m) || mpfr_overflow_p () || mpfr_underflow_p ())
412 return false;
414 REAL_VALUE_TYPE value, result;
415 real_from_mpfr (&value, m, format, MPFR_RNDN);
416 if (!real_isfinite (&value))
417 return false;
418 if ((value.cl == rvc_zero) != (mpfr_zero_p (m) != 0))
419 inexact = true;
421 real_convert (&result, format, &value);
422 if (!real_isfinite (&result))
423 return false;
424 bool round_low = false;
425 bool round_high = false;
426 if (!ulps && flag_rounding_math)
427 ++ulps;
428 if (inexact || !real_identical (&result, &value))
430 if (MODE_COMPOSITE_P (mode))
431 round_low = round_high = true;
432 else
434 round_low = !real_less (&result, &value);
435 round_high = !real_less (&value, &result);
438 if (res_low)
440 *res_low = result;
441 for (unsigned int i = 0; i < ulps + round_low; ++i)
442 frange_nextafter (mode, *res_low, dconstninf);
444 if (res_high)
446 *res_high = result;
447 for (unsigned int i = 0; i < ulps + round_high; ++i)
448 frange_nextafter (mode, *res_high, dconstinf);
450 return true;
453 class cfn_sqrt : public range_operator
455 public:
456 using range_operator::fold_range;
457 using range_operator::op1_range;
458 virtual bool fold_range (frange &r, tree type,
459 const frange &lh, const frange &,
460 relation_trio) const final override
462 if (lh.undefined_p ())
463 return false;
464 if (lh.known_isnan () || real_less (&lh.upper_bound (), &dconstm0))
466 r.set_nan (type);
467 return true;
469 unsigned bulps
470 = targetm.libm_function_max_error (CFN_SQRT, TYPE_MODE (type), true);
471 if (bulps == ~0U)
472 r.set_varying (type);
473 else if (bulps == 0)
474 r.set (type, dconstm0, dconstinf);
475 else
477 REAL_VALUE_TYPE boundmin = dconstm0;
478 while (bulps--)
479 frange_nextafter (TYPE_MODE (type), boundmin, dconstninf);
480 r.set (type, boundmin, dconstinf);
482 if (!lh.maybe_isnan () && !real_less (&lh.lower_bound (), &dconst0))
483 r.clear_nan ();
485 unsigned ulps
486 = targetm.libm_function_max_error (CFN_SQRT, TYPE_MODE (type), false);
487 if (ulps == ~0U)
488 return true;
489 REAL_VALUE_TYPE lb = lh.lower_bound ();
490 REAL_VALUE_TYPE ub = lh.upper_bound ();
491 if (!frange_mpfr_arg1 (&lb, NULL, mpfr_sqrt, lb, type, ulps))
492 lb = dconstninf;
493 if (!frange_mpfr_arg1 (NULL, &ub, mpfr_sqrt, ub, type, ulps))
494 ub = dconstinf;
495 frange r2;
496 r2.set (type, lb, ub);
497 r2.flush_denormals_to_zero ();
498 r.intersect (r2);
499 return true;
501 virtual bool op1_range (frange &r, tree type,
502 const frange &lhs, const frange &,
503 relation_trio) const final override
505 if (lhs.undefined_p ())
506 return false;
508 // A known NAN means the input is [-INF,-0.) U +-NAN.
509 if (lhs.known_isnan ())
511 known_nan:
512 REAL_VALUE_TYPE ub = dconstm0;
513 frange_nextafter (TYPE_MODE (type), ub, dconstninf);
514 r.set (type, dconstninf, ub);
515 // No r.flush_denormals_to_zero (); here - it is a reverse op.
516 return true;
519 // Results outside of [-0.0, +Inf] are impossible.
520 unsigned bulps
521 = targetm.libm_function_max_error (CFN_SQRT, TYPE_MODE (type), true);
522 if (bulps != ~0U)
524 const REAL_VALUE_TYPE &ub = lhs.upper_bound ();
525 REAL_VALUE_TYPE m0 = dconstm0;
526 while (bulps--)
527 frange_nextafter (TYPE_MODE (type), m0, dconstninf);
528 if (real_less (&ub, &m0))
530 if (!lhs.maybe_isnan ())
531 r.set_undefined ();
532 else
533 // If lhs could be NAN and finite result is impossible,
534 // the range is like lhs.known_isnan () above.
535 goto known_nan;
536 return true;
540 if (!lhs.maybe_isnan ())
541 // If NAN is not valid result, the input cannot include either
542 // a NAN nor values smaller than -0.
543 r.set (type, dconstm0, dconstinf, nan_state (false, false));
544 else
545 r.set_varying (type);
547 unsigned ulps
548 = targetm.libm_function_max_error (CFN_SQRT, TYPE_MODE (type), false);
549 if (ulps == ~0U)
550 return true;
551 REAL_VALUE_TYPE lb = lhs.lower_bound ();
552 REAL_VALUE_TYPE ub = lhs.upper_bound ();
553 if (!lhs.maybe_isnan () && real_less (&dconst0, &lb))
555 for (unsigned i = 0; i < ulps; ++i)
556 frange_nextafter (TYPE_MODE (type), lb, dconstninf);
557 if (real_less (&dconst0, &lb))
559 REAL_VALUE_TYPE op = lb;
560 frange_arithmetic (MULT_EXPR, type, lb, op, op, dconstninf);
562 else
563 lb = dconstninf;
565 else
566 lb = dconstninf;
567 if (real_isfinite (&ub) && real_less (&dconst0, &ub))
569 for (unsigned i = 0; i < ulps; ++i)
570 frange_nextafter (TYPE_MODE (type), ub, dconstinf);
571 if (real_isfinite (&ub))
573 REAL_VALUE_TYPE op = ub;
574 frange_arithmetic (MULT_EXPR, type, ub, op, op, dconstinf);
576 else
577 ub = dconstinf;
579 else
580 ub = dconstinf;
581 frange r2;
582 r2.set (type, lb, ub);
583 r.intersect (r2);
584 return true;
586 } op_cfn_sqrt;
588 class cfn_sincos : public range_operator
590 public:
591 using range_operator::fold_range;
592 using range_operator::op1_range;
593 cfn_sincos (combined_fn cfn) { m_cfn = cfn; }
594 virtual bool fold_range (frange &r, tree type,
595 const frange &lh, const frange &,
596 relation_trio) const final override
598 if (lh.undefined_p ())
599 return false;
600 if (lh.known_isnan () || lh.known_isinf ())
602 r.set_nan (type);
603 return true;
605 unsigned bulps = targetm.libm_function_max_error (m_cfn, TYPE_MODE (type),
606 true);
607 if (bulps == ~0U)
608 r.set_varying (type);
609 else if (bulps == 0)
610 r.set (type, dconstm1, dconst1);
611 else
613 REAL_VALUE_TYPE boundmin, boundmax;
614 boundmax = dconst1;
615 while (bulps--)
616 frange_nextafter (TYPE_MODE (type), boundmax, dconstinf);
617 real_arithmetic (&boundmin, NEGATE_EXPR, &boundmax, NULL);
618 r.set (type, boundmin, boundmax);
620 if (!lh.maybe_isnan () && !lh.maybe_isinf ())
621 r.clear_nan ();
623 unsigned ulps
624 = targetm.libm_function_max_error (m_cfn, TYPE_MODE (type), false);
625 if (ulps == ~0U)
626 return true;
627 REAL_VALUE_TYPE lb = lh.lower_bound ();
628 REAL_VALUE_TYPE ub = lh.upper_bound ();
629 REAL_VALUE_TYPE diff;
630 real_arithmetic (&diff, MINUS_EXPR, &ub, &lb);
631 if (!real_isfinite (&diff))
632 return true;
633 REAL_VALUE_TYPE pi = dconst_pi ();
634 REAL_VALUE_TYPE pix2;
635 real_arithmetic (&pix2, PLUS_EXPR, &pi, &pi);
636 // We can only try to narrow the range further if ub-lb < 2*pi.
637 if (!real_less (&diff, &pix2))
638 return true;
639 REAL_VALUE_TYPE lb_lo, lb_hi, ub_lo, ub_hi;
640 REAL_VALUE_TYPE lb_deriv_lo, lb_deriv_hi, ub_deriv_lo, ub_deriv_hi;
641 if (!frange_mpfr_arg1 (&lb_lo, &lb_hi,
642 m_cfn == CFN_SIN ? mpfr_sin : mpfr_cos, lb,
643 type, ulps)
644 || !frange_mpfr_arg1 (&ub_lo, &ub_hi,
645 m_cfn == CFN_SIN ? mpfr_sin : mpfr_cos, ub,
646 type, ulps)
647 || !frange_mpfr_arg1 (&lb_deriv_lo, &lb_deriv_hi,
648 m_cfn == CFN_SIN ? mpfr_cos : mpfr_sin, lb,
649 type, 0)
650 || !frange_mpfr_arg1 (&ub_deriv_lo, &ub_deriv_hi,
651 m_cfn == CFN_SIN ? mpfr_cos : mpfr_sin, ub,
652 type, 0))
653 return true;
654 if (m_cfn == CFN_COS)
656 // Derivative of cos is -sin, so negate.
657 lb_deriv_lo.sign ^= 1;
658 lb_deriv_hi.sign ^= 1;
659 ub_deriv_lo.sign ^= 1;
660 ub_deriv_hi.sign ^= 1;
663 if (real_less (&lb_lo, &ub_lo))
664 lb = lb_lo;
665 else
666 lb = ub_lo;
667 if (real_less (&lb_hi, &ub_hi))
668 ub = ub_hi;
669 else
670 ub = lb_hi;
672 // The range between the function result on the boundaries may need
673 // to be extended to +1 (+Inf) or -1 (-Inf) or both depending on the
674 // derivative or length of the argument range (diff).
676 // First handle special case, where the derivative has different signs,
677 // so the bound must be roughly -1 or +1.
678 if (real_isneg (&lb_deriv_lo) != real_isneg (&lb_deriv_hi))
680 if (real_isneg (&lb_lo))
681 lb = dconstninf;
682 else
683 ub = dconstinf;
685 if (real_isneg (&ub_deriv_lo) != real_isneg (&ub_deriv_hi))
687 if (real_isneg (&ub_lo))
688 lb = dconstninf;
689 else
690 ub = dconstinf;
693 // If derivative at lower_bound and upper_bound have the same sign,
694 // the function grows or declines on the whole range if diff < pi, so
695 // [lb, ub] is correct, and if diff >= pi the result range must include
696 // both the minimum and maximum.
697 if (real_isneg (&lb_deriv_lo) == real_isneg (&ub_deriv_lo))
699 if (!real_less (&diff, &pi))
700 return true;
702 // If function declines at lower_bound and grows at upper_bound,
703 // the result range must include the minimum, so set lb to -Inf.
704 else if (real_isneg (&lb_deriv_lo))
705 lb = dconstninf;
706 // If function grows at lower_bound and declines at upper_bound,
707 // the result range must include the maximum, so set ub to +Inf.
708 else
709 ub = dconstinf;
710 frange r2;
711 r2.set (type, lb, ub);
712 r2.flush_denormals_to_zero ();
713 r.intersect (r2);
714 return true;
716 virtual bool op1_range (frange &r, tree type,
717 const frange &lhs, const frange &,
718 relation_trio) const final override
720 if (lhs.undefined_p ())
721 return false;
723 // A known NAN means the input is [-INF,-INF][+INF,+INF] U +-NAN,
724 // which we can't currently represent.
725 if (lhs.known_isnan ())
727 r.set_varying (type);
728 return true;
731 // Results outside of [-1.0, +1.0] are impossible.
732 unsigned bulps
733 = targetm.libm_function_max_error (m_cfn, TYPE_MODE (type), true);
734 if (bulps != ~0U)
736 const REAL_VALUE_TYPE &lb = lhs.lower_bound ();
737 const REAL_VALUE_TYPE &ub = lhs.upper_bound ();
738 REAL_VALUE_TYPE m1 = dconstm1;
739 REAL_VALUE_TYPE p1 = dconst1;
740 while (bulps--)
742 frange_nextafter (TYPE_MODE (type), m1, dconstninf);
743 frange_nextafter (TYPE_MODE (type), p1, dconstinf);
745 if (real_less (&ub, &m1) || real_less (&p1, &lb))
747 if (!lhs.maybe_isnan ())
748 r.set_undefined ();
749 else
750 /* If lhs could be NAN and finite result is impossible,
751 the range is like lhs.known_isnan () above,
752 [-INF,-INF][+INF,+INF] U +-NAN. */
753 r.set_varying (type);
754 return true;
758 if (!lhs.maybe_isnan ())
760 // If NAN is not valid result, the input cannot include either
761 // a NAN nor a +-INF.
762 REAL_VALUE_TYPE lb = real_min_representable (type);
763 REAL_VALUE_TYPE ub = real_max_representable (type);
764 r.set (type, lb, ub, nan_state (false, false));
766 else
767 r.set_varying (type);
768 return true;
770 private:
771 combined_fn m_cfn;
772 } op_cfn_sin (CFN_SIN), op_cfn_cos (CFN_COS);
774 // Implement range operator for CFN_BUILT_IN_TOUPPER and CFN_BUILT_IN_TOLOWER.
775 class cfn_toupper_tolower : public range_operator
777 public:
778 using range_operator::fold_range;
779 cfn_toupper_tolower (bool toupper) { m_toupper = toupper; }
780 virtual bool fold_range (irange &r, tree type, const irange &lh,
781 const irange &, relation_trio) const;
782 private:
783 bool get_letter_range (tree type, irange &lowers, irange &uppers) const;
784 bool m_toupper;
785 } op_cfn_toupper (true), op_cfn_tolower (false);
787 // Return TRUE if we recognize the target character set and return the
788 // range for lower case and upper case letters.
790 bool
791 cfn_toupper_tolower::get_letter_range (tree type, irange &lowers,
792 irange &uppers) const
794 // ASCII
795 int a = lang_hooks.to_target_charset ('a');
796 int z = lang_hooks.to_target_charset ('z');
797 int A = lang_hooks.to_target_charset ('A');
798 int Z = lang_hooks.to_target_charset ('Z');
800 if ((z - a == 25) && (Z - A == 25))
802 lowers = int_range<2> (type,
803 wi::shwi (a, TYPE_PRECISION (type)),
804 wi::shwi (z, TYPE_PRECISION (type)));
805 uppers = int_range<2> (type,
806 wi::shwi (A, TYPE_PRECISION (type)),
807 wi::shwi (Z, TYPE_PRECISION (type)));
808 return true;
810 // Unknown character set.
811 return false;
814 bool
815 cfn_toupper_tolower::fold_range (irange &r, tree type, const irange &lh,
816 const irange &, relation_trio) const
818 int_range<3> lowers;
819 int_range<3> uppers;
820 if (!get_letter_range (type, lowers, uppers))
821 return false;
823 r = lh;
824 if (m_toupper)
826 // Return the range passed in without any lower case characters,
827 // but including all the upper case ones.
828 lowers.invert ();
829 r.intersect (lowers);
830 r.union_ (uppers);
832 else
834 // Return the range passed in without any lower case characters,
835 // but including all the upper case ones.
836 uppers.invert ();
837 r.intersect (uppers);
838 r.union_ (lowers);
840 return true;
843 // Implement range operator for CFN_BUILT_IN_FFS.
844 class cfn_ffs : public range_operator
846 public:
847 using range_operator::fold_range;
848 virtual bool fold_range (irange &r, tree type, const irange &lh,
849 const irange &, relation_trio) const
851 if (lh.undefined_p ())
852 return false;
853 // __builtin_ffs* and __builtin_popcount* return [0, prec].
854 int prec = TYPE_PRECISION (lh.type ());
855 // If arg is non-zero, then ffs or popcount are non-zero.
856 int mini = range_includes_zero_p (&lh) ? 0 : 1;
857 int maxi = prec;
859 // If some high bits are known to be zero, decrease the maximum.
860 int_range_max tmp = lh;
861 if (TYPE_SIGN (tmp.type ()) == SIGNED)
862 range_cast (tmp, unsigned_type_for (tmp.type ()));
863 wide_int max = tmp.upper_bound ();
864 maxi = wi::floor_log2 (max) + 1;
865 r.set (type,
866 wi::shwi (mini, TYPE_PRECISION (type)),
867 wi::shwi (maxi, TYPE_PRECISION (type)));
868 return true;
870 } op_cfn_ffs;
872 // Implement range operator for CFN_BUILT_IN_POPCOUNT.
873 class cfn_popcount : public cfn_ffs
875 public:
876 using range_operator::fold_range;
877 virtual bool fold_range (irange &r, tree type, const irange &lh,
878 const irange &rh, relation_trio rel) const
880 if (lh.undefined_p ())
881 return false;
882 unsigned prec = TYPE_PRECISION (type);
883 wide_int nz = lh.get_nonzero_bits ();
884 wide_int pop = wi::shwi (wi::popcount (nz), prec);
885 // Calculating the popcount of a singleton is trivial.
886 if (lh.singleton_p ())
888 r.set (type, pop, pop);
889 return true;
891 if (cfn_ffs::fold_range (r, type, lh, rh, rel))
893 int_range<2> tmp (type, wi::zero (prec), pop);
894 r.intersect (tmp);
895 return true;
897 return false;
899 } op_cfn_popcount;
901 // Implement range operator for CFN_BUILT_IN_CLZ
902 class cfn_clz : public range_operator
904 public:
905 cfn_clz (bool internal) { m_gimple_call_internal_p = internal; }
906 using range_operator::fold_range;
907 virtual bool fold_range (irange &r, tree type, const irange &lh,
908 const irange &, relation_trio) const;
909 private:
910 bool m_gimple_call_internal_p;
911 } op_cfn_clz (false), op_cfn_clz_internal (true);
913 bool
914 cfn_clz::fold_range (irange &r, tree type, const irange &lh,
915 const irange &, relation_trio) const
917 // __builtin_c[lt]z* return [0, prec-1], except when the
918 // argument is 0, but that is undefined behavior.
920 // For __builtin_c[lt]z* consider argument of 0 always undefined
921 // behavior, for internal fns depending on C?Z_DEFINED_VALUE_AT_ZERO.
922 if (lh.undefined_p ())
923 return false;
924 int prec = TYPE_PRECISION (lh.type ());
925 int mini = 0;
926 int maxi = prec - 1;
927 int zerov = 0;
928 scalar_int_mode mode = SCALAR_INT_TYPE_MODE (lh.type ());
929 if (m_gimple_call_internal_p)
931 if (optab_handler (clz_optab, mode) != CODE_FOR_nothing
932 && CLZ_DEFINED_VALUE_AT_ZERO (mode, zerov) == 2)
934 // Only handle the single common value.
935 if (zerov == prec)
936 maxi = prec;
937 else
938 // Magic value to give up, unless we can prove arg is non-zero.
939 mini = -2;
943 // From clz of minimum we can compute result maximum.
944 if (wi::gt_p (lh.lower_bound (), 0, TYPE_SIGN (lh.type ())))
946 maxi = prec - 1 - wi::floor_log2 (lh.lower_bound ());
947 if (mini == -2)
948 mini = 0;
950 else if (!range_includes_zero_p (&lh))
952 mini = 0;
953 maxi = prec - 1;
955 if (mini == -2)
956 return false;
957 // From clz of maximum we can compute result minimum.
958 wide_int max = lh.upper_bound ();
959 int newmini = prec - 1 - wi::floor_log2 (max);
960 if (max == 0)
962 // If CLZ_DEFINED_VALUE_AT_ZERO is 2 with VALUE of prec,
963 // return [prec, prec], otherwise ignore the range.
964 if (maxi == prec)
965 mini = prec;
967 else
968 mini = newmini;
970 if (mini == -2)
971 return false;
972 r.set (type,
973 wi::shwi (mini, TYPE_PRECISION (type)),
974 wi::shwi (maxi, TYPE_PRECISION (type)));
975 return true;
978 // Implement range operator for CFN_BUILT_IN_CTZ
979 class cfn_ctz : public range_operator
981 public:
982 cfn_ctz (bool internal) { m_gimple_call_internal_p = internal; }
983 using range_operator::fold_range;
984 virtual bool fold_range (irange &r, tree type, const irange &lh,
985 const irange &, relation_trio) const;
986 private:
987 bool m_gimple_call_internal_p;
988 } op_cfn_ctz (false), op_cfn_ctz_internal (true);
990 bool
991 cfn_ctz::fold_range (irange &r, tree type, const irange &lh,
992 const irange &, relation_trio) const
994 if (lh.undefined_p ())
995 return false;
996 int prec = TYPE_PRECISION (lh.type ());
997 int mini = 0;
998 int maxi = prec - 1;
999 int zerov = 0;
1000 scalar_int_mode mode = SCALAR_INT_TYPE_MODE (lh.type ());
1002 if (m_gimple_call_internal_p)
1004 if (optab_handler (ctz_optab, mode) != CODE_FOR_nothing
1005 && CTZ_DEFINED_VALUE_AT_ZERO (mode, zerov) == 2)
1007 // Handle only the two common values.
1008 if (zerov == -1)
1009 mini = -1;
1010 else if (zerov == prec)
1011 maxi = prec;
1012 else
1013 // Magic value to give up, unless we can prove arg is non-zero.
1014 mini = -2;
1017 // If arg is non-zero, then use [0, prec - 1].
1018 if (!range_includes_zero_p (&lh))
1020 mini = 0;
1021 maxi = prec - 1;
1023 // If some high bits are known to be zero, we can decrease
1024 // the maximum.
1025 wide_int max = lh.upper_bound ();
1026 if (max == 0)
1028 // Argument is [0, 0]. If CTZ_DEFINED_VALUE_AT_ZERO
1029 // is 2 with value -1 or prec, return [-1, -1] or [prec, prec].
1030 // Otherwise ignore the range.
1031 if (mini == -1)
1032 maxi = -1;
1033 else if (maxi == prec)
1034 mini = prec;
1036 // If value at zero is prec and 0 is in the range, we can't lower
1037 // the upper bound. We could create two separate ranges though,
1038 // [0,floor_log2(max)][prec,prec] though.
1039 else if (maxi != prec)
1040 maxi = wi::floor_log2 (max);
1042 if (mini == -2)
1043 return false;
1044 r.set (type,
1045 wi::shwi (mini, TYPE_PRECISION (type)),
1046 wi::shwi (maxi, TYPE_PRECISION (type)));
1047 return true;
1051 // Implement range operator for CFN_BUILT_IN_
1052 class cfn_clrsb : public range_operator
1054 public:
1055 using range_operator::fold_range;
1056 virtual bool fold_range (irange &r, tree type, const irange &lh,
1057 const irange &, relation_trio) const
1059 if (lh.undefined_p ())
1060 return false;
1061 int prec = TYPE_PRECISION (lh.type ());
1062 r.set (type,
1063 wi::zero (TYPE_PRECISION (type)),
1064 wi::shwi (prec - 1, TYPE_PRECISION (type)));
1065 return true;
1067 } op_cfn_clrsb;
1070 // Implement range operator for CFN_BUILT_IN_
1071 class cfn_ubsan : public range_operator
1073 public:
1074 cfn_ubsan (enum tree_code code) { m_code = code; }
1075 using range_operator::fold_range;
1076 virtual bool fold_range (irange &r, tree type, const irange &lh,
1077 const irange &rh, relation_trio rel) const
1079 bool saved_flag_wrapv = flag_wrapv;
1080 // Pretend the arithmetic is wrapping. If there is any overflow,
1081 // we'll complain, but will actually do wrapping operation.
1082 flag_wrapv = 1;
1083 bool result = range_op_handler (m_code).fold_range (r, type, lh, rh, rel);
1084 flag_wrapv = saved_flag_wrapv;
1086 // If for both arguments vrp_valueize returned non-NULL, this should
1087 // have been already folded and if not, it wasn't folded because of
1088 // overflow. Avoid removing the UBSAN_CHECK_* calls in that case.
1089 if (result && r.singleton_p ())
1090 r.set_varying (type);
1091 return result;
1093 private:
1094 enum tree_code m_code;
1097 cfn_ubsan op_cfn_ubsan_add (PLUS_EXPR);
1098 cfn_ubsan op_cfn_ubsan_sub (MINUS_EXPR);
1099 cfn_ubsan op_cfn_ubsan_mul (MULT_EXPR);
1102 // Implement range operator for CFN_BUILT_IN_STRLEN
1103 class cfn_strlen : public range_operator
1105 public:
1106 using range_operator::fold_range;
1107 virtual bool fold_range (irange &r, tree type, const irange &,
1108 const irange &, relation_trio) const
1110 wide_int max = irange_val_max (ptrdiff_type_node);
1111 // To account for the terminating NULL, the maximum length
1112 // is one less than the maximum array size, which in turn
1113 // is one less than PTRDIFF_MAX (or SIZE_MAX where it's
1114 // smaller than the former type).
1115 // FIXME: Use max_object_size() - 1 here.
1116 r.set (type, wi::zero (TYPE_PRECISION (type)), max - 2);
1117 return true;
1119 } op_cfn_strlen;
1122 // Implement range operator for CFN_BUILT_IN_GOACC_DIM
1123 class cfn_goacc_dim : public range_operator
1125 public:
1126 cfn_goacc_dim (bool is_pos) { m_is_pos = is_pos; }
1127 using range_operator::fold_range;
1128 virtual bool fold_range (irange &r, tree type, const irange &lh,
1129 const irange &, relation_trio) const
1131 tree axis_tree;
1132 if (!lh.singleton_p (&axis_tree))
1133 return false;
1134 HOST_WIDE_INT axis = TREE_INT_CST_LOW (axis_tree);
1135 int size = oacc_get_fn_dim_size (current_function_decl, axis);
1136 if (!size)
1137 // If it's dynamic, the backend might know a hardware limitation.
1138 size = targetm.goacc.dim_limit (axis);
1140 r.set (type,
1141 wi::shwi (m_is_pos ? 0 : 1, TYPE_PRECISION (type)),
1142 size
1143 ? wi::shwi (size - m_is_pos, TYPE_PRECISION (type))
1144 : irange_val_max (type));
1145 return true;
1147 private:
1148 bool m_is_pos;
1149 } op_cfn_goacc_dim_size (false), op_cfn_goacc_dim_pos (true);
1152 // Implement range operator for CFN_BUILT_IN_
1153 class cfn_parity : public range_operator
1155 public:
1156 using range_operator::fold_range;
1157 virtual bool fold_range (irange &r, tree type, const irange &,
1158 const irange &, relation_trio) const
1160 r = range_true_and_false (type);
1161 return true;
1163 } op_cfn_parity;
1165 // Set up a gimple_range_op_handler for any nonstandard function which can be
1166 // supported via range-ops.
1168 void
1169 gimple_range_op_handler::maybe_non_standard ()
1171 range_op_handler signed_op (OP_WIDEN_MULT_SIGNED);
1172 gcc_checking_assert (signed_op);
1173 range_op_handler unsigned_op (OP_WIDEN_MULT_UNSIGNED);
1174 gcc_checking_assert (unsigned_op);
1176 if (gimple_code (m_stmt) == GIMPLE_ASSIGN)
1177 switch (gimple_assign_rhs_code (m_stmt))
1179 case WIDEN_MULT_EXPR:
1181 m_op1 = gimple_assign_rhs1 (m_stmt);
1182 m_op2 = gimple_assign_rhs2 (m_stmt);
1183 tree ret = gimple_assign_lhs (m_stmt);
1184 bool signed1 = TYPE_SIGN (TREE_TYPE (m_op1)) == SIGNED;
1185 bool signed2 = TYPE_SIGN (TREE_TYPE (m_op2)) == SIGNED;
1186 bool signed_ret = TYPE_SIGN (TREE_TYPE (ret)) == SIGNED;
1188 /* Normally these operands should all have the same sign, but
1189 some passes and violate this by taking mismatched sign args. At
1190 the moment the only one that's possible is mismatch inputs and
1191 unsigned output. Once ranger supports signs for the operands we
1192 can properly fix it, for now only accept the case we can do
1193 correctly. */
1194 if ((signed1 ^ signed2) && signed_ret)
1195 return;
1197 if (signed2 && !signed1)
1198 std::swap (m_op1, m_op2);
1200 if (signed1 || signed2)
1201 m_operator = signed_op.range_op ();
1202 else
1203 m_operator = unsigned_op.range_op ();
1204 break;
1206 default:
1207 break;
1211 // Set up a gimple_range_op_handler for any built in function which can be
1212 // supported via range-ops.
1214 void
1215 gimple_range_op_handler::maybe_builtin_call ()
1217 gcc_checking_assert (is_a <gcall *> (m_stmt));
1219 gcall *call = as_a <gcall *> (m_stmt);
1220 combined_fn func = gimple_call_combined_fn (call);
1221 if (func == CFN_LAST)
1222 return;
1223 tree type = gimple_range_type (call);
1224 gcc_checking_assert (type);
1225 if (!Value_Range::supports_type_p (type))
1226 return;
1228 switch (func)
1230 case CFN_BUILT_IN_CONSTANT_P:
1231 m_op1 = gimple_call_arg (call, 0);
1232 if (irange::supports_p (TREE_TYPE (m_op1)))
1233 m_operator = &op_cfn_constant_p;
1234 else if (frange::supports_p (TREE_TYPE (m_op1)))
1235 m_operator = &op_cfn_constant_float_p;
1236 break;
1238 CASE_FLT_FN (CFN_BUILT_IN_SIGNBIT):
1239 m_op1 = gimple_call_arg (call, 0);
1240 m_operator = &op_cfn_signbit;
1241 break;
1243 CASE_CFN_COPYSIGN_ALL:
1244 m_op1 = gimple_call_arg (call, 0);
1245 m_op2 = gimple_call_arg (call, 1);
1246 m_operator = &op_cfn_copysign;
1247 break;
1249 CASE_CFN_SQRT:
1250 CASE_CFN_SQRT_FN:
1251 m_op1 = gimple_call_arg (call, 0);
1252 m_operator = &op_cfn_sqrt;
1253 break;
1255 CASE_CFN_SIN:
1256 CASE_CFN_SIN_FN:
1257 m_op1 = gimple_call_arg (call, 0);
1258 m_operator = &op_cfn_sin;
1259 break;
1261 CASE_CFN_COS:
1262 CASE_CFN_COS_FN:
1263 m_op1 = gimple_call_arg (call, 0);
1264 m_operator = &op_cfn_cos;
1265 break;
1267 case CFN_BUILT_IN_TOUPPER:
1268 case CFN_BUILT_IN_TOLOWER:
1269 // Only proceed If the argument is compatible with the LHS.
1270 m_op1 = gimple_call_arg (call, 0);
1271 if (range_compatible_p (type, TREE_TYPE (m_op1)))
1272 m_operator = (func == CFN_BUILT_IN_TOLOWER) ? &op_cfn_tolower
1273 : &op_cfn_toupper;
1274 break;
1276 CASE_CFN_FFS:
1277 m_op1 = gimple_call_arg (call, 0);
1278 m_operator = &op_cfn_ffs;
1279 break;
1281 CASE_CFN_POPCOUNT:
1282 m_op1 = gimple_call_arg (call, 0);
1283 m_operator = &op_cfn_popcount;
1284 break;
1286 CASE_CFN_CLZ:
1287 m_op1 = gimple_call_arg (call, 0);
1288 if (gimple_call_internal_p (call))
1289 m_operator = &op_cfn_clz_internal;
1290 else
1291 m_operator = &op_cfn_clz;
1292 break;
1294 CASE_CFN_CTZ:
1295 m_op1 = gimple_call_arg (call, 0);
1296 if (gimple_call_internal_p (call))
1297 m_operator = &op_cfn_ctz_internal;
1298 else
1299 m_operator = &op_cfn_ctz;
1300 break;
1302 CASE_CFN_CLRSB:
1303 m_op1 = gimple_call_arg (call, 0);
1304 m_operator = &op_cfn_clrsb;
1305 break;
1307 case CFN_UBSAN_CHECK_ADD:
1308 m_op1 = gimple_call_arg (call, 0);
1309 m_op2 = gimple_call_arg (call, 1);
1310 m_operator = &op_cfn_ubsan_add;
1311 break;
1313 case CFN_UBSAN_CHECK_SUB:
1314 m_op1 = gimple_call_arg (call, 0);
1315 m_op2 = gimple_call_arg (call, 1);
1316 m_operator = &op_cfn_ubsan_sub;
1317 break;
1319 case CFN_UBSAN_CHECK_MUL:
1320 m_op1 = gimple_call_arg (call, 0);
1321 m_op2 = gimple_call_arg (call, 1);
1322 m_operator = &op_cfn_ubsan_mul;
1323 break;
1325 case CFN_BUILT_IN_STRLEN:
1327 tree lhs = gimple_call_lhs (call);
1328 if (lhs && ptrdiff_type_node && (TYPE_PRECISION (ptrdiff_type_node)
1329 == TYPE_PRECISION (TREE_TYPE (lhs))))
1331 m_op1 = gimple_call_arg (call, 0);
1332 m_operator = &op_cfn_strlen;
1334 break;
1337 // Optimizing these two internal functions helps the loop
1338 // optimizer eliminate outer comparisons. Size is [1,N]
1339 // and pos is [0,N-1].
1340 case CFN_GOACC_DIM_SIZE:
1341 // This call will ensure all the asserts are triggered.
1342 oacc_get_ifn_dim_arg (call);
1343 m_op1 = gimple_call_arg (call, 0);
1344 m_operator = &op_cfn_goacc_dim_size;
1345 break;
1347 case CFN_GOACC_DIM_POS:
1348 // This call will ensure all the asserts are triggered.
1349 oacc_get_ifn_dim_arg (call);
1350 m_op1 = gimple_call_arg (call, 0);
1351 m_operator = &op_cfn_goacc_dim_pos;
1352 break;
1354 CASE_CFN_PARITY:
1355 m_operator = &op_cfn_parity;
1356 break;
1358 default:
1360 unsigned arg;
1361 if (gimple_call_fnspec (call).returns_arg (&arg) && arg == 0)
1363 m_op1 = gimple_call_arg (call, 0);
1364 m_operator = &op_cfn_pass_through_arg1;
1366 break;