aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/testsuite/gcc.dg/tree-ssa/evrp4.c2
-rw-r--r--gcc/value-range-pretty-print.cc33
-rw-r--r--gcc/value-range-pretty-print.h2
-rw-r--r--gcc/value-range.cc8
4 files changed, 30 insertions, 15 deletions
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/evrp4.c b/gcc/testsuite/gcc.dg/tree-ssa/evrp4.c
index e3f4531..895109f 100644
--- a/gcc/testsuite/gcc.dg/tree-ssa/evrp4.c
+++ b/gcc/testsuite/gcc.dg/tree-ssa/evrp4.c
@@ -17,4 +17,4 @@ int bar (struct st *s)
foo (&s->a);
}
-/* { dg-final { scan-tree-dump "\\\[1B, \\+INF\\\]" "evrp" } } */
+/* { dg-final { scan-tree-dump "\\\[1, \\+INF\\\]" "evrp" } } */
diff --git a/gcc/value-range-pretty-print.cc b/gcc/value-range-pretty-print.cc
index 485612f..cbf50d3 100644
--- a/gcc/value-range-pretty-print.cc
+++ b/gcc/value-range-pretty-print.cc
@@ -63,38 +63,45 @@ vrange_printer::visit (const irange &r) const
pp_string (pp, "VARYING");
return;
}
- for (unsigned i = 0; i < r.num_pairs (); ++i)
+ // Handle legacy symbolics.
+ if (!r.constant_p ())
{
- tree lb = wide_int_to_tree (r.type (), r.lower_bound (i));
- tree ub = wide_int_to_tree (r.type (), r.upper_bound (i));
+ if (r.kind () == VR_ANTI_RANGE)
+ pp_character (pp, '~');
pp_character (pp, '[');
- print_irange_bound (lb);
+ dump_generic_node (pp, r.min (), 0, TDF_NONE, false);
pp_string (pp, ", ");
- print_irange_bound (ub);
+ dump_generic_node (pp, r.max (), 0, TDF_NONE, false);
+ pp_character (pp, ']');
+ print_irange_bitmasks (r);
+ return;
+ }
+ for (unsigned i = 0; i < r.num_pairs (); ++i)
+ {
+ pp_character (pp, '[');
+ print_irange_bound (r.lower_bound (i), r.type ());
+ pp_string (pp, ", ");
+ print_irange_bound (r.upper_bound (i), r.type ());
pp_character (pp, ']');
}
print_irange_bitmasks (r);
}
void
-vrange_printer::print_irange_bound (tree bound) const
+vrange_printer::print_irange_bound (const wide_int &bound, tree type) const
{
- tree type = TREE_TYPE (bound);
wide_int type_min = wi::min_value (TYPE_PRECISION (type), TYPE_SIGN (type));
wide_int type_max = wi::max_value (TYPE_PRECISION (type), TYPE_SIGN (type));
if (INTEGRAL_TYPE_P (type)
&& !TYPE_UNSIGNED (type)
- && TREE_CODE (bound) == INTEGER_CST
- && wi::to_wide (bound) == type_min
+ && bound == type_min
&& TYPE_PRECISION (type) != 1)
pp_string (pp, "-INF");
- else if (TREE_CODE (bound) == INTEGER_CST
- && wi::to_wide (bound) == type_max
- && TYPE_PRECISION (type) != 1)
+ else if (bound == type_max && TYPE_PRECISION (type) != 1)
pp_string (pp, "+INF");
else
- dump_generic_node (pp, bound, 0, TDF_NONE, false);
+ pp_wide_int (pp, bound, TYPE_SIGN (type));
}
void
diff --git a/gcc/value-range-pretty-print.h b/gcc/value-range-pretty-print.h
index c1c7c42..ad06c93 100644
--- a/gcc/value-range-pretty-print.h
+++ b/gcc/value-range-pretty-print.h
@@ -29,7 +29,7 @@ public:
void visit (const irange &) const override;
void visit (const frange &) const override;
private:
- void print_irange_bound (tree bound) const;
+ void print_irange_bound (const wide_int &w, tree type) const;
void print_irange_bitmasks (const irange &) const;
void print_frange_prop (const char *str, const fp_prop &) const;
diff --git a/gcc/value-range.cc b/gcc/value-range.cc
index e49b06d..2923f4f 100644
--- a/gcc/value-range.cc
+++ b/gcc/value-range.cc
@@ -2593,6 +2593,14 @@ irange::get_nonzero_bits () const
{
gcc_checking_assert (!undefined_p ());
+ // In case anyone in the legacy world queries us.
+ if (!constant_p ())
+ {
+ if (m_nonzero_mask)
+ return wi::to_wide (m_nonzero_mask);
+ return wi::shwi (-1, TYPE_PRECISION (type ()));
+ }
+
// Calculate the nonzero bits inherent in the range.
wide_int min = lower_bound ();
wide_int max = upper_bound ();