aboutsummaryrefslogtreecommitdiff
path: root/gcc/gimple-range-path.cc
diff options
context:
space:
mode:
authorAldy Hernandez <aldyh@redhat.com>2021-11-24 09:43:36 +0100
committerAldy Hernandez <aldyh@redhat.com>2021-11-25 11:51:21 +0100
commit8acbd7bef6edbf537e3037174907029b530212f6 (patch)
treeaf3c72a02705b7ba336706efd779b67af58357ce /gcc/gimple-range-path.cc
parent94912212d3d1be0b1c490e9b5f45165ef5f30d8a (diff)
downloadgcc-8acbd7bef6edbf537e3037174907029b530212f6.zip
gcc-8acbd7bef6edbf537e3037174907029b530212f6.tar.gz
gcc-8acbd7bef6edbf537e3037174907029b530212f6.tar.bz2
path solver: Compute ranges in path in gimple order.
Andrew's patch for this PR103254 papered over some underlying performance issues in the path solver that I'd like to address. We are currently solving the SSA's defined in the current block in bitmap order, which amounts to random order for all purposes. This is causing unnecessary recursion in gori. This patch changes the order to gimple order, thus solving dependencies before uses. There is no change in threadable paths with this change. Tested on x86-64 & ppc64le Linux. gcc/ChangeLog: PR tree-optimization/103254 * gimple-range-path.cc (path_range_query::compute_ranges_defined): New (path_range_query::compute_ranges_in_block): Move to compute_ranges_defined. * gimple-range-path.h (compute_ranges_defined): New.
Diffstat (limited to 'gcc/gimple-range-path.cc')
-rw-r--r--gcc/gimple-range-path.cc33
1 files changed, 22 insertions, 11 deletions
diff --git a/gcc/gimple-range-path.cc b/gcc/gimple-range-path.cc
index 4aa666d..e240866 100644
--- a/gcc/gimple-range-path.cc
+++ b/gcc/gimple-range-path.cc
@@ -401,6 +401,27 @@ path_range_query::compute_ranges_in_phis (basic_block bb)
}
}
+// Compute ranges defined in block.
+
+void
+path_range_query::compute_ranges_defined (basic_block bb)
+{
+ int_range_max r;
+
+ compute_ranges_in_phis (bb);
+
+ // Iterate in gimple order to minimize recursion.
+ for (auto gsi = gsi_start_nondebug_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi))
+ if (gimple_has_lhs (gsi_stmt (gsi)))
+ {
+ tree name = gimple_get_lhs (gsi_stmt (gsi));
+ if (TREE_CODE (name) == SSA_NAME
+ && bitmap_bit_p (m_imports, SSA_NAME_VERSION (name))
+ && range_defined_in_block (r, name, bb))
+ set_cache (r, name);
+ }
+}
+
// Compute ranges defined in the current block, or exported to the
// next block.
@@ -423,17 +444,7 @@ path_range_query::compute_ranges_in_block (basic_block bb)
clear_cache (name);
}
- // Solve imports defined in this block, starting with the PHIs...
- compute_ranges_in_phis (bb);
- // ...and then the rest of the imports.
- EXECUTE_IF_SET_IN_BITMAP (m_imports, 0, i, bi)
- {
- tree name = ssa_name (i);
-
- if (gimple_code (SSA_NAME_DEF_STMT (name)) != GIMPLE_PHI
- && range_defined_in_block (r, name, bb))
- set_cache (r, name);
- }
+ compute_ranges_defined (bb);
if (at_exit ())
return;