In the hybrid folder, range_of_stmt and range_on_edge invoke the same
routines in both evrp_folder and ranger_folder and compare results.
In implementing hybrid folder, I inherited it from evrp_folder since
EVRP has a few pre-and post statement things to do.
when the hybdrid folder calls evrp_folder::range_on_edge (or stmt) the
evrp folder simple invokes range_of_expr() for evaluation.
Because I inherited from evrp_folder, this actually calls
hybrid_folder::range_of_expr(), which in turns invokes both evrp_folder
AND ranger on the query.
This was not my intention, and results in additional ranger queries
without any context. Instead, the calls should be made directly to
evrp_folder::range_of_expr.
Bootstrapped on x86_64-pc-linux-gnu, no regressions, pushed.
Andrew
2020-10-16 Andrew MacLeod <amacl...@redhat.com>
* gimple-ssa-evrp.c (hybrid_folder::value_on_edge): Call
evrp_folder::value_of_expr directly.
(hybrid_folder::value_of_stmt): Ditto.
diff --git a/gcc/gimple-ssa-evrp.c b/gcc/gimple-ssa-evrp.c
index 7688e4aa4bd..309cdd94c21 100644
--- a/gcc/gimple-ssa-evrp.c
+++ b/gcc/gimple-ssa-evrp.c
@@ -239,7 +239,9 @@ hybrid_folder::value_of_expr (tree op, gimple *stmt)
tree
hybrid_folder::value_on_edge (edge e, tree op)
{
- tree evrp_ret = evrp_folder::value_on_edge (e, op);
+ // Call evrp::value_of_expr directly. Otherwise another dual call is made
+ // via hybrid_folder::value_of_expr, but without an edge.
+ tree evrp_ret = evrp_folder::value_of_expr (op, NULL);
tree ranger_ret = m_ranger->value_on_edge (e, op);
return choose_value (evrp_ret, ranger_ret);
}
@@ -247,7 +249,14 @@ hybrid_folder::value_on_edge (edge e, tree op)
tree
hybrid_folder::value_of_stmt (gimple *stmt, tree op)
{
- tree evrp_ret = evrp_folder::value_of_stmt (stmt, op);
+ // Call evrp::value_of_expr directly. Otherwise another dual call is made
+ // via hybrid_folder::value_of_expr, but without a stmt.
+ tree evrp_ret;
+ if (op)
+ evrp_ret = evrp_folder::value_of_expr (op, NULL);
+ else
+ evrp_ret = NULL_TREE;
+
tree ranger_ret = m_ranger->value_of_stmt (stmt, op);
return choose_value (evrp_ret, ranger_ret);
}