diff mbox series

Don't invoke range_of_expr multiple times.

Message ID 2f625d96-7527-d68c-993d-e12c0855da9b@redhat.com
State New
Headers show
Series Don't invoke range_of_expr multiple times. | expand

Commit Message

Andrew MacLeod Oct. 16, 2020, 7:09 p.m. UTC
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
diff mbox series

Patch

2020-10-16  Andrew MacLeod  <amacleod@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);
 }