summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2021-09-05 16:53:31 +0200
committerAldy Hernandez <aldyh@redhat.com>2021-09-05 17:27:42 +0200
commita827909537cf085e5673ca7816b7bd7151d89fc5 (patch)
tree48dce970ace777673182e5ead546faec71f60370
parent90ef15352701c6880faee83a46031d7837ab9d27 (diff)
Make the path solver's range_of_stmt() handle all statements.
The path solver's range_of_stmt() was handcuffed to only fold GIMPLE_COND statements, since those were the only statements the backward threader needed to resolve. However, there is no need for this restriction, as the folding code is perfectly capable of folding any statement. This can be the case when trying to fold other statements in the final block of a path (for instance, in the forward threader as it tries to fold candidate statements along a path). Tested on x86-64 Linux. gcc/ChangeLog: * gimple-range-path.cc (path_range_query::range_of_stmt): Remove GIMPLE_COND special casing. (path_range_query::range_defined_in_block): Use range_of_stmt instead of calling fold_range directly.
-rw-r--r--gcc/gimple-range-path.cc8
1 files changed, 3 insertions, 5 deletions
diff --git a/gcc/gimple-range-path.cc b/gcc/gimple-range-path.cc
index f4509b5a726..a4fa3b296ff 100644
--- a/gcc/gimple-range-path.cc
+++ b/gcc/gimple-range-path.cc
@@ -155,7 +155,6 @@ path_range_query::unreachable_path_p ()
}
// Return the range of STMT at the end of the path being analyzed.
-// Anything but the final conditional in a BB will return VARYING.
bool
path_range_query::range_of_stmt (irange &r, gimple *stmt, tree)
@@ -165,10 +164,9 @@ path_range_query::range_of_stmt (irange &r, gimple *stmt, tree)
if (!irange::supports_type_p (type))
return false;
- if (gimple_code (stmt) == GIMPLE_COND && fold_range (r, stmt, this))
- return true;
+ if (!fold_range (r, stmt, this))
+ r.set_varying (type);
- r.set_varying (type);
return true;
}
@@ -237,7 +235,7 @@ path_range_query::range_defined_in_block (irange &r, tree name, basic_block bb)
if (gimple_code (def_stmt) == GIMPLE_PHI)
ssa_range_in_phi (r, as_a<gphi *> (def_stmt));
- else if (!fold_range (r, def_stmt, this))
+ else if (!range_of_stmt (r, def_stmt, name))
r.set_varying (TREE_TYPE (name));
if (bb)