aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-vrp.h
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2019-10-03 08:08:50 +0000
committerAldy Hernandez <aldyh@gcc.gnu.org>2019-10-03 08:08:50 +0000
commit38a734350fd787da1b4bcf9b4e0a99ed2adb5eae (patch)
tree4f5d0ec3eca5f40efce5cb8725875e0f0d1cf2d0 /gcc/tree-vrp.h
parent0a8c8f4d6578fac21adc0e156861c4b47bed4418 (diff)
downloadgcc-38a734350fd787da1b4bcf9b4e0a99ed2adb5eae.zip
gcc-38a734350fd787da1b4bcf9b4e0a99ed2adb5eae.tar.gz
gcc-38a734350fd787da1b4bcf9b4e0a99ed2adb5eae.tar.bz2
Makefile.in (OBJS): Add range.o and range-op.o.
* Makefile.in (OBJS): Add range.o and range-op.o. Remove wide-int-range.o. * function-tests.c (test_ranges): New. (function_tests_c_tests): Call test_ranges. * ipa-cp.c (ipa_vr_operation_and_type_effects): Call range_fold_unary_expr instead of extract_range_from_unary_expr. * ipa-prop.c (ipa_compute_jump_functions_for_edge): Same. * range-op.cc: New file. * range-op.h: New file. * range.cc: New file. * range.h: New file. * selftest.h (range_tests): New prototype. * ssa.h: Include range.h. * tree-vrp.c (value_range_base::value_range_base): New constructors. (value_range_base::singleton_p): Do not call ranges_from_anti_range until sure we will need to. (value_range_base::type): Rename gcc_assert to gcc_checking_assert. (vrp_val_is_max): New argument. (vrp_val_is_min): Same. (wide_int_range_set_zero_nonzero_bits): Move from wide-int-range.cc. (extract_range_into_wide_ints): Remove. (extract_range_from_multiplicative_op): Remove. (extract_range_from_pointer_plus_expr): Abstract POINTER_PLUS code from extract_range_from_binary_expr. (extract_range_from_plus_minus_expr): Abstract PLUS/MINUS code from extract_range_from_binary_expr. (extract_range_from_binary_expr): Remove. (normalize_for_range_ops): New. (range_fold_binary_expr): New. (range_fold_unary_expr): New. (value_range_base::num_pairs): New. (value_range_base::lower_bound): New. (value_range_base::upper_bound): New. (value_range_base::upper_bound): New. (value_range_base::contains_p): New. (value_range_base::invert): New. (value_range_base::union_): New. (value_range_base::intersect): New. (range_compatible_p): New. (value_range_base::operator==): New. (determine_value_range_1): Call range_fold_*expr instead of extract_range_from_*expr. * tree-vrp.h (class value_range_base): Add new constructors. Add methods for union_, intersect, operator==, contains_p, num_pairs, lower_bound, upper_bound, invert. (vrp_val_is_min): Add handle_pointers argument. (vrp_val_is_max): Same. (extract_range_from_unary_expr): Remove. (extract_range_from_binary_expr): Remove. (range_fold_unary_expr): New. (range_fold_binary_expr): New. * vr-values.c (vr_values::extract_range_from_binary_expr): Call range_fold_binary_expr instead of extract_range_from_binary_expr. (vr_values::extract_range_basic): Same. (vr_values::extract_range_from_unary_expr): Call range_fold_unary_expr instead of extract_range_from_unary_expr. * wide-int-range.cc: Remove. * wide-int-range.h: Remove. From-SVN: r276504
Diffstat (limited to 'gcc/tree-vrp.h')
-rw-r--r--gcc/tree-vrp.h37
1 files changed, 24 insertions, 13 deletions
diff --git a/gcc/tree-vrp.h b/gcc/tree-vrp.h
index cf236fa..d20d004 100644
--- a/gcc/tree-vrp.h
+++ b/gcc/tree-vrp.h
@@ -35,14 +35,19 @@ enum value_range_kind
VR_LAST
};
-
/* Range of values that can be associated with an SSA_NAME after VRP
has executed. */
class GTY((for_user)) value_range_base
{
+ friend void range_tests ();
public:
value_range_base ();
value_range_base (value_range_kind, tree, tree);
+ value_range_base (tree, tree);
+ value_range_base (value_range_kind,
+ tree type, const wide_int &, const wide_int &);
+ value_range_base (tree type, const wide_int &, const wide_int &);
+ value_range_base (tree type);
void set (value_range_kind, tree, tree);
void set (tree);
@@ -63,8 +68,10 @@ public:
void union_ (const value_range_base *);
void intersect (const value_range_base *);
+ void union_ (const value_range_base &);
+ void intersect (const value_range_base &);
- bool operator== (const value_range_base &) const /* = delete */;
+ bool operator== (const value_range_base &) const;
bool operator!= (const value_range_base &) const /* = delete */;
bool equal_p (const value_range_base &) const;
@@ -80,6 +87,14 @@ public:
static bool supports_type_p (tree);
value_range_base normalize_symbolics () const;
+ static const unsigned int m_max_pairs = 2;
+ bool contains_p (tree) const;
+ unsigned num_pairs () const;
+ wide_int lower_bound (unsigned = 0) const;
+ wide_int upper_bound (unsigned) const;
+ wide_int upper_bound () const;
+ void invert ();
+
protected:
void check ();
static value_range_base union_helper (const value_range_base *,
@@ -281,21 +296,17 @@ extern bool range_int_cst_singleton_p (const value_range_base *);
extern int compare_values (tree, tree);
extern int compare_values_warnv (tree, tree, bool *);
extern int operand_less_p (tree, tree);
-extern bool vrp_val_is_min (const_tree);
-extern bool vrp_val_is_max (const_tree);
+extern bool vrp_val_is_min (const_tree, bool handle_pointers = false);
+extern bool vrp_val_is_max (const_tree, bool handle_pointers = false);
extern tree vrp_val_min (const_tree, bool handle_pointers = false);
extern tree vrp_val_max (const_tree, bool handle_pointers = false);
-extern void extract_range_from_unary_expr (value_range_base *vr,
- enum tree_code code,
- tree type,
- const value_range_base *vr0_,
- tree op0_type);
-extern void extract_range_from_binary_expr (value_range_base *,
- enum tree_code,
- tree, const value_range_base *,
- const value_range_base *);
+void range_fold_unary_expr (value_range_base *, enum tree_code, tree type,
+ const value_range_base *, tree op0_type);
+void range_fold_binary_expr (value_range_base *, enum tree_code, tree type,
+ const value_range_base *,
+ const value_range_base *);
extern bool vrp_operand_equal_p (const_tree, const_tree);
extern enum value_range_kind intersect_range_with_nonzero_bits