Move plain value_range things to value-range.[hc]*.
From-SVN: r278153
This commit is contained in:
parent
425ea30f79
commit
cca78449be
7 changed files with 1783 additions and 1740 deletions
|
@ -1,9 +1,30 @@
|
|||
2019-11-13 Aldy Hernandez <aldyh@redhat.com>
|
||||
|
||||
* Makefile.in (OBJS): Add value-range.o.
|
||||
(GTFILES): Add value-range.h.
|
||||
* gengtype.c (open_base_files): Add value-range.h to list of
|
||||
header files.
|
||||
* tree-vrp.c: Move the following value_range related functions:
|
||||
ranges_from_anti_range, value_range, check, equal_p, symbolic_p,
|
||||
constant_p, set_undefined, set_varying, may_contain_p,
|
||||
singleton_p, type, dump, dump_value_range, debug, vrp_val_max,
|
||||
vrp_val_min, vrp_val_is_min, vrp_val_is_max, set, set_nonzero,
|
||||
set_zero, vrp_operand_equal_p, range_has_numeric_bounds_p,
|
||||
value_inside_range, ranges_from_anti_range, union_ranges,
|
||||
intersect_ranges, intersect_helper, union_helper, union_,
|
||||
normalize_addresses, normalize_symbolics, num_pairs, lower_bound,
|
||||
upper_bound, contains_p, invert, intersect...
|
||||
* value-range.cc: ...to here.
|
||||
* tree-vrp.h: Move class value_range, enum_value_range_kind, and
|
||||
associated inline methods from here...
|
||||
* value-range.h: ...to here.
|
||||
|
||||
2019-11-13 Dragan Mladjenovic <dmladjenovic@wavecomp.com>
|
||||
|
||||
* config/mips/mips.md (rotr<mode>3): Sanitize the constant argument
|
||||
instead of asserting its value.
|
||||
|
||||
2019-11-13 Aldy Hernandez <aldyh@redhat.com>
|
||||
(2019-11-13 Aldy Hernandez <aldyh@redhat.com>
|
||||
|
||||
* gimple-fold.c (size_must_be_zero_p): Rewrite use of value_range
|
||||
constructors and set methods so value_range_kind is the last
|
||||
|
|
|
@ -1602,6 +1602,7 @@ OBJS = \
|
|||
typed-splay-tree.o \
|
||||
unique-ptr-tests.o \
|
||||
valtrack.o \
|
||||
value-range.o \
|
||||
value-prof.o \
|
||||
var-tracking.o \
|
||||
varasm.o \
|
||||
|
@ -2589,6 +2590,7 @@ GTFILES = $(CPPLIB_H) $(srcdir)/input.h $(srcdir)/coretypes.h \
|
|||
$(srcdir)/target-globals.h \
|
||||
$(srcdir)/ipa-predicate.h \
|
||||
$(srcdir)/ipa-fnsummary.h \
|
||||
$(srcdir)/value-range.h \
|
||||
$(srcdir)/vtable-verify.c \
|
||||
$(srcdir)/asan.c \
|
||||
$(srcdir)/ubsan.c \
|
||||
|
|
|
@ -1717,6 +1717,7 @@ open_base_files (void)
|
|||
"explow.h", "calls.h", "memmodel.h", "emit-rtl.h", "varasm.h",
|
||||
"stmt.h", "expr.h", "alloc-pool.h", "cselib.h", "insn-addr.h",
|
||||
"optabs.h", "libfuncs.h", "debug.h", "internal-fn.h", "gimple-fold.h",
|
||||
"value-range.h",
|
||||
"tree-eh.h", "gimple-iterator.h", "gimple-ssa.h", "tree-cfg.h",
|
||||
"tree-vrp.h", "tree-phinodes.h", "ssa-iterators.h", "stringpool.h",
|
||||
"tree-ssanames.h", "tree-ssa-loop.h", "tree-ssa-loop-ivopts.h",
|
||||
|
|
1536
gcc/tree-vrp.c
1536
gcc/tree-vrp.c
File diff suppressed because it is too large
Load diff
204
gcc/tree-vrp.h
204
gcc/tree-vrp.h
|
@ -20,103 +20,7 @@ along with GCC; see the file COPYING3. If not see
|
|||
#ifndef GCC_TREE_VRP_H
|
||||
#define GCC_TREE_VRP_H
|
||||
|
||||
/* 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. */
|
||||
class GTY((for_user)) value_range
|
||||
{
|
||||
friend void range_tests ();
|
||||
public:
|
||||
value_range ();
|
||||
value_range (tree, tree, value_range_kind = VR_RANGE);
|
||||
value_range (tree type, const wide_int &, const wide_int &,
|
||||
value_range_kind = VR_RANGE);
|
||||
value_range (tree type);
|
||||
|
||||
void set (tree, tree, value_range_kind = VR_RANGE);
|
||||
void set (tree);
|
||||
void set_nonzero (tree);
|
||||
void set_zero (tree);
|
||||
|
||||
enum value_range_kind kind () const;
|
||||
tree min () const;
|
||||
tree max () const;
|
||||
|
||||
/* Types of value ranges. */
|
||||
bool symbolic_p () const;
|
||||
bool constant_p () const;
|
||||
bool undefined_p () const;
|
||||
bool varying_p () const;
|
||||
void set_varying (tree type);
|
||||
void set_undefined ();
|
||||
|
||||
void union_ (const value_range *);
|
||||
void intersect (const value_range *);
|
||||
void union_ (const value_range &);
|
||||
void intersect (const value_range &);
|
||||
|
||||
bool operator== (const value_range &) const;
|
||||
bool operator!= (const value_range &) const /* = delete */;
|
||||
bool equal_p (const value_range &) const;
|
||||
|
||||
/* Misc methods. */
|
||||
tree type () const;
|
||||
bool may_contain_p (tree) const;
|
||||
bool zero_p () const;
|
||||
bool nonzero_p () const;
|
||||
bool singleton_p (tree *result = NULL) const;
|
||||
void dump (FILE *) const;
|
||||
void dump () const;
|
||||
|
||||
static bool supports_type_p (tree);
|
||||
value_range normalize_symbolics () const;
|
||||
value_range normalize_addresses () 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 union_helper (const value_range *, const value_range *);
|
||||
static value_range intersect_helper (const value_range *,
|
||||
const value_range *);
|
||||
|
||||
enum value_range_kind m_kind;
|
||||
|
||||
tree m_min;
|
||||
tree m_max;
|
||||
|
||||
friend void gt_ggc_mx_value_range (void *);
|
||||
friend void gt_pch_p_11value_range (void *, void *,
|
||||
gt_pointer_operator, void *);
|
||||
friend void gt_pch_nx_value_range (void *);
|
||||
friend void gt_ggc_mx (value_range &);
|
||||
friend void gt_ggc_mx (value_range *&);
|
||||
friend void gt_pch_nx (value_range &);
|
||||
friend void gt_pch_nx (value_range *, gt_pointer_operator, void *);
|
||||
|
||||
private:
|
||||
int value_inside_range (tree) const;
|
||||
};
|
||||
#include "value-range.h"
|
||||
|
||||
/* Note value_range_equiv cannot currently be used with GC memory,
|
||||
only value_range is fully set up for this. */
|
||||
|
@ -173,13 +77,6 @@ class GTY((user)) value_range_equiv : public value_range
|
|||
bitmap m_equiv;
|
||||
};
|
||||
|
||||
inline
|
||||
value_range::value_range ()
|
||||
{
|
||||
m_kind = VR_UNDEFINED;
|
||||
m_min = m_max = NULL;
|
||||
}
|
||||
|
||||
inline
|
||||
value_range_equiv::value_range_equiv ()
|
||||
: value_range ()
|
||||
|
@ -187,64 +84,13 @@ value_range_equiv::value_range_equiv ()
|
|||
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::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::zero_p () const
|
||||
{
|
||||
return (m_kind == VR_RANGE
|
||||
&& integer_zerop (m_min)
|
||||
&& integer_zerop (m_max));
|
||||
}
|
||||
|
||||
extern void dump_value_range (FILE *, const value_range_equiv *);
|
||||
extern void dump_value_range (FILE *, const value_range *);
|
||||
|
||||
struct assert_info
|
||||
{
|
||||
|
@ -261,17 +107,6 @@ struct assert_info
|
|||
tree expr;
|
||||
};
|
||||
|
||||
// Return true if TYPE is a valid type for value_range to operate on.
|
||||
// Otherwise return FALSE.
|
||||
|
||||
inline bool
|
||||
value_range::supports_type_p (tree type)
|
||||
{
|
||||
if (type && (INTEGRAL_TYPE_P (type) || POINTER_TYPE_P (type)))
|
||||
return type;
|
||||
return false;
|
||||
}
|
||||
|
||||
extern void register_edge_assert_for (tree, edge, enum tree_code,
|
||||
tree, tree, vec<assert_info> &);
|
||||
extern bool stmt_interesting_for_vrp (gimple *);
|
||||
|
@ -282,18 +117,12 @@ extern bool range_int_cst_p (const value_range *);
|
|||
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 tree vrp_val_min (const_tree);
|
||||
extern tree vrp_val_max (const_tree);
|
||||
|
||||
void range_fold_unary_expr (value_range *, enum tree_code, tree type,
|
||||
const value_range *, tree op0_type);
|
||||
void range_fold_binary_expr (value_range *, enum tree_code, tree type,
|
||||
const value_range *, const value_range *);
|
||||
|
||||
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);
|
||||
|
||||
|
@ -304,35 +133,4 @@ 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 *);
|
||||
|
||||
/* Return TRUE if range is nonzero. */
|
||||
|
||||
inline bool
|
||||
value_range::nonzero_p () const
|
||||
{
|
||||
if (m_kind == VR_ANTI_RANGE
|
||||
&& !TYPE_UNSIGNED (type ())
|
||||
&& integer_zerop (m_min)
|
||||
&& integer_zerop (m_max))
|
||||
return true;
|
||||
|
||||
return (m_kind == VR_RANGE
|
||||
&& TYPE_UNSIGNED (type ())
|
||||
&& integer_onep (m_min)
|
||||
&& vrp_val_is_max (m_max));
|
||||
}
|
||||
|
||||
/* Return TRUE if *VR includes the value zero. */
|
||||
|
||||
inline bool
|
||||
range_includes_zero_p (const value_range *vr)
|
||||
{
|
||||
if (vr->undefined_p ())
|
||||
return false;
|
||||
|
||||
if (vr->varying_p ())
|
||||
return true;
|
||||
|
||||
return vr->may_contain_p (build_zero_cst (vr->type ()));
|
||||
}
|
||||
|
||||
#endif /* GCC_TREE_VRP_H */
|
||||
|
|
1541
gcc/value-range.cc
Normal file
1541
gcc/value-range.cc
Normal file
File diff suppressed because it is too large
Load diff
216
gcc/value-range.h
Normal file
216
gcc/value-range.h
Normal file
|
@ -0,0 +1,216 @@
|
|||
/* Support routines for value ranges.
|
||||
Copyright (C) 2019 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GCC.
|
||||
|
||||
GCC is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3, or (at your option)
|
||||
any later version.
|
||||
|
||||
GCC is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GCC; see the file COPYING3. If not see
|
||||
<http://www.gnu.org/licenses/>. */
|
||||
|
||||
#ifndef GCC_VALUE_RANGE_H
|
||||
#define GCC_VALUE_RANGE_H
|
||||
|
||||
/* 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.
|
||||
|
||||
class GTY((for_user)) value_range
|
||||
{
|
||||
friend void range_tests ();
|
||||
public:
|
||||
value_range ();
|
||||
value_range (tree, tree, value_range_kind = VR_RANGE);
|
||||
value_range (tree type, const wide_int &, const wide_int &,
|
||||
value_range_kind = VR_RANGE);
|
||||
value_range (tree type);
|
||||
|
||||
void set (tree, tree, value_range_kind = VR_RANGE);
|
||||
void set (tree);
|
||||
void set_nonzero (tree);
|
||||
void set_zero (tree);
|
||||
|
||||
enum value_range_kind kind () const;
|
||||
tree min () const;
|
||||
tree max () const;
|
||||
|
||||
/* Types of value ranges. */
|
||||
bool symbolic_p () const;
|
||||
bool constant_p () const;
|
||||
bool undefined_p () const;
|
||||
bool varying_p () const;
|
||||
void set_varying (tree type);
|
||||
void set_undefined ();
|
||||
|
||||
void union_ (const value_range *);
|
||||
void intersect (const value_range *);
|
||||
void union_ (const value_range &);
|
||||
void intersect (const value_range &);
|
||||
|
||||
bool operator== (const value_range &) const;
|
||||
bool operator!= (const value_range &) const /* = delete */;
|
||||
bool equal_p (const value_range &) const;
|
||||
|
||||
/* Misc methods. */
|
||||
tree type () const;
|
||||
bool may_contain_p (tree) const;
|
||||
bool zero_p () const;
|
||||
bool nonzero_p () const;
|
||||
bool singleton_p (tree *result = NULL) const;
|
||||
void dump (FILE *) const;
|
||||
void dump () const;
|
||||
|
||||
static bool supports_type_p (tree);
|
||||
value_range normalize_symbolics () const;
|
||||
value_range normalize_addresses () 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 union_helper (const value_range *, const value_range *);
|
||||
static value_range intersect_helper (const value_range *,
|
||||
const value_range *);
|
||||
|
||||
friend void gt_ggc_mx_value_range (void *);
|
||||
friend void gt_pch_p_11value_range (void *, void *,
|
||||
gt_pointer_operator, void *);
|
||||
friend void gt_pch_nx_value_range (void *);
|
||||
friend void gt_ggc_mx (value_range &);
|
||||
friend void gt_ggc_mx (value_range *&);
|
||||
friend void gt_pch_nx (value_range &);
|
||||
friend void gt_pch_nx (value_range *, gt_pointer_operator, void *);
|
||||
|
||||
enum value_range_kind m_kind;
|
||||
tree m_min;
|
||||
tree m_max;
|
||||
|
||||
private:
|
||||
int value_inside_range (tree) const;
|
||||
};
|
||||
|
||||
extern bool range_has_numeric_bounds_p (const value_range *);
|
||||
extern bool ranges_from_anti_range (const value_range *,
|
||||
value_range *, value_range *);
|
||||
extern void dump_value_range (FILE *, const value_range *);
|
||||
extern bool vrp_val_is_min (const_tree);
|
||||
extern bool vrp_val_is_max (const_tree);
|
||||
extern tree vrp_val_min (const_tree);
|
||||
extern tree vrp_val_max (const_tree);
|
||||
extern bool vrp_operand_equal_p (const_tree, const_tree);
|
||||
|
||||
inline
|
||||
value_range::value_range ()
|
||||
{
|
||||
m_kind = VR_UNDEFINED;
|
||||
m_min = m_max = NULL;
|
||||
}
|
||||
|
||||
inline value_range_kind
|
||||
value_range::kind () const
|
||||
{
|
||||
return m_kind;
|
||||
}
|
||||
|
||||
inline tree
|
||||
value_range::type () const
|
||||
{
|
||||
return TREE_TYPE (min ());
|
||||
}
|
||||
|
||||
inline tree
|
||||
value_range::min () const
|
||||
{
|
||||
return m_min;
|
||||
}
|
||||
|
||||
inline tree
|
||||
value_range::max () const
|
||||
{
|
||||
return m_max;
|
||||
}
|
||||
|
||||
inline bool
|
||||
value_range::varying_p () const
|
||||
{
|
||||
return m_kind == VR_VARYING;
|
||||
}
|
||||
|
||||
inline bool
|
||||
value_range::undefined_p () const
|
||||
{
|
||||
return m_kind == VR_UNDEFINED;
|
||||
}
|
||||
|
||||
inline bool
|
||||
value_range::zero_p () const
|
||||
{
|
||||
return (m_kind == VR_RANGE
|
||||
&& integer_zerop (m_min)
|
||||
&& integer_zerop (m_max));
|
||||
}
|
||||
|
||||
inline bool
|
||||
value_range::nonzero_p () const
|
||||
{
|
||||
if (m_kind == VR_ANTI_RANGE
|
||||
&& !TYPE_UNSIGNED (type ())
|
||||
&& integer_zerop (m_min)
|
||||
&& integer_zerop (m_max))
|
||||
return true;
|
||||
|
||||
return (m_kind == VR_RANGE
|
||||
&& TYPE_UNSIGNED (type ())
|
||||
&& integer_onep (m_min)
|
||||
&& vrp_val_is_max (m_max));
|
||||
}
|
||||
|
||||
inline bool
|
||||
value_range::supports_type_p (tree type)
|
||||
{
|
||||
if (type && (INTEGRAL_TYPE_P (type) || POINTER_TYPE_P (type)))
|
||||
return type;
|
||||
return false;
|
||||
}
|
||||
|
||||
inline bool
|
||||
range_includes_zero_p (const value_range *vr)
|
||||
{
|
||||
if (vr->undefined_p ())
|
||||
return false;
|
||||
|
||||
if (vr->varying_p ())
|
||||
return true;
|
||||
|
||||
return vr->may_contain_p (build_zero_cst (vr->type ()));
|
||||
}
|
||||
|
||||
#endif // GCC_VALUE_RANGE_H
|
Loading…
Add table
Reference in a new issue