aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2024-04-04 15:18:06 +0200
committerRichard Biener <rguenther@suse.de>2024-05-08 10:29:33 +0200
commit245a6d478aba6499d1f649e4d35df1e858c5967c (patch)
treec4bc0893d6d3bfee61f82302c3d60649973b609e
parent9adec2d91e62a479474ae79df5b455fd4b8463ba (diff)
downloadgcc-245a6d478aba6499d1f649e4d35df1e858c5967c.zip
gcc-245a6d478aba6499d1f649e4d35df1e858c5967c.tar.gz
gcc-245a6d478aba6499d1f649e4d35df1e858c5967c.tar.bz2
Fix and speedup IDF pruning by dominator
When insert_updated_phi_nodes_for tries to skip pruning the IDF to blocks dominated by the nearest common dominator of the set of definition blocks it compares against ENTRY_BLOCK but that's never going to be the common dominator. In fact if it ever were the code fails to copy IDF to PRUNED_IDF, leading to wrong code. The following fixes that by avoiding the copy and pruning from the IDF in-place as well as using the more approprate check against the single successor of the ENTRY_BLOCK. * tree-into-ssa.cc (insert_updated_phi_nodes_for): Skip pruning when the nearest common dominator is the successor of ENTRY_BLOCK. Do not copy IDF but prune it directly.
-rw-r--r--gcc/tree-into-ssa.cc47
1 files changed, 25 insertions, 22 deletions
diff --git a/gcc/tree-into-ssa.cc b/gcc/tree-into-ssa.cc
index 705e411..3732c26 100644
--- a/gcc/tree-into-ssa.cc
+++ b/gcc/tree-into-ssa.cc
@@ -3233,7 +3233,7 @@ insert_updated_phi_nodes_for (tree var, bitmap_head *dfs,
{
basic_block entry;
def_blocks *db;
- bitmap idf, pruned_idf;
+ bitmap pruned_idf;
bitmap_iterator bi;
unsigned i;
@@ -3250,8 +3250,7 @@ insert_updated_phi_nodes_for (tree var, bitmap_head *dfs,
return;
/* Compute the initial iterated dominance frontier. */
- idf = compute_idf (db->def_blocks, dfs);
- pruned_idf = BITMAP_ALLOC (NULL);
+ pruned_idf = compute_idf (db->def_blocks, dfs);
if (TREE_CODE (var) == SSA_NAME)
{
@@ -3262,27 +3261,32 @@ insert_updated_phi_nodes_for (tree var, bitmap_head *dfs,
common dominator of all the definition blocks. */
entry = nearest_common_dominator_for_set (CDI_DOMINATORS,
db->def_blocks);
- if (entry != ENTRY_BLOCK_PTR_FOR_FN (cfun))
- EXECUTE_IF_SET_IN_BITMAP (idf, 0, i, bi)
- if (BASIC_BLOCK_FOR_FN (cfun, i) != entry
- && dominated_by_p (CDI_DOMINATORS,
- BASIC_BLOCK_FOR_FN (cfun, i), entry))
- bitmap_set_bit (pruned_idf, i);
+ if (entry != single_succ (ENTRY_BLOCK_PTR_FOR_FN (cfun)))
+ {
+ unsigned to_remove = ~0U;
+ EXECUTE_IF_SET_IN_BITMAP (pruned_idf, 0, i, bi)
+ {
+ if (to_remove != ~0U)
+ {
+ bitmap_clear_bit (pruned_idf, to_remove);
+ to_remove = ~0U;
+ }
+ if (BASIC_BLOCK_FOR_FN (cfun, i) == entry
+ || !dominated_by_p (CDI_DOMINATORS,
+ BASIC_BLOCK_FOR_FN (cfun, i), entry))
+ to_remove = i;
+ }
+ if (to_remove != ~0U)
+ bitmap_clear_bit (pruned_idf, to_remove);
+ }
}
else
- {
- /* Otherwise, do not prune the IDF for VAR. */
- gcc_checking_assert (update_flags == TODO_update_ssa_full_phi);
- bitmap_copy (pruned_idf, idf);
- }
- }
- else
- {
- /* Otherwise, VAR is a symbol that needs to be put into SSA form
- for the first time, so we need to compute the full IDF for
- it. */
- bitmap_copy (pruned_idf, idf);
+ /* Otherwise, do not prune the IDF for VAR. */
+ gcc_checking_assert (update_flags == TODO_update_ssa_full_phi);
}
+ /* Otherwise, VAR is a symbol that needs to be put into SSA form
+ for the first time, so we need to compute the full IDF for
+ it. */
if (!bitmap_empty_p (pruned_idf))
{
@@ -3309,7 +3313,6 @@ insert_updated_phi_nodes_for (tree var, bitmap_head *dfs,
}
BITMAP_FREE (pruned_idf);
- BITMAP_FREE (idf);
}
/* Sort symbols_to_rename after their DECL_UID. */