aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2023-02-09 11:03:25 +0100
committerRichard Biener <rguenther@suse.de>2023-02-15 08:28:08 +0100
commitec23e9e25eb64bb066dc408fd498861b8587bec8 (patch)
tree355e43af0d628458d36c962120fd36d743f91f04
parent05467d08e777b72f57c50f7ef0430f8cf0edd8e1 (diff)
downloadgcc-ec23e9e25eb64bb066dc408fd498861b8587bec8.zip
gcc-ec23e9e25eb64bb066dc408fd498861b8587bec8.tar.gz
gcc-ec23e9e25eb64bb066dc408fd498861b8587bec8.tar.bz2
target/108738 - STV bitmap operations compile-time hog
When the set of candidates becomes very large then repeated bit checks on it during the build of an actual chain can become slow because of the O(n) nature of bitmap tests. The following switches the candidates bitmaps to the tree representation before building the chains to get O(log n) amortized behavior. For the testcase at hand this improves STV time by 50%. PR target/108738 * config/i386/i386-features.cc (convert_scalars_to_vector): Switch candidates bitmaps to tree view before building the chains.
-rw-r--r--gcc/config/i386/i386-features.cc49
1 files changed, 26 insertions, 23 deletions
diff --git a/gcc/config/i386/i386-features.cc b/gcc/config/i386/i386-features.cc
index ec13d4e..9bd6d86 100644
--- a/gcc/config/i386/i386-features.cc
+++ b/gcc/config/i386/i386-features.cc
@@ -2283,30 +2283,33 @@ convert_scalars_to_vector (bool timode_p)
fprintf (dump_file, "There are no candidates for optimization.\n");
for (unsigned i = 0; i <= 2; ++i)
- while (!bitmap_empty_p (&candidates[i]))
- {
- unsigned uid = bitmap_first_set_bit (&candidates[i]);
- scalar_chain *chain;
-
- if (cand_mode[i] == TImode)
- chain = new timode_scalar_chain;
- else
- chain = new general_scalar_chain (cand_mode[i], cand_vmode[i]);
-
- /* Find instructions chain we want to convert to vector mode.
- Check all uses and definitions to estimate all required
- conversions. */
- chain->build (&candidates[i], uid);
-
- if (chain->compute_convert_gain () > 0)
- converted_insns += chain->convert ();
- else
- if (dump_file)
- fprintf (dump_file, "Chain #%d conversion is not profitable\n",
- chain->chain_id);
+ {
+ bitmap_tree_view (&candidates[i]);
+ while (!bitmap_empty_p (&candidates[i]))
+ {
+ unsigned uid = bitmap_first_set_bit (&candidates[i]);
+ scalar_chain *chain;
- delete chain;
- }
+ if (cand_mode[i] == TImode)
+ chain = new timode_scalar_chain;
+ else
+ chain = new general_scalar_chain (cand_mode[i], cand_vmode[i]);
+
+ /* Find instructions chain we want to convert to vector mode.
+ Check all uses and definitions to estimate all required
+ conversions. */
+ chain->build (&candidates[i], uid);
+
+ if (chain->compute_convert_gain () > 0)
+ converted_insns += chain->convert ();
+ else
+ if (dump_file)
+ fprintf (dump_file, "Chain #%d conversion is not profitable\n",
+ chain->chain_id);
+
+ delete chain;
+ }
+ }
if (dump_file)
fprintf (dump_file, "Total insns converted: %d\n", converted_insns);