aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-range.cc
diff options
context:
space:
mode:
authorAndrew MacLeod <amacleod@redhat.com>2020-10-19 19:04:40 -0400
committerAndrew MacLeod <amacleod@redhat.com>2020-10-19 19:11:17 -0400
commit6e02de946125c36871bd4d8eff21f7f88f01a8aa (patch)
treed56c07a37e03501257e2682ecccc234d5a29cdff /gcc/gimple-range.cc
parentf000b7c436e62c52798187d8150216569eef17b5 (diff)
downloadgcc-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.cc12
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))