Commit c49eeac3 by Richard Biener Committed by Richard Biener

tree-vrp.h (value_range_base::symbolic_p, [...]): Move from value_range.

2018-11-12  Richard Biener  <rguenther@suse.de>

	* tree-vrp.h (value_range_base::symbolic_p,
	value_range_base::constant_p, value_range_base::zero_p,
	value_range_base::singleton_p): Move from value_range.
	(value_range::dump): Add.
	* gimple-ssa-evrp-analyze.c
	(evrp_range_analyzer::record_ranges_from_phis): Use set_varying.
	* ipa-cp.c (ipcp_vr_lattice::print): Use dump_value_range.
	* tree-ssa-threadedge.c (record_temporary_equivalences_from_phis):
	Use set_varying.
	* tree-vrp.c (value_range::symbolic_p): Move to value_range_base.
	(value_range::constant_p): Likewise.
	(value_range::singleton_p): Likewise.
	(value_range_base::dump): Add.
	(set_value_range_to_undefined): Remove.
	(set_value_range_to_varying): Likewise.
	(range_int_cst_p): Take value_range_base argument.
	(range_int_cst_singleton_p): Likewise.
	(value_range_constant_singleton): Likewise.
	(vrp_set_zero_nonzero_bits): Likewise.
	(extract_range_from_multiplicative_op): Use set_varying.
	(extract_range_from_binary_expr_1): Likewise. Use set_undefined.
	(extract_range_from_unary_expr): Likewise.
	(dump_value_range_base): Change to overload of dump_value_range.
	(vrp_prop::vrp_initialize): Use set_varying and set_undefined.
	(vrp_prop::visit_stmt): Likewise.
	(value_range::intersect_helper): Likewise.
	(value_range::union_helper): Likewise.
	(determine_value_range_1): Likewise.

From-SVN: r266028
parent bdfac905
2018-11-12 Richard Biener <rguenther@suse.de>
* tree-vrp.h (value_range_base::symbolic_p,
value_range_base::constant_p, value_range_base::zero_p,
value_range_base::singleton_p): Move from value_range.
(value_range::dump): Add.
* gimple-ssa-evrp-analyze.c
(evrp_range_analyzer::record_ranges_from_phis): Use set_varying.
* ipa-cp.c (ipcp_vr_lattice::print): Use dump_value_range.
* tree-ssa-threadedge.c (record_temporary_equivalences_from_phis):
Use set_varying.
* tree-vrp.c (value_range::symbolic_p): Move to value_range_base.
(value_range::constant_p): Likewise.
(value_range::singleton_p): Likewise.
(value_range_base::dump): Add.
(set_value_range_to_undefined): Remove.
(set_value_range_to_varying): Likewise.
(range_int_cst_p): Take value_range_base argument.
(range_int_cst_singleton_p): Likewise.
(value_range_constant_singleton): Likewise.
(vrp_set_zero_nonzero_bits): Likewise.
(extract_range_from_multiplicative_op): Use set_varying.
(extract_range_from_binary_expr_1): Likewise. Use set_undefined.
(extract_range_from_unary_expr): Likewise.
(dump_value_range_base): Change to overload of dump_value_range.
(vrp_prop::vrp_initialize): Use set_varying and set_undefined.
(vrp_prop::visit_stmt): Likewise.
(value_range::intersect_helper): Likewise.
(value_range::union_helper): Likewise.
(determine_value_range_1): Likewise.
2018-11-12 Richard Biener <rguenther@suse.de>
* tree-vrp.c (set_value_range_to_nonnull): Clear equiv.
(set_value_range_to_null): Likewise.
* vr-values.c (vr_values::extract_range_from_comparison):
......@@ -252,7 +252,7 @@ evrp_range_analyzer::record_ranges_from_phis (basic_block bb)
vr_values->extract_range_from_phi_node (phi, &vr_result);
else
{
set_value_range_to_varying (&vr_result);
vr_result.set_varying ();
/* When we have an unvisited executable predecessor we can't
use PHI arg ranges which may be still UNDEFINED but have
to use VARYING for them. But we can still resort to
......
......@@ -522,7 +522,7 @@ ipcp_bits_lattice::print (FILE *f)
void
ipcp_vr_lattice::print (FILE * f)
{
dump_value_range_base (f, &m_vr);
dump_value_range (f, &m_vr);
}
/* Print all ipcp_lattices of all functions to F. */
......
......@@ -183,7 +183,7 @@ record_temporary_equivalences_from_phis (edge e,
else if (TREE_CODE (src) == INTEGER_CST)
set_value_range_to_value (new_vr, src, NULL);
else
set_value_range_to_varying (new_vr);
new_vr->set_varying ();
/* This is a temporary range for DST, so push it. */
evrp_range_analyzer->push_value_range (dst, new_vr);
......
......@@ -49,22 +49,26 @@ public:
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 ();
void set_undefined ();
void union_ (const value_range_base *);
bool ignore_equivs_equal_p (const value_range_base &) const;
void set_varying ();
void set_undefined ();
/* Misc methods. */
tree type () const;
bool may_contain_p (tree) const;
void set_and_canonicalize (enum value_range_kind, tree, tree);
bool zero_p () const;
bool singleton_p (tree *result = NULL) const;
void dump (FILE *) const;
void dump () const;
protected:
void set (value_range_kind, tree, tree);
......@@ -100,8 +104,6 @@ class GTY((user)) value_range : public value_range_base
void union_ (const value_range *);
/* Types of value ranges. */
bool symbolic_p () const;
bool constant_p () const;
void set_undefined ();
void set_varying ();
......@@ -111,8 +113,6 @@ class GTY((user)) value_range : public value_range_base
void equiv_add (const_tree, const value_range *, bitmap_obstack * = NULL);
/* Misc methods. */
bool zero_p () const;
bool singleton_p (tree *result = NULL) const;
void deep_copy (const value_range *);
void set_and_canonicalize (enum value_range_kind, tree, tree, bitmap);
void dump (FILE *) const;
......@@ -194,7 +194,7 @@ value_range_base::undefined_p () const
/* Return TRUE if range is the constant zero. */
inline bool
value_range::zero_p () const
value_range_base::zero_p () const
{
return (m_kind == VR_RANGE
&& integer_zerop (m_min)
......@@ -202,16 +202,7 @@ value_range::zero_p () const
}
extern void dump_value_range (FILE *, const value_range *);
extern void dump_value_range_base (FILE *, const value_range_base *);
extern void extract_range_from_unary_expr (value_range *vr,
enum tree_code code,
tree type,
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);
extern void dump_value_range (FILE *, const value_range_base *);
struct assert_info
{
......@@ -231,36 +222,51 @@ struct assert_info
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_base *);
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_to_null (value_range *, tree);
extern void set_value_range (value_range *, enum value_range_kind, tree,
tree, bitmap);
extern void set_value_range_to_value (value_range *, tree, bitmap);
extern bool vrp_bitmap_equal_p (const_bitmap, const_bitmap);
extern tree value_range_constant_singleton (const value_range *);
extern tree value_range_constant_singleton (const value_range_base *);
extern bool range_int_cst_p (const value_range_base *);
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 void set_value_range_to_value (value_range *, tree, bitmap);
extern int value_inside_range (tree, tree, tree);
extern tree vrp_val_min (const_tree);
extern tree vrp_val_max (const_tree);
extern void extract_range_from_unary_expr (value_range *vr,
enum tree_code code,
tree type,
const value_range *vr0_,
tree op0_type);
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 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);
extern bool vrp_set_zero_nonzero_bits (const tree, const value_range_base *,
wide_int *, wide_int *);
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 */
......@@ -64,7 +64,7 @@ static inline void
set_value_range_to_truthvalue (value_range *vr, tree type)
{
if (TYPE_PRECISION (type) == 1)
set_value_range_to_varying (vr);
vr->set_varying ();
else
vr->update (VR_RANGE, build_int_cst (type, 0), build_int_cst (type, 1));
}
......@@ -126,7 +126,7 @@ vr_values::get_value_range (const_tree var)
vr->set_varying ();
}
else
set_value_range_to_varying (vr);
vr->set_varying ();
}
else if (TREE_CODE (sym) == RESULT_DECL
&& DECL_BY_REFERENCE (sym))
......@@ -148,7 +148,7 @@ vr_values::set_defs_to_varying (gimple *stmt)
value_range *vr = get_value_range (def);
/* Avoid writing to vr_const_varying get_value_range may return. */
if (!vr->varying_p ())
set_value_range_to_varying (vr);
vr->set_varying ();
}
}
......@@ -192,8 +192,8 @@ vr_values::update_value_range (const_tree var, value_range *new_vr)
called. */
if (new_vr->undefined_p ())
{
set_value_range_to_varying (old_vr);
set_value_range_to_varying (new_vr);
old_vr->set_varying ();
new_vr->set_varying ();
return true;
}
else
......@@ -387,7 +387,7 @@ vr_values::extract_range_for_var_from_comparison_expr (tree var,
if ((POINTER_TYPE_P (type) && cond_code != NE_EXPR && cond_code != EQ_EXPR)
|| limit == var)
{
set_value_range_to_varying (vr_p);
vr_p->set_varying ();
return;
}
......@@ -547,7 +547,7 @@ vr_values::extract_range_for_var_from_comparison_expr (tree var,
all should be optimized away above us. */
if (cond_code == LT_EXPR
&& compare_values (max, min) == 0)
set_value_range_to_varying (vr_p);
vr_p->set_varying ();
else
{
/* For LT_EXPR, we create the range [MIN, MAX - 1]. */
......@@ -587,7 +587,7 @@ vr_values::extract_range_for_var_from_comparison_expr (tree var,
all should be optimized away above us. */
if (cond_code == GT_EXPR
&& compare_values (min, max) == 0)
set_value_range_to_varying (vr_p);
vr_p->set_varying ();
else
{
/* For GT_EXPR, we create the range [MIN + 1, MAX]. */
......@@ -694,14 +694,14 @@ vr_values::extract_range_from_binary_expr (value_range *vr,
else if (is_gimple_min_invariant (op0))
set_value_range_to_value (&vr0, op0, NULL);
else
set_value_range_to_varying (&vr0);
vr0.set_varying ();
if (TREE_CODE (op1) == SSA_NAME)
vr1 = *(get_value_range (op1));
else if (is_gimple_min_invariant (op1))
set_value_range_to_value (&vr1, op1, NULL);
else
set_value_range_to_varying (&vr1);
vr1.set_varying ();
/* If one argument is varying, we can sometimes still deduce a
range for the output: any + [3, +INF] is in [MIN+3, +INF]. */
......@@ -839,7 +839,7 @@ vr_values::extract_range_from_unary_expr (value_range *vr, enum tree_code code,
else if (is_gimple_min_invariant (op0))
set_value_range_to_value (&vr0, op0, NULL);
else
set_value_range_to_varying (&vr0);
vr0.set_varying ();
::extract_range_from_unary_expr (vr, code, type, &vr0, TREE_TYPE (op0));
}
......@@ -860,7 +860,7 @@ vr_values::extract_range_from_cond_expr (value_range *vr, gassign *stmt)
else if (is_gimple_min_invariant (op0))
set_value_range_to_value (&vr0, op0, NULL);
else
set_value_range_to_varying (&vr0);
vr0.set_varying ();
tree op1 = gimple_assign_rhs3 (stmt);
value_range vr1;
......@@ -869,7 +869,7 @@ vr_values::extract_range_from_cond_expr (value_range *vr, gassign *stmt)
else if (is_gimple_min_invariant (op1))
set_value_range_to_value (&vr1, op1, NULL);
else
set_value_range_to_varying (&vr1);
vr1.set_varying ();
/* The resulting value range is the union of the operand ranges */
vr->deep_copy (&vr0);
......@@ -921,14 +921,14 @@ vr_values::check_for_binary_op_overflow (enum tree_code subcode, tree type,
else if (TREE_CODE (op0) == INTEGER_CST)
set_value_range_to_value (&vr0, op0, NULL);
else
set_value_range_to_varying (&vr0);
vr0.set_varying ();
if (TREE_CODE (op1) == SSA_NAME)
vr1 = *get_value_range (op1);
else if (TREE_CODE (op1) == INTEGER_CST)
set_value_range_to_value (&vr1, op1, NULL);
else
set_value_range_to_varying (&vr1);
vr1.set_varying ();
tree vr0min = vr0.min (), vr0max = vr0.max ();
tree vr1min = vr1.min (), vr1max = vr1.max ();
......@@ -1256,7 +1256,7 @@ vr_values::extract_range_basic (value_range *vr, gimple *stmt)
if (vr->kind () == VR_RANGE
&& (vr->min () == vr->max ()
|| operand_equal_p (vr->min (), vr->max (), 0)))
set_value_range_to_varying (vr);
vr->set_varying ();
return;
}
}
......@@ -1314,7 +1314,7 @@ vr_values::extract_range_basic (value_range *vr, gimple *stmt)
NULL);
else if (TYPE_PRECISION (type) == 1
&& !TYPE_UNSIGNED (type))
set_value_range_to_varying (vr);
vr->set_varying ();
else
set_value_range (vr, VR_RANGE, build_int_cst (type, 0),
build_int_cst (type, 1), NULL);
......@@ -1356,7 +1356,7 @@ vr_values::extract_range_basic (value_range *vr, gimple *stmt)
else if (vrp_stmt_computes_nonzero (stmt))
set_value_range_to_nonnull (vr, type);
else
set_value_range_to_varying (vr);
vr->set_varying ();
}
......@@ -1392,7 +1392,7 @@ vr_values::extract_range_from_assignment (value_range *vr, gassign *stmt)
&& is_gimple_min_invariant (gimple_assign_rhs1 (stmt)))
set_value_range_to_value (vr, gimple_assign_rhs1 (stmt), NULL);
else
set_value_range_to_varying (vr);
vr->set_varying ();
if (vr->varying_p ())
extract_range_basic (vr, stmt);
......@@ -2875,7 +2875,7 @@ vr_values::extract_range_from_phi_node (gphi *phi, value_range *vr_result)
goto update_range;
varying:
set_value_range_to_varying (vr_result);
vr_result->set_varying ();
scev_check:
/* If this is a loop PHI node SCEV may known more about its value-range.
......@@ -2896,7 +2896,7 @@ infinite_check:
|| compare_values (vr_result->min (), vr_result->max ()) > 0))
;
else
set_value_range_to_varying (vr_result);
vr_result->set_varying ();
/* If the new range is different than the previous value, keep
iterating. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment