Mercurial > hg > CbC > CbC_gcc
diff gcc/tree-vrp.h @ 132:d34655255c78
update gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 10:21:07 +0900 |
parents | 84e7813d76e9 |
children | 1830386684a0 |
line wrap: on
line diff
--- a/gcc/tree-vrp.h Thu Oct 25 08:08:40 2018 +0900 +++ b/gcc/tree-vrp.h Thu Oct 25 10:21:07 2018 +0900 @@ -1,5 +1,5 @@ /* Support routines for Value Range Propagation (VRP). - Copyright (C) 2016-2017 Free Software Foundation, Inc. + Copyright (C) 2016-2018 Free Software Foundation, Inc. This file is part of GCC. @@ -20,44 +20,202 @@ #ifndef GCC_TREE_VRP_H #define GCC_TREE_VRP_H -/* Type of value ranges. See value_range_d In tree-vrp.c for a - description of these types. */ -enum value_range_type { VR_UNDEFINED, VR_RANGE, - VR_ANTI_RANGE, VR_VARYING, VR_LAST }; +/* Types of value ranges. */ +enum value_range_kind +{ + /* Empty range. */ + VR_UNDEFINED, + /* Range spans the entire domain. */ + VR_VARYING, + /* Range is [MIN, MAX]. */ + VR_RANGE, + /* Range is ~[MIN, MAX]. */ + VR_ANTI_RANGE, + /* Range is a nice guy. */ + VR_LAST +}; /* Range of values that can be associated with an SSA_NAME after VRP has executed. */ -struct GTY((for_user)) value_range +class GTY((for_user)) value_range { - /* Lattice value represented by this range. */ - enum value_range_type type; + public: + value_range (); + value_range (value_range_kind, tree, tree, bitmap = NULL); + void update (value_range_kind, tree, tree); + bool operator== (const value_range &) const; + bool operator!= (const value_range &) const; + void intersect (const value_range *); + void union_ (const value_range *); - /* Minimum and maximum values represented by this range. These - values should be interpreted as follows: + /* Types of value ranges. */ + bool undefined_p () const; + bool varying_p () const; + bool symbolic_p () const; + bool constant_p () const; + void set_undefined (); + void set_varying (); + + /* Equivalence bitmap methods. */ + bitmap equiv () const; + void equiv_clear (); + void equiv_add (const_tree, const value_range *, bitmap_obstack * = NULL); - - If TYPE is VR_UNDEFINED or VR_VARYING then MIN and MAX must - be NULL. - - - If TYPE == VR_RANGE then MIN holds the minimum value and - MAX holds the maximum value of the range [MIN, MAX]. + /* Misc methods. */ + tree type () const; + bool null_p () const; + bool may_contain_p (tree) const; + bool singleton_p (tree *result = NULL) const; + void deep_copy (const value_range *); + bool ignore_equivs_equal_p (const value_range &) const; + void set_and_canonicalize (enum value_range_kind, tree, tree, bitmap); + void dump (FILE *) const; + void dump () const; - - If TYPE == ANTI_RANGE the variable is known to NOT - take any values in the range [MIN, MAX]. */ - tree min; - tree max; + enum value_range_kind kind () const; + tree min () const; + tree max () const; + private: + void set (value_range_kind, tree, tree, bitmap); + void check (); + bool equal_p (const value_range &, bool ignore_equivs) const; + void intersect_helper (value_range *, const value_range *); + void union_helper (value_range *, const value_range *); + + enum value_range_kind m_kind; + public: + /* These should be private, but GTY is a piece of crap. */ + tree m_min; + tree m_max; /* Set of SSA names whose value ranges are equivalent to this one. This set is only valid when TYPE is VR_RANGE or VR_ANTI_RANGE. */ - bitmap equiv; + bitmap m_equiv; }; -extern void vrp_intersect_ranges (value_range *vr0, value_range *vr1); -extern void vrp_meet (value_range *vr0, const value_range *vr1); +inline +value_range::value_range () +{ + m_kind = VR_UNDEFINED; + m_min = m_max = NULL; + m_equiv = NULL; +} + +/* Return the kind of this range. */ + +inline value_range_kind +value_range::kind () const +{ + return m_kind; +} + +inline bitmap +value_range::equiv () const +{ + return m_equiv; +} + +/* Return the lower bound. */ + +inline tree +value_range::min () const +{ + return m_min; +} + +/* Return the upper bound. */ + +inline tree +value_range::max () const +{ + return m_max; +} + +/* Return TRUE if range spans the entire possible domain. */ + +inline bool +value_range::varying_p () const +{ + return m_kind == VR_VARYING; +} + +/* Return TRUE if range is undefined (essentially the empty set). */ + +inline bool +value_range::undefined_p () const +{ + return m_kind == VR_UNDEFINED; +} + +/* Return TRUE if range is the constant zero. */ + +inline bool +value_range::null_p () const +{ + return (m_kind == VR_RANGE + && integer_zerop (m_min) + && integer_zerop (m_max)); +} + extern void dump_value_range (FILE *, const value_range *); extern void extract_range_from_unary_expr (value_range *vr, enum tree_code code, tree type, - value_range *vr0_, + const value_range *vr0_, tree op0_type); +extern bool vrp_operand_equal_p (const_tree, const_tree); +extern enum value_range_kind intersect_range_with_nonzero_bits + (enum value_range_kind, wide_int *, wide_int *, const wide_int &, signop); + +struct assert_info +{ + /* Predicate code for the ASSERT_EXPR. Must be COMPARISON_CLASS_P. */ + enum tree_code comp_code; + + /* Name to register the assert for. */ + tree name; + + /* Value being compared against. */ + tree val; + + /* Expression to compare. */ + tree expr; +}; + +extern void register_edge_assert_for (tree, edge, enum tree_code, + tree, tree, vec<assert_info> &); +extern bool stmt_interesting_for_vrp (gimple *); +extern void set_value_range_to_varying (value_range *); +extern bool range_includes_zero_p (const value_range *); +extern bool infer_value_range (gimple *, tree, tree_code *, tree *); + +extern void set_value_range_to_nonnull (value_range *, tree); +extern void set_value_range (value_range *, enum value_range_kind, tree, + tree, bitmap); +extern bool vrp_bitmap_equal_p (const_bitmap, const_bitmap); +extern tree value_range_constant_singleton (const value_range *); +extern int compare_values (tree, tree); +extern int compare_values_warnv (tree, tree, bool *); +extern bool vrp_val_is_min (const_tree); +extern bool vrp_val_is_max (const_tree); +extern void set_value_range_to_value (value_range *, tree, bitmap); +extern void extract_range_from_binary_expr_1 (value_range *, enum tree_code, + tree, const value_range *, + const value_range *); +extern tree vrp_val_min (const_tree); +extern tree vrp_val_max (const_tree); +extern void set_value_range_to_null (value_range *, tree); +extern bool range_int_cst_p (const value_range *); +extern int operand_less_p (tree, tree); +extern bool find_case_label_range (gswitch *, tree, tree, size_t *, size_t *); +extern bool find_case_label_index (gswitch *, size_t, tree, size_t *); +extern bool vrp_set_zero_nonzero_bits (const tree, const value_range *, + wide_int *, wide_int *); +extern bool overflow_comparison_p (tree_code, tree, tree, bool, tree *); +extern bool range_int_cst_singleton_p (const value_range *); +extern int value_inside_range (tree, tree, tree); +extern tree get_single_symbol (tree, bool *, tree *); +extern void maybe_set_nonzero_bits (edge, tree); +extern value_range_kind determine_value_range (tree, wide_int *, wide_int *); #endif /* GCC_TREE_VRP_H */