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)
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"
30 #include "gimple-pretty-print.h"
31 #include "optabs-tree.h"
32 #include "gimple-iterator.h"
33 #include "gimple-fold.h"
35 #include "fold-const.h"
36 #include "case-cfn-macros.h"
37 #include "omp-general.h"
39 #include "tree-ssa-loop.h"
40 #include "tree-scalar-evolution.h"
41 #include "langhooks.h"
42 #include "vr-values.h"
44 #include "value-query.h"
45 #include "gimple-range.h"
46 #include "attr-fnspec.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.
54 gimple_range_ssa_names (tree
*vec
, unsigned vec_size
, gimple
*stmt
)
59 gimple_range_op_handler
handler (stmt
);
62 gcc_checking_assert (vec_size
>= 2);
63 if ((ssa
= gimple_range_ssa_p (handler
.operand1 ())))
65 if ((ssa
= gimple_range_ssa_p (handler
.operand2 ())))
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
))))
75 if ((ssa
= gimple_range_ssa_p (gimple_assign_rhs2 (st
))))
77 if ((ssa
= gimple_range_ssa_p (gimple_assign_rhs3 (st
))))
83 // Return the base of the RHS of an assignment.
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));
95 // If statement is supported by range-ops, set the CODE and return the TYPE.
97 static inline enum tree_code
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
);
107 // If statement S has a supported range_op handler return TRUE.
110 gimple_range_op_handler::supported_p (gimple
*s
)
112 enum tree_code code
= get_code (s
);
113 if (range_op_handler (code
))
115 if (is_a
<gcall
*> (s
) && gimple_range_op_handler (s
))
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
));
130 switch (gimple_code (m_stmt
))
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
);
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
)
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
))))
158 m_operator
= oper
.range_op ();
159 gcc_checking_assert (m_operator
);
165 // If no range-op table entry handled this stmt, check for other supported
167 if (is_a
<gcall
*> (m_stmt
))
168 maybe_builtin_call ();
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.
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 ())
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.
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 ())
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)
217 // This is sometimes invoked on single operand stmts.
219 op2_type
= TREE_TYPE (operand2 ());
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.
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 ())
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
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
);
270 if (cfun
->after_inlining
)
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
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
);
293 if (cfun
->after_inlining
)
302 // Implement range operator for integral/pointer functions returning
303 // the first argument.
304 class cfn_pass_through_arg1
: public range_operator
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
315 virtual bool op1_range (irange
&r
, tree
, const irange
&lhs
,
316 const irange
&, relation_trio
) const
321 } op_cfn_pass_through_arg1
;
323 // Implement range operator for CFN_BUILT_IN_SIGNBIT.
324 class cfn_signbit
: public range_operator
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
333 if (lh
.signbit_p (signbit
))
336 r
.set_nonzero (type
);
343 virtual bool op1_range (frange
&r
, tree type
, const irange
&lhs
,
344 const frange
&, relation_trio
) const override
348 r
.set (type
, dconst0
, frange_val_max (type
));
349 r
.update_nan (false);
352 if (!lhs
.contains_p (wi::zero (TYPE_PRECISION (lhs
.type ()))))
354 r
.set (type
, frange_val_min (type
), dconstm0
);
362 // Implement range operator for CFN_BUILT_IN_COPYSIGN
363 class cfn_copysign
: public range_operator
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
371 if (!range_op_handler (ABS_EXPR
).fold_range (r
, type
, lh
, frange (type
)))
373 if (!range_op_handler (NEGATE_EXPR
).fold_range (neg
, type
, r
,
378 if (rh
.signbit_p (signbit
))
380 // If the sign is negative, flip the result from ABS,
381 // otherwise leave things positive.
386 // If the sign is unknown, keep the positive and negative
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. */
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
))
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
);
410 bool inexact
= func (m
, m
, MPFR_RNDN
);
411 if (!mpfr_number_p (m
) || mpfr_overflow_p () || mpfr_underflow_p ())
414 REAL_VALUE_TYPE value
, result
;
415 real_from_mpfr (&value
, m
, format
, MPFR_RNDN
);
416 if (!real_isfinite (&value
))
418 if ((value
.cl
== rvc_zero
) != (mpfr_zero_p (m
) != 0))
421 real_convert (&result
, format
, &value
);
422 if (!real_isfinite (&result
))
424 bool round_low
= false;
425 bool round_high
= false;
426 if (!ulps
&& flag_rounding_math
)
428 if (inexact
|| !real_identical (&result
, &value
))
430 if (MODE_COMPOSITE_P (mode
))
431 round_low
= round_high
= true;
434 round_low
= !real_less (&result
, &value
);
435 round_high
= !real_less (&value
, &result
);
441 for (unsigned int i
= 0; i
< ulps
+ round_low
; ++i
)
442 frange_nextafter (mode
, *res_low
, dconstninf
);
447 for (unsigned int i
= 0; i
< ulps
+ round_high
; ++i
)
448 frange_nextafter (mode
, *res_high
, dconstinf
);
453 class cfn_sqrt
: public range_operator
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 ())
464 if (lh
.known_isnan () || real_less (&lh
.upper_bound (), &dconstm0
))
470 = targetm
.libm_function_max_error (CFN_SQRT
, TYPE_MODE (type
), true);
472 r
.set_varying (type
);
474 r
.set (type
, dconstm0
, dconstinf
);
477 REAL_VALUE_TYPE boundmin
= dconstm0
;
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
))
486 = targetm
.libm_function_max_error (CFN_SQRT
, TYPE_MODE (type
), false);
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
))
493 if (!frange_mpfr_arg1 (NULL
, &ub
, mpfr_sqrt
, ub
, type
, ulps
))
496 r2
.set (type
, lb
, ub
);
497 r2
.flush_denormals_to_zero ();
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 ())
508 // A known NAN means the input is [-INF,-0.) U +-NAN.
509 if (lhs
.known_isnan ())
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.
519 // Results outside of [-0.0, +Inf] are impossible.
521 = targetm
.libm_function_max_error (CFN_SQRT
, TYPE_MODE (type
), true);
524 const REAL_VALUE_TYPE
&ub
= lhs
.upper_bound ();
525 REAL_VALUE_TYPE m0
= dconstm0
;
527 frange_nextafter (TYPE_MODE (type
), m0
, dconstninf
);
528 if (real_less (&ub
, &m0
))
530 if (!lhs
.maybe_isnan ())
533 // If lhs could be NAN and finite result is impossible,
534 // the range is like lhs.known_isnan () above.
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));
545 r
.set_varying (type
);
548 = targetm
.libm_function_max_error (CFN_SQRT
, TYPE_MODE (type
), false);
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
);
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
);
582 r2
.set (type
, lb
, ub
);
588 class cfn_sincos
: public range_operator
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 ())
600 if (lh
.known_isnan () || lh
.known_isinf ())
605 unsigned bulps
= targetm
.libm_function_max_error (m_cfn
, TYPE_MODE (type
),
608 r
.set_varying (type
);
610 r
.set (type
, dconstm1
, dconst1
);
613 REAL_VALUE_TYPE boundmin
, boundmax
;
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 ())
624 = targetm
.libm_function_max_error (m_cfn
, TYPE_MODE (type
), false);
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
))
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
))
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
,
644 || !frange_mpfr_arg1 (&ub_lo
, &ub_hi
,
645 m_cfn
== CFN_SIN
? mpfr_sin
: mpfr_cos
, ub
,
647 || !frange_mpfr_arg1 (&lb_deriv_lo
, &lb_deriv_hi
,
648 m_cfn
== CFN_SIN
? mpfr_cos
: mpfr_sin
, lb
,
650 || !frange_mpfr_arg1 (&ub_deriv_lo
, &ub_deriv_hi
,
651 m_cfn
== CFN_SIN
? mpfr_cos
: mpfr_sin
, ub
,
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
))
667 if (real_less (&lb_hi
, &ub_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
))
685 if (real_isneg (&ub_deriv_lo
) != real_isneg (&ub_deriv_hi
))
687 if (real_isneg (&ub_lo
))
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
))
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
))
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.
711 r2
.set (type
, lb
, ub
);
712 r2
.flush_denormals_to_zero ();
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 ())
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
);
731 // Results outside of [-1.0, +1.0] are impossible.
733 = targetm
.libm_function_max_error (m_cfn
, TYPE_MODE (type
), true);
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
;
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 ())
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
);
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));
767 r
.set_varying (type
);
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
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;
783 bool get_letter_range (tree type
, irange
&lowers
, irange
&uppers
) const;
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.
791 cfn_toupper_tolower::get_letter_range (tree type
, irange
&lowers
,
792 irange
&uppers
) const
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
)));
810 // Unknown character set.
815 cfn_toupper_tolower::fold_range (irange
&r
, tree type
, const irange
&lh
,
816 const irange
&, relation_trio
) const
820 if (!get_letter_range (type
, lowers
, uppers
))
826 // Return the range passed in without any lower case characters,
827 // but including all the upper case ones.
829 r
.intersect (lowers
);
834 // Return the range passed in without any lower case characters,
835 // but including all the upper case ones.
837 r
.intersect (uppers
);
843 // Implement range operator for CFN_BUILT_IN_FFS.
844 class cfn_ffs
: public range_operator
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 ())
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;
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;
866 wi::shwi (mini
, TYPE_PRECISION (type
)),
867 wi::shwi (maxi
, TYPE_PRECISION (type
)));
872 // Implement range operator for CFN_BUILT_IN_POPCOUNT.
873 class cfn_popcount
: public cfn_ffs
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 ())
882 unsigned prec
= TYPE_PRECISION (type
);
883 irange_bitmask bm
= lh
.get_bitmask ();
884 wide_int nz
= bm
.get_nonzero_bits ();
885 wide_int high
= wi::shwi (wi::popcount (nz
), prec
);
886 // Calculating the popcount of a singleton is trivial.
887 if (lh
.singleton_p ())
889 r
.set (type
, high
, high
);
892 if (cfn_ffs::fold_range (r
, type
, lh
, rh
, rel
))
894 wide_int known_ones
= ~bm
.mask () & bm
.value ();
895 wide_int low
= wi::shwi (wi::popcount (known_ones
), prec
);
896 int_range
<2> tmp (type
, low
, high
);
904 // Implement range operator for CFN_BUILT_IN_CLZ
905 class cfn_clz
: public range_operator
908 cfn_clz (bool internal
) { m_gimple_call_internal_p
= internal
; }
909 using range_operator::fold_range
;
910 virtual bool fold_range (irange
&r
, tree type
, const irange
&lh
,
911 const irange
&, relation_trio
) const;
913 bool m_gimple_call_internal_p
;
914 } op_cfn_clz (false), op_cfn_clz_internal (true);
917 cfn_clz::fold_range (irange
&r
, tree type
, const irange
&lh
,
918 const irange
&, relation_trio
) const
920 // __builtin_c[lt]z* return [0, prec-1], except when the
921 // argument is 0, but that is undefined behavior.
923 // For __builtin_c[lt]z* consider argument of 0 always undefined
924 // behavior, for internal fns depending on C?Z_DEFINED_VALUE_AT_ZERO.
925 if (lh
.undefined_p ())
927 int prec
= TYPE_PRECISION (lh
.type ());
931 scalar_int_mode mode
= SCALAR_INT_TYPE_MODE (lh
.type ());
932 if (m_gimple_call_internal_p
)
934 if (optab_handler (clz_optab
, mode
) != CODE_FOR_nothing
935 && CLZ_DEFINED_VALUE_AT_ZERO (mode
, zerov
) == 2)
937 // Only handle the single common value.
941 // Magic value to give up, unless we can prove arg is non-zero.
946 // From clz of minimum we can compute result maximum.
947 if (wi::gt_p (lh
.lower_bound (), 0, TYPE_SIGN (lh
.type ())))
949 maxi
= prec
- 1 - wi::floor_log2 (lh
.lower_bound ());
953 else if (!range_includes_zero_p (&lh
))
960 // From clz of maximum we can compute result minimum.
961 wide_int max
= lh
.upper_bound ();
962 int newmini
= prec
- 1 - wi::floor_log2 (max
);
965 // If CLZ_DEFINED_VALUE_AT_ZERO is 2 with VALUE of prec,
966 // return [prec, prec], otherwise ignore the range.
976 wi::shwi (mini
, TYPE_PRECISION (type
)),
977 wi::shwi (maxi
, TYPE_PRECISION (type
)));
981 // Implement range operator for CFN_BUILT_IN_CTZ
982 class cfn_ctz
: public range_operator
985 cfn_ctz (bool internal
) { m_gimple_call_internal_p
= internal
; }
986 using range_operator::fold_range
;
987 virtual bool fold_range (irange
&r
, tree type
, const irange
&lh
,
988 const irange
&, relation_trio
) const;
990 bool m_gimple_call_internal_p
;
991 } op_cfn_ctz (false), op_cfn_ctz_internal (true);
994 cfn_ctz::fold_range (irange
&r
, tree type
, const irange
&lh
,
995 const irange
&, relation_trio
) const
997 if (lh
.undefined_p ())
999 int prec
= TYPE_PRECISION (lh
.type ());
1001 int maxi
= prec
- 1;
1003 scalar_int_mode mode
= SCALAR_INT_TYPE_MODE (lh
.type ());
1005 if (m_gimple_call_internal_p
)
1007 if (optab_handler (ctz_optab
, mode
) != CODE_FOR_nothing
1008 && CTZ_DEFINED_VALUE_AT_ZERO (mode
, zerov
) == 2)
1010 // Handle only the two common values.
1013 else if (zerov
== prec
)
1016 // Magic value to give up, unless we can prove arg is non-zero.
1020 // If arg is non-zero, then use [0, prec - 1].
1021 if (!range_includes_zero_p (&lh
))
1026 // If some high bits are known to be zero, we can decrease
1028 wide_int max
= lh
.upper_bound ();
1031 // Argument is [0, 0]. If CTZ_DEFINED_VALUE_AT_ZERO
1032 // is 2 with value -1 or prec, return [-1, -1] or [prec, prec].
1033 // Otherwise ignore the range.
1036 else if (maxi
== prec
)
1039 // If value at zero is prec and 0 is in the range, we can't lower
1040 // the upper bound. We could create two separate ranges though,
1041 // [0,floor_log2(max)][prec,prec] though.
1042 else if (maxi
!= prec
)
1043 maxi
= wi::floor_log2 (max
);
1048 wi::shwi (mini
, TYPE_PRECISION (type
)),
1049 wi::shwi (maxi
, TYPE_PRECISION (type
)));
1054 // Implement range operator for CFN_BUILT_IN_
1055 class cfn_clrsb
: public range_operator
1058 using range_operator::fold_range
;
1059 virtual bool fold_range (irange
&r
, tree type
, const irange
&lh
,
1060 const irange
&, relation_trio
) const
1062 if (lh
.undefined_p ())
1064 int prec
= TYPE_PRECISION (lh
.type ());
1066 wi::zero (TYPE_PRECISION (type
)),
1067 wi::shwi (prec
- 1, TYPE_PRECISION (type
)));
1073 // Implement range operator for CFN_BUILT_IN_
1074 class cfn_ubsan
: public range_operator
1077 cfn_ubsan (enum tree_code code
) { m_code
= code
; }
1078 using range_operator::fold_range
;
1079 virtual bool fold_range (irange
&r
, tree type
, const irange
&lh
,
1080 const irange
&rh
, relation_trio rel
) const
1082 bool saved_flag_wrapv
= flag_wrapv
;
1083 // Pretend the arithmetic is wrapping. If there is any overflow,
1084 // we'll complain, but will actually do wrapping operation.
1086 bool result
= range_op_handler (m_code
).fold_range (r
, type
, lh
, rh
, rel
);
1087 flag_wrapv
= saved_flag_wrapv
;
1089 // If for both arguments vrp_valueize returned non-NULL, this should
1090 // have been already folded and if not, it wasn't folded because of
1091 // overflow. Avoid removing the UBSAN_CHECK_* calls in that case.
1092 if (result
&& r
.singleton_p ())
1093 r
.set_varying (type
);
1097 enum tree_code m_code
;
1100 cfn_ubsan
op_cfn_ubsan_add (PLUS_EXPR
);
1101 cfn_ubsan
op_cfn_ubsan_sub (MINUS_EXPR
);
1102 cfn_ubsan
op_cfn_ubsan_mul (MULT_EXPR
);
1105 // Implement range operator for CFN_BUILT_IN_STRLEN
1106 class cfn_strlen
: public range_operator
1109 using range_operator::fold_range
;
1110 virtual bool fold_range (irange
&r
, tree type
, const irange
&,
1111 const irange
&, relation_trio
) const
1113 wide_int max
= irange_val_max (ptrdiff_type_node
);
1114 // To account for the terminating NULL, the maximum length
1115 // is one less than the maximum array size, which in turn
1116 // is one less than PTRDIFF_MAX (or SIZE_MAX where it's
1117 // smaller than the former type).
1118 // FIXME: Use max_object_size() - 1 here.
1119 r
.set (type
, wi::zero (TYPE_PRECISION (type
)), max
- 2);
1125 // Implement range operator for CFN_BUILT_IN_GOACC_DIM
1126 class cfn_goacc_dim
: public range_operator
1129 cfn_goacc_dim (bool is_pos
) { m_is_pos
= is_pos
; }
1130 using range_operator::fold_range
;
1131 virtual bool fold_range (irange
&r
, tree type
, const irange
&lh
,
1132 const irange
&, relation_trio
) const
1135 if (!lh
.singleton_p (&axis_tree
))
1137 HOST_WIDE_INT axis
= TREE_INT_CST_LOW (axis_tree
);
1138 int size
= oacc_get_fn_dim_size (current_function_decl
, axis
);
1140 // If it's dynamic, the backend might know a hardware limitation.
1141 size
= targetm
.goacc
.dim_limit (axis
);
1144 wi::shwi (m_is_pos
? 0 : 1, TYPE_PRECISION (type
)),
1146 ? wi::shwi (size
- m_is_pos
, TYPE_PRECISION (type
))
1147 : irange_val_max (type
));
1152 } op_cfn_goacc_dim_size (false), op_cfn_goacc_dim_pos (true);
1155 // Implement range operator for CFN_BUILT_IN_
1156 class cfn_parity
: public range_operator
1159 using range_operator::fold_range
;
1160 virtual bool fold_range (irange
&r
, tree type
, const irange
&,
1161 const irange
&, relation_trio
) const
1163 r
= range_true_and_false (type
);
1168 // Set up a gimple_range_op_handler for any nonstandard function which can be
1169 // supported via range-ops.
1172 gimple_range_op_handler::maybe_non_standard ()
1174 range_op_handler
signed_op (OP_WIDEN_MULT_SIGNED
);
1175 gcc_checking_assert (signed_op
);
1176 range_op_handler
unsigned_op (OP_WIDEN_MULT_UNSIGNED
);
1177 gcc_checking_assert (unsigned_op
);
1179 if (gimple_code (m_stmt
) == GIMPLE_ASSIGN
)
1180 switch (gimple_assign_rhs_code (m_stmt
))
1182 case WIDEN_MULT_EXPR
:
1184 m_op1
= gimple_assign_rhs1 (m_stmt
);
1185 m_op2
= gimple_assign_rhs2 (m_stmt
);
1186 tree ret
= gimple_assign_lhs (m_stmt
);
1187 bool signed1
= TYPE_SIGN (TREE_TYPE (m_op1
)) == SIGNED
;
1188 bool signed2
= TYPE_SIGN (TREE_TYPE (m_op2
)) == SIGNED
;
1189 bool signed_ret
= TYPE_SIGN (TREE_TYPE (ret
)) == SIGNED
;
1191 /* Normally these operands should all have the same sign, but
1192 some passes and violate this by taking mismatched sign args. At
1193 the moment the only one that's possible is mismatch inputs and
1194 unsigned output. Once ranger supports signs for the operands we
1195 can properly fix it, for now only accept the case we can do
1197 if ((signed1
^ signed2
) && signed_ret
)
1200 if (signed2
&& !signed1
)
1201 std::swap (m_op1
, m_op2
);
1203 if (signed1
|| signed2
)
1204 m_operator
= signed_op
.range_op ();
1206 m_operator
= unsigned_op
.range_op ();
1214 // Set up a gimple_range_op_handler for any built in function which can be
1215 // supported via range-ops.
1218 gimple_range_op_handler::maybe_builtin_call ()
1220 gcc_checking_assert (is_a
<gcall
*> (m_stmt
));
1222 gcall
*call
= as_a
<gcall
*> (m_stmt
);
1223 combined_fn func
= gimple_call_combined_fn (call
);
1224 if (func
== CFN_LAST
)
1226 tree type
= gimple_range_type (call
);
1227 gcc_checking_assert (type
);
1228 if (!Value_Range::supports_type_p (type
))
1233 case CFN_BUILT_IN_CONSTANT_P
:
1234 m_op1
= gimple_call_arg (call
, 0);
1235 if (irange::supports_p (TREE_TYPE (m_op1
)))
1236 m_operator
= &op_cfn_constant_p
;
1237 else if (frange::supports_p (TREE_TYPE (m_op1
)))
1238 m_operator
= &op_cfn_constant_float_p
;
1241 CASE_FLT_FN (CFN_BUILT_IN_SIGNBIT
):
1242 m_op1
= gimple_call_arg (call
, 0);
1243 m_operator
= &op_cfn_signbit
;
1246 CASE_CFN_COPYSIGN_ALL
:
1247 m_op1
= gimple_call_arg (call
, 0);
1248 m_op2
= gimple_call_arg (call
, 1);
1249 m_operator
= &op_cfn_copysign
;
1254 m_op1
= gimple_call_arg (call
, 0);
1255 m_operator
= &op_cfn_sqrt
;
1260 m_op1
= gimple_call_arg (call
, 0);
1261 m_operator
= &op_cfn_sin
;
1266 m_op1
= gimple_call_arg (call
, 0);
1267 m_operator
= &op_cfn_cos
;
1270 case CFN_BUILT_IN_TOUPPER
:
1271 case CFN_BUILT_IN_TOLOWER
:
1272 // Only proceed If the argument is compatible with the LHS.
1273 m_op1
= gimple_call_arg (call
, 0);
1274 if (range_compatible_p (type
, TREE_TYPE (m_op1
)))
1275 m_operator
= (func
== CFN_BUILT_IN_TOLOWER
) ? &op_cfn_tolower
1280 m_op1
= gimple_call_arg (call
, 0);
1281 m_operator
= &op_cfn_ffs
;
1285 m_op1
= gimple_call_arg (call
, 0);
1286 m_operator
= &op_cfn_popcount
;
1290 m_op1
= gimple_call_arg (call
, 0);
1291 if (gimple_call_internal_p (call
))
1292 m_operator
= &op_cfn_clz_internal
;
1294 m_operator
= &op_cfn_clz
;
1298 m_op1
= gimple_call_arg (call
, 0);
1299 if (gimple_call_internal_p (call
))
1300 m_operator
= &op_cfn_ctz_internal
;
1302 m_operator
= &op_cfn_ctz
;
1306 m_op1
= gimple_call_arg (call
, 0);
1307 m_operator
= &op_cfn_clrsb
;
1310 case CFN_UBSAN_CHECK_ADD
:
1311 m_op1
= gimple_call_arg (call
, 0);
1312 m_op2
= gimple_call_arg (call
, 1);
1313 m_operator
= &op_cfn_ubsan_add
;
1316 case CFN_UBSAN_CHECK_SUB
:
1317 m_op1
= gimple_call_arg (call
, 0);
1318 m_op2
= gimple_call_arg (call
, 1);
1319 m_operator
= &op_cfn_ubsan_sub
;
1322 case CFN_UBSAN_CHECK_MUL
:
1323 m_op1
= gimple_call_arg (call
, 0);
1324 m_op2
= gimple_call_arg (call
, 1);
1325 m_operator
= &op_cfn_ubsan_mul
;
1328 case CFN_BUILT_IN_STRLEN
:
1330 tree lhs
= gimple_call_lhs (call
);
1331 if (lhs
&& ptrdiff_type_node
&& (TYPE_PRECISION (ptrdiff_type_node
)
1332 == TYPE_PRECISION (TREE_TYPE (lhs
))))
1334 m_op1
= gimple_call_arg (call
, 0);
1335 m_operator
= &op_cfn_strlen
;
1340 // Optimizing these two internal functions helps the loop
1341 // optimizer eliminate outer comparisons. Size is [1,N]
1342 // and pos is [0,N-1].
1343 case CFN_GOACC_DIM_SIZE
:
1344 // This call will ensure all the asserts are triggered.
1345 oacc_get_ifn_dim_arg (call
);
1346 m_op1
= gimple_call_arg (call
, 0);
1347 m_operator
= &op_cfn_goacc_dim_size
;
1350 case CFN_GOACC_DIM_POS
:
1351 // This call will ensure all the asserts are triggered.
1352 oacc_get_ifn_dim_arg (call
);
1353 m_op1
= gimple_call_arg (call
, 0);
1354 m_operator
= &op_cfn_goacc_dim_pos
;
1358 m_operator
= &op_cfn_parity
;
1364 if (gimple_call_fnspec (call
).returns_arg (&arg
) && arg
== 0)
1366 m_op1
= gimple_call_arg (call
, 0);
1367 m_operator
= &op_cfn_pass_through_arg1
;