diff options
author | Andrew MacLeod <amacleod@redhat.com> | 2020-10-19 19:04:40 -0400 |
---|---|---|
committer | Andrew MacLeod <amacleod@redhat.com> | 2020-10-19 19:11:17 -0400 |
commit | 6e02de946125c36871bd4d8eff21f7f88f01a8aa (patch) | |
tree | d56c07a37e03501257e2682ecccc234d5a29cdff /gcc/gimple-range.cc | |
parent | f000b7c436e62c52798187d8150216569eef17b5 (diff) | |
download | gcc-6e02de946125c36871bd4d8eff21f7f88f01a8aa.zip gcc-6e02de946125c36871bd4d8eff21f7f88f01a8aa.tar.gz gcc-6e02de946125c36871bd4d8eff21f7f88f01a8aa.tar.bz2 |
Use precision and sign to compare types for ranges
Sanity check ranges by comparing just SIGN and PRECISION.
gcc/
PR tree-optimization/97360
* gimple-range.h (range_compatible_p): New.
* gimple-range-gori.cc (is_gimple_logical_p): Use range_compatible_p.
(range_is_either_true_or_false): Ditto.
(gori_compute::outgoing_edge_range_p): Cast result to the correct
type if necessary.
(logical_stmt_cache::cacheable_p): Use range_compatible_p.
* gimple-range.cc (gimple_ranger::calc_stmt): Check range_compatible_p
before casting the range.
(gimple_ranger::range_on_exit): Use range_compatible_p.
(gimple_ranger::range_on_edge): Ditto.
gcc/testsuite/
* gcc.dg/pr97360-2.c: New test.
Diffstat (limited to 'gcc/gimple-range.cc')
-rw-r--r-- | gcc/gimple-range.cc | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/gcc/gimple-range.cc b/gcc/gimple-range.cc index 999d631..e4864ba 100644 --- a/gcc/gimple-range.cc +++ b/gcc/gimple-range.cc @@ -392,8 +392,14 @@ gimple_ranger::calc_stmt (irange &r, gimple *s, tree name) { if (r.undefined_p ()) return true; + // We sometimes get compatible types copied from operands, make sure + // the correct type is being returned. if (name && TREE_TYPE (name) != r.type ()) - range_cast (r, TREE_TYPE (name)); + { + gcc_checking_assert (range_compatible_p (r.type (), + TREE_TYPE (name))); + range_cast (r, TREE_TYPE (name)); + } return true; } return false; @@ -928,7 +934,7 @@ gimple_ranger::range_on_exit (irange &r, basic_block bb, tree name) else gcc_assert (range_of_expr (r, name, s)); gcc_checking_assert (r.undefined_p () - || types_compatible_p (r.type(), TREE_TYPE (name))); + || range_compatible_p (r.type (), TREE_TYPE (name))); } // Calculate a range for NAME on edge E and return it in R. @@ -948,7 +954,7 @@ gimple_ranger::range_on_edge (irange &r, edge e, tree name) range_on_exit (r, e->src, name); gcc_checking_assert (r.undefined_p () - || types_compatible_p (r.type(), TREE_TYPE (name))); + || range_compatible_p (r.type(), TREE_TYPE (name))); // Check to see if NAME is defined on edge e. if (m_cache.outgoing_edge_range_p (edge_range, e, name)) |