22#ifndef GCC_VALUE_RANGE_H
23#define GCC_VALUE_RANGE_H
79 template <
typename T>
friend bool is_a (
vrange &);
289 virtual tree type ()
const override;
300 virtual bool zero_p ()
const override;
301 virtual bool nonzero_p ()
const override;
365template<
unsigned N,
bool RESIZABLE = false>
544 virtual tree type ()
const override;
550 void set_nan (
tree type,
bool sign);
552 virtual void set_varying (
tree type)
override;
553 virtual void set_undefined ()
override;
554 virtual bool union_ (
const vrange &)
override;
555 virtual bool intersect (
const vrange &)
override;
557 virtual bool singleton_p (
tree *result =
NULL)
const override;
561 virtual bool zero_p ()
const override;
562 virtual bool nonzero_p ()
const override;
563 virtual void set_nonzero (
tree type)
override;
564 virtual void set_zero (
tree type)
override;
565 virtual void set_nonnegative (
tree type)
override;
566 virtual bool fits_p (
const vrange &)
const override;
572 virtual tree lbound ()
const override;
573 virtual tree ubound ()
const override;
576 void update_nan (
bool sign);
580 void flush_denormals_to_zero ();
583 bool known_isfinite ()
const;
584 bool known_isnan ()
const;
585 bool known_isinf ()
const;
588 bool maybe_isinf ()
const;
589 bool signbit_p (
bool &
signbit)
const;
590 bool nan_signbit_p (
bool &
signbit)
const;
593 virtual bool contains_p (
tree cst)
const override;
598 void verify_range ();
599 bool normalize_kind ();
600 bool union_nans (
const frange &);
601 bool intersect_nans (
const frange &);
649 const T &derived =
static_cast<const T &
> (v);
650 return is_a <T> (
const_cast<T &
> (derived));
658 return static_cast <T &
> (v);
666 return static_cast <const T &
> (v);
713 for (
unsigned i = 0;
i < n; ++
i)
719template<
unsigned N,
bool RESIZABLE>
773 operator const vrange &()
const;
800 void init (
const vrange &);
951Value_Range::operator
const vrange &()
const
1077template<
unsigned N,
bool RESIZABLE>
1084template<
unsigned N,
bool RESIZABLE>
1091template<
unsigned N,
bool RESIZABLE>
1098template<
unsigned N,
bool RESIZABLE>
1105template<
unsigned N,
bool RESIZABLE>
1113template<
unsigned N,
bool RESIZABLE>
1120template<
unsigned N,
bool RESIZABLE>
1242 if (
r.undefined_p ())
1246 return r.contains_p (zero);
1446 set (min, max, kind);
1550 buf,
sizeof (buf),
false);
Definition value-range.h:759
union Value_Range::buffer_type m_buffer
Value_Range()
Definition value-range.h:817
bool operator==(const Value_Range &r) const
Definition value-range.h:933
bool nonzero_p() const
Definition value-range.h:790
bool intersect(const vrange &r)
Definition value-range.h:783
vrange * m_vrange
Definition value-range.h:802
tree lbound() const
Definition value-range.h:792
void update_bitmask(const class irange_bitmask &bm)
Definition value-range.h:795
bool contains_p(tree cst) const
Definition value-range.h:784
void init(tree type)
Definition value-range.h:880
vrange & operator=(const vrange &)
Definition value-range.h:915
bool union_(const vrange &r)
Definition value-range.h:782
bool zero_p() const
Definition value-range.h:791
tree ubound() const
Definition value-range.h:793
tree type()
Definition value-range.h:777
irange_bitmask get_bitmask() const
Definition value-range.h:794
void set_varying(tree type)
Definition value-range.h:780
~Value_Range()
Definition value-range.h:859
void set_undefined()
Definition value-range.h:781
bool undefined_p() const
Definition value-range.h:779
void set_type(tree type)
Definition value-range.h:869
void accept(const vrange_visitor &v) const
Definition value-range.h:797
static bool supports_type_p(const_tree type)
Definition value-range.h:959
void set_nonzero(tree type)
Definition value-range.h:788
bool operator!=(const Value_Range &r) const
Definition value-range.h:939
bool varying_p() const
Definition value-range.h:778
bool singleton_p(tree *result=NULL) const
Definition value-range.h:785
void set_zero(tree type)
Definition value-range.h:787
Definition value-range-storage.h:137
Definition value-range.h:527
tree m_type
Definition value-range.h:604
void update_nan(tree)=delete
void set(tree type, const REAL_VALUE_TYPE &, const REAL_VALUE_TYPE &, value_range_kind=VR_RANGE)
Definition value-range.cc:827
void update_nan()
Definition value-range.h:1506
void clear_nan()
Definition value-range.h:1532
REAL_VALUE_TYPE m_min
Definition value-range.h:605
bool known_isfinite() const
Definition value-range.h:1646
REAL_VALUE_TYPE m_max
Definition value-range.h:606
void verify_range()
Definition value-range.cc:1208
bool maybe_isinf() const
Definition value-range.h:1656
bool m_neg_nan
Definition value-range.h:608
bool nan_signbit_p(bool &signbit) const
Definition value-range.h:1743
virtual void set_varying(tree type) override
Definition value-range.h:1457
bool m_pos_nan
Definition value-range.h:607
bool known_isnan() const
Definition value-range.h:1701
virtual void set_undefined() override
Definition value-range.h:1476
bool maybe_isnan() const
Definition value-range.h:1679
bool normalize_kind()
Definition value-range.cc:850
bool known_isinf() const
Definition value-range.h:1668
const REAL_VALUE_TYPE & upper_bound() const
Definition value-range.h:619
void set_nan(tree type)
Definition value-range.h:1628
frange()
Definition value-range.h:1409
const REAL_VALUE_TYPE & lower_bound() const
Definition value-range.h:612
bool signbit_p(bool &signbit) const
Definition value-range.h:1710
bool contains_p(const REAL_VALUE_TYPE &) const
Definition value-range.cc:1114
static bool supports_p(const_tree type)
Definition value-range.h:537
virtual tree type() const override
Definition value-range.h:1450
nan_state get_nan_state() const
Definition value-range.h:628
Definition value-range.h:367
wide_int m_ranges[N *2]
Definition value-range.h:380
int_range()
Definition value-range.h:1079
int_range(tree type, const wide_int &, const wide_int &, value_range_kind=VR_RANGE)
Definition value-range.h:1106
int_range(tree type)
Definition value-range.h:1099
int_range(const irange &)
Definition value-range.h:1114
int_range(const int_range &)
Definition value-range.h:1085
int_range & operator=(const int_range &)
Definition value-range.h:1122
~int_range() final override
Definition value-range.h:721
Definition value-range.h:134
irange_bitmask(unsigned prec)
Definition value-range.h:137
void dump(FILE *) const
Definition value-range.cc:294
void adjust_range(irange &r) const
Definition value-range.cc:2260
void verify_mask() const
Definition value-range.cc:2484
void set_nonzero_bits(const wide_int &bits)
Definition value-range.h:207
unsigned get_precision() const
Definition value-range.h:189
bool member_p(const wide_int &val) const
Definition value-range.h:218
void set_unknown(unsigned prec)
Definition value-range.h:163
bool unknown_p() const
Definition value-range.h:174
void union_(const irange_bitmask &src)
Definition value-range.h:239
bool operator==(const irange_bitmask &src) const
Definition value-range.h:229
wide_int get_nonzero_bits() const
Definition value-range.h:200
wide_int mask() const
Definition value-range.h:140
bool operator!=(const irange_bitmask &src) const
Definition value-range.h:147
irange_bitmask()
Definition value-range.h:136
wide_int m_mask
Definition value-range.h:159
void intersect(const irange_bitmask &src)
Definition value-range.h:248
wide_int m_value
Definition value-range.h:158
wide_int value() const
Definition value-range.h:139
Definition value-range-storage.h:65
Definition value-range.h:273
void invert()
Definition value-range.cc:2163
bool union_bitmask(const irange &r)
Definition value-range.cc:2443
virtual bool nonzero_p() const override
Definition value-range.h:1030
virtual bool zero_p() const override
Definition value-range.h:1022
bool m_resizable
Definition value-range.h:350
virtual bool supports_type_p(const_tree type) const override
Definition value-range.cc:399
virtual void set_nonzero(tree type) override
Definition value-range.h:1189
unsigned num_pairs() const
Definition value-range.h:975
unsigned char m_max_ranges
Definition value-range.h:351
virtual bool union_(const vrange &) override
Definition value-range.cc:1758
virtual void set_nonnegative(tree type) override
Definition value-range.cc:413
void maybe_resize(int needed)
Definition value-range.h:703
bool union_append(const irange &r)
Definition value-range.cc:1720
virtual void set_varying(tree type) override
Definition value-range.h:1136
virtual tree lbound() const override
Definition value-range.cc:2472
bool intersect_bitmask(const irange &r)
Definition value-range.cc:2410
tree m_type
Definition value-range.h:352
virtual bool intersect(const vrange &) override
Definition value-range.cc:1943
bool nonnegative_p() const
Definition value-range.cc:387
virtual irange_bitmask get_bitmask() const override
Definition value-range.cc:2355
wide_int * m_base
Definition value-range.h:355
static const int HARD_MAX_RANGES
Definition value-range.h:340
bool operator==(const irange &) const
Definition value-range.cc:1560
virtual bool fits_p(const vrange &r) const override
Definition value-range.cc:407
void set(tree type, const wide_int &, const wide_int &, value_range_kind=VR_RANGE)
Definition value-range.cc:1441
unsigned char m_num_ranges
Definition value-range.h:349
virtual void accept(const vrange_visitor &v) const override
Definition value-range.cc:59
bool irange_single_pair_union(const irange &r)
Definition value-range.cc:1653
virtual bool singleton_p(tree *result=NULL) const override
Definition value-range.cc:1597
static bool supports_p(const_tree type)
Definition value-range.h:1040
wide_int upper_bound() const
Definition value-range.h:1179
wide_int lower_bound(unsigned=0) const
Definition value-range.h:1158
irange_bitmask m_bitmask
Definition value-range.h:353
virtual void set_undefined() override
Definition value-range.h:1129
virtual tree ubound() const override
Definition value-range.cc:2478
bool nonpositive_p() const
Definition value-range.cc:393
irange & operator=(const irange &)
Definition value-range.cc:1320
void verify_range()
Definition value-range.cc:1518
virtual void set_zero(tree type) override
Definition value-range.h:1215
virtual void update_bitmask(const class irange_bitmask &) override
Definition value-range.cc:2336
bool contains_p(const wide_int &) const
Definition value-range.cc:1626
bool set_range_from_bitmask()
Definition value-range.cc:2290
bool irange_contains_p(const irange &) const
Definition value-range.cc:1897
bool varying_compatible_p() const
Definition value-range.h:988
virtual tree type() const override
Definition value-range.h:981
void normalize_kind()
Definition value-range.h:1224
bool operator!=(const irange &r) const
Definition value-range.h:316
irange(wide_int *, unsigned nranges, bool resizable)
Definition value-range.h:1066
Definition value-range.h:473
bool neg_p() const
Definition value-range.h:516
bool m_neg_nan
Definition value-range.h:481
bool pos_p() const
Definition value-range.h:508
bool m_pos_nan
Definition value-range.h:480
nan_state(bool)
Definition value-range.h:488
Definition value-range-storage.h:104
Definition value-range.h:384
virtual bool supports_type_p(const_tree type) const final override
Definition value-range.h:1299
wide_int m_min
Definition value-range.h:428
prange()
Definition value-range.h:1264
wide_int upper_bound() const
Definition value-range.h:1382
irange_bitmask get_bitmask() const final override
Definition value-range.h:1396
wide_int m_max
Definition value-range.h:429
virtual bool contains_p(tree cst) const final override
Definition value-range.h:1350
tree m_type
Definition value-range.h:427
bool varying_compatible_p() const
Definition value-range.h:1389
virtual void set_varying(tree type) final override
Definition value-range.h:1311
static bool supports_p(const_tree type)
Definition value-range.h:1293
virtual void set_zero(tree type) final override
Definition value-range.h:1337
wide_int lower_bound() const
Definition value-range.h:1375
virtual bool fits_p(const vrange &v) const final override
Definition value-range.h:1402
virtual bool zero_p() const final override
Definition value-range.h:1356
virtual void set_undefined() final override
Definition value-range.h:1305
void verify_range() const
Definition value-range.cc:668
virtual void set_nonzero(tree type) final override
Definition value-range.h:1324
virtual bool nonzero_p() const final override
Definition value-range.h:1362
virtual tree type() const final override
Definition value-range.h:1368
virtual void set(tree, tree, value_range_kind=VR_RANGE) final override
Definition value-range.cc:437
irange_bitmask m_bitmask
Definition value-range.h:430
Definition range-op.h:291
Definition value-range.h:437
unsupported_range & operator=(const unsupported_range &r)
Definition value-range.cc:223
unsupported_range(const unsupported_range &src)
Definition value-range.h:444
unsupported_range()
Definition value-range.h:439
Definition value-range-pretty-print.h:25
Definition value-range.h:734
virtual void visit(const unsupported_range &) const
Definition value-range.h:739
virtual void visit(const irange &) const
Definition value-range.h:736
virtual void visit(const frange &) const
Definition value-range.h:738
virtual void visit(const prange &) const
Definition value-range.h:737
Definition value-range.h:78
virtual irange_bitmask get_bitmask() const
Definition value-range.cc:101
vrange(enum value_range_discriminator d)
Definition value-range.h:115
enum value_range_kind m_kind
Definition value-range.h:116
virtual bool singleton_p(tree *result=NULL) const =0
bool operator!=(const vrange &r) const
Definition value-range.h:112
friend class Value_Range
Definition value-range.h:80
virtual bool supports_type_p(const_tree type) const =0
virtual void set_zero(tree type)=0
virtual bool union_(const vrange &)=0
virtual ~vrange()
Definition value-range.h:100
virtual bool nonzero_p() const =0
virtual bool zero_p() const =0
virtual void set(tree, tree, value_range_kind=VR_RANGE)=0
virtual void set_varying(tree type)=0
bool undefined_p() const
Definition value-range.h:1016
enum value_range_discriminator m_discriminator
Definition value-range.h:117
virtual void set_undefined()=0
virtual bool intersect(const vrange &)=0
virtual void set_nonzero(tree type)=0
virtual void update_bitmask(const class irange_bitmask &)
Definition value-range.cc:96
virtual tree ubound() const =0
friend bool is_a(vrange &)
Definition value-range.h:638
void set_nonzero_bits(const wide_int &bits)
Definition value-range.cc:2389
virtual void set_nonnegative(tree type)=0
virtual void accept(const class vrange_visitor &v) const =0
virtual bool contains_p(tree cst) const =0
vrange & operator=(const vrange &)
Definition value-range.cc:250
virtual tree lbound() const =0
virtual tree type() const =0
void dump(FILE *) const
Definition value-range.cc:283
wide_int get_nonzero_bits() const
Definition value-range.cc:2399
virtual bool fits_p(const vrange &r) const =0
bool varying_p() const
Definition value-range.h:1010
bool operator==(const vrange &) const
Definition value-range.cc:269
friend void streamer_write_vrange(struct output_block *, const vrange &)
Definition data-streamer-out.cc:408
unsigned int get_precision() const
Definition wide-int.h:1252
const union tree_node * const_tree
Definition coretypes.h:98
union tree_node * tree
Definition coretypes.h:97
bool operator==(const nowarn_spec_t &lhs, const nowarn_spec_t &rhs)
Definition diagnostic-spec.h:124
bool operator!=(const nowarn_spec_t &lhs, const nowarn_spec_t &rhs)
Definition diagnostic-spec.h:132
REAL_VALUE_TYPE dconstninf
Definition emit-rtl.cc:113
REAL_VALUE_TYPE dconstinf
Definition emit-rtl.cc:112
void final(rtx_insn *first, FILE *file, int optimize_p)
Definition final.cc:2002
static type_p type(options_p *optsp, bool nested)
Definition gengtype-parse.cc:883
tree_code
Definition genmatch.cc:347
#define N
Definition gensupport.cc:202
T * ggc_alloc(ALONE_CXX_MEM_STAT_INFO)
Definition ggc.h:184
Definition fold-const.cc:4229
void add_vrange(const vrange &v, inchash::hash &hstate, unsigned int)
Definition value-range.cc:320
wide_int min_value(machine_mode, signop)
Definition rtl.h:2332
hwi_with_prec minus_one(unsigned int)
Definition wide-int.h:2011
hwi_with_prec zero(unsigned int)
Definition wide-int.h:2018
BINARY_FUNCTION bit_and(const T1 &, const T2 &)
wide_int max_value(machine_mode, signop)
Definition rtl.h:2340
tree_to_wide_ref to_wide(const_tree)
Definition tree.h:6372
hwi_with_prec one(unsigned int)
Definition wide-int.h:2025
poly_int< N, C > r
Definition poly-int.h:770
i
Definition poly-int.h:772
static bool maybe_isnan(const frange &op1, const frange &op2)
Definition range-op-float.cc:239
static bool zero_p(const REAL_VALUE_TYPE &lb, const REAL_VALUE_TYPE &ub)
Definition range-op-float.cc:2266
int real_from_string(REAL_VALUE_TYPE *r, const char *str)
Definition real.cc:2006
bool HONOR_NANS(machine_mode m)
Definition real.cc:5482
REAL_VALUE_TYPE real_value_negate(const REAL_VALUE_TYPE *op0)
Definition real.cc:1115
bool real_isinf(const REAL_VALUE_TYPE *r)
Definition real.cc:1242
bool real_identical(const REAL_VALUE_TYPE *a, const REAL_VALUE_TYPE *b)
Definition real.cc:1312
bool HONOR_INFINITIES(machine_mode m)
Definition real.cc:5523
void get_max_float(const struct real_format *fmt, char *buf, size_t len, bool norm_max)
Definition real.cc:5436
#define REAL_MODE_FORMAT(MODE)
Definition real.h:183
#define REAL_VALUE_TYPE
Definition real.h:68
signop
Definition signop.h:28
@ UNSIGNED
Definition signop.h:30
Definition lto-streamer.h:699
Definition gengtype.h:218
Definition gengtype.h:252
#define NULL
Definition system.h:50
#define gcc_unreachable()
Definition system.h:848
#define gcc_checking_assert(EXPR)
Definition system.h:828
tree build_zero_cst(tree type)
Definition tree.cc:2637
#define DECIMAL_FLOAT_TYPE_P(TYPE)
Definition tree.h:680
#define TYPE_PRECISION(NODE)
Definition tree.h:2245
#define SCALAR_FLOAT_TYPE_P(TYPE)
Definition tree.h:648
#define TREE_REAL_CST_PTR(NODE)
Definition tree.h:1155
#define TYPE_UNSIGNED(NODE)
Definition tree.h:949
#define TYPE_MODE(NODE)
Definition tree.h:2254
#define TYPE_SIGN(NODE)
Definition tree.h:952
#define POINTER_TYPE_P(TYPE)
Definition tree.h:700
#define TYPE_P(NODE)
Definition tree.h:226
#define TREE_TYPE(NODE)
Definition tree.h:512
#define INTEGRAL_TYPE_P(TYPE)
Definition tree.h:613
#define error_mark_node
Definition tree.h:4409
Definition value-range.h:803
~buffer_type()
Definition value-range.h:809
buffer_type()
Definition value-range.h:808
int_range_max ints
Definition value-range.h:804
frange floats
Definition value-range.h:805
unsupported_range unsupported
Definition value-range.h:806
prange pointers
Definition value-range.h:807
T & as_a(vrange &v)
Definition value-range.h:655
REAL_VALUE_TYPE frange_val_max(const_tree type)
Definition value-range.h:1580
int_range< 2 > value_range
Definition value-range.h:742
bool range_includes_zero_p(const vrange &vr)
Definition value-range.h:1052
wide_int irange_val_max(const_tree type)
Definition value-range.h:1257
value_range_kind
Definition value-range.h:29
@ VR_ANTI_RANGE
Definition value-range.h:37
@ VR_RANGE
Definition value-range.h:35
@ VR_LAST
Definition value-range.h:41
@ VR_NAN
Definition value-range.h:39
@ VR_VARYING
Definition value-range.h:33
@ VR_UNDEFINED
Definition value-range.h:31
void dump_value_range(FILE *, const vrange *)
Definition value-range.cc:2491
bool is_a< prange >(vrange &v)
Definition value-range.h:680
bool is_a< unsupported_range >(vrange &v)
Definition value-range.h:694
value_range_discriminator
Definition value-range.h:47
@ VR_UNKNOWN
Definition value-range.h:55
@ VR_IRANGE
Definition value-range.h:49
@ VR_PRANGE
Definition value-range.h:51
@ VR_FRANGE
Definition value-range.h:53
REAL_VALUE_TYPE real_min_representable(const_tree type)
Definition value-range.h:1559
void frange_arithmetic(enum tree_code, tree, REAL_VALUE_TYPE &, const REAL_VALUE_TYPE &, const REAL_VALUE_TYPE &, const REAL_VALUE_TYPE &)
Definition range-op-float.cc:331
int_range< 3, true > int_range_max
Definition value-range.h:731
value_range_kind get_legacy_range(const vrange &, tree &min, tree &max)
Definition value-range.cc:1423
bool is_a< frange >(vrange &v)
Definition value-range.h:687
void frange_nextafter(enum machine_mode, REAL_VALUE_TYPE &, const REAL_VALUE_TYPE &)
Definition range-op-float.cc:298
REAL_VALUE_TYPE real_max_representable(const_tree type)
Definition value-range.h:1545
wide_int irange_val_min(const_tree type)
Definition value-range.h:1250
bool range_compatible_p(tree type1, tree type2)
Definition value-range.h:1764
bool frange_val_is_min(const REAL_VALUE_TYPE &r, const_tree type)
Definition value-range.h:1591
bool contains_zero_p(const irange &r)
Definition value-range.h:1240
bool frange_val_is_max(const REAL_VALUE_TYPE &r, const_tree type)
Definition value-range.h:1600
bool vrp_operand_equal_p(const_tree, const_tree)
Definition value-range.cc:2526
REAL_VALUE_TYPE frange_val_min(const_tree type)
Definition value-range.h:1569
bool is_a< irange >(vrange &v)
Definition value-range.h:673