commit:     69d385f037f98eb238a58176d58aa628a1b2a2f8
Author:     Sam James <sam <AT> gentoo <DOT> org>
AuthorDate: Mon Jan  6 04:12:18 2025 +0000
Commit:     Sam James <sam <AT> gentoo <DOT> org>
CommitDate: Mon Jan  6 04:13:47 2025 +0000
URL:        https://gitweb.gentoo.org/proj/gcc-patches.git/commit/?id=69d385f0

15.0.0: update switch-conversion patch

mjw's change is far smaller and targeted, so switch to that.

Bug: https://gcc.gnu.org/PR118032
Signed-off-by: Sam James <sam <AT> gentoo.org>

 ...le-Add-limit-after-which-slower-switchlow.patch | 238 ---------------------
 ...-conversion-don-t-apply-switch-size-limit.patch |  51 +++++
 15.0.0/gentoo/README.history                       |   2 +
 3 files changed, 53 insertions(+), 238 deletions(-)

diff --git 
a/15.0.0/gentoo/78_all_PR118032-Revert-gimple-Add-limit-after-which-slower-switchlow.patch
 
b/15.0.0/gentoo/78_all_PR118032-Revert-gimple-Add-limit-after-which-slower-switchlow.patch
deleted file mode 100644
index d7f2c46..0000000
--- 
a/15.0.0/gentoo/78_all_PR118032-Revert-gimple-Add-limit-after-which-slower-switchlow.patch
+++ /dev/null
@@ -1,238 +0,0 @@
-From 7305d9452ae9bfc3ee299a194b103e4a4786b0ee Mon Sep 17 00:00:00 2001
-Message-ID: 
<7305d9452ae9bfc3ee299a194b103e4a4786b0ee.1734674183.git....@gentoo.org>
-From: Sam James <s...@gentoo.org>
-Date: Fri, 20 Dec 2024 05:56:03 +0000
-Subject: [PATCH] Revert "gimple: Add limit after which slower switchlower algs
- are used [PR117091] [PR117352]"
-
-This reverts commit 56946c801a7cf3a831a11870b7e11ba08bf9bd87.
-
-Bug: https://gcc.gnu.org/PR118032
----
- gcc/doc/invoke.texi           |   3 -
- gcc/params.opt                |   4 --
- gcc/tree-switch-conversion.cc | 112 +++-------------------------------
- gcc/tree-switch-conversion.h  |  18 ------
- 4 files changed, 7 insertions(+), 130 deletions(-)
-
-diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
-index 8ed5536365f7..08ad6b998b79 100644
---- a/gcc/doc/invoke.texi
-+++ b/gcc/doc/invoke.texi
-@@ -16522,9 +16522,6 @@ Switch initialization conversion refuses to create 
arrays that are
- bigger than @option{switch-conversion-max-branch-ratio} times the number of
- branches in the switch.
- 
--@item switch-lower-slow-alg-max-cases
--Maximum number of cases for slow switch lowering algorithms to be used.
--
- @item max-partial-antic-length
- Maximum length of the partial antic set computed during the tree
- partial redundancy elimination optimization (@option{-ftree-pre}) when
-diff --git a/gcc/params.opt b/gcc/params.opt
-index 1c88d5212c40..5853bf02f9ee 100644
---- a/gcc/params.opt
-+++ b/gcc/params.opt
-@@ -1052,10 +1052,6 @@ Maximum number of instruction distance that a small 
store forwarded to a larger
- Common Joined UInteger Var(param_switch_conversion_branch_ratio) Init(8) 
IntegerRange(1, 65536) Param Optimization
- The maximum ratio between array size and switch branches for a switch 
conversion to take place.
- 
---param=switch-lower-slow-alg-max-cases=
--Common Joined UInteger Var(param_switch_lower_slow_alg_max_cases) Init(1000) 
IntegerRange(1, 1000000000) Param Optimization
--Maximum number of cases for slow switch lowering algorithms to be used.
--
- -param=modref-max-bases=
- Common Joined UInteger Var(param_modref_max_bases) Init(32) Param Optimization
- Maximum number of bases stored in each modref tree.
-diff --git a/gcc/tree-switch-conversion.cc b/gcc/tree-switch-conversion.cc
-index b98e70cf7d16..3436c2a8b98c 100644
---- a/gcc/tree-switch-conversion.cc
-+++ b/gcc/tree-switch-conversion.cc
-@@ -54,7 +54,6 @@ Software Foundation, 51 Franklin Street, Fifth Floor, 
Boston, MA
- #include "tree-cfgcleanup.h"
- #include "hwint.h"
- #include "internal-fn.h"
--#include "diagnostic-core.h"
- 
- /* ??? For lang_hooks.types.type_for_mode, but is there a word_mode
-    type in the GIMPLE type system that is language-independent?  */
-@@ -1642,11 +1641,6 @@ jump_table_cluster::find_jump_tables (vec<cluster *> 
&clusters)
-     return clusters.copy ();
- 
-   unsigned l = clusters.length ();
--
--  /* Note: l + 1 is the number of cases of the switch.  */
--  if (l + 1 > (unsigned) param_switch_lower_slow_alg_max_cases)
--    return clusters.copy ();
--
-   auto_vec<min_cluster_item> min;
-   min.reserve (l + 1);
- 
-@@ -1777,80 +1771,16 @@ jump_table_cluster::is_beneficial (const vec<cluster 
*> &,
-   return end - start + 1 >= case_values_threshold ();
- }
- 
--/* Find bit tests of given CLUSTERS, where all members of the vector are of
--   type simple_cluster.  Use a fast algorithm that might not find the optimal
--   solution (minimal number of clusters on the output).  New clusters are
--   returned.
--
--   You should call find_bit_tests () instead of calling this function
--   directly.  */
--
--vec<cluster *>
--bit_test_cluster::find_bit_tests_fast (vec<cluster *> &clusters)
--{
--  unsigned l = clusters.length ();
--  vec<cluster *> output;
--
--  output.create (l);
--
--  /* Look at sliding BITS_PER_WORD sized windows in the switch value space
--     and determine if they are suitable for a bit test cluster.  Worst case
--     this can examine every value BITS_PER_WORD-1 times.  */
--  unsigned k;
--  for (unsigned i = 0; i < l; i += k)
--    {
--      hash_set<basic_block> targets;
--      cluster *start_cluster = clusters[i];
--
--      /* Find the biggest k such that clusters i to i+k-1 can be turned into a
--       one big bit test cluster.  */
--      k = 0;
--      while (i + k < l)
--      {
--        cluster *end_cluster = clusters[i + k];
--
--        /* Does value range fit into the BITS_PER_WORD window?  */
--        HOST_WIDE_INT w = cluster::get_range (start_cluster->get_low (),
--                                              end_cluster->get_high ());
--        if (w == 0 || w > BITS_PER_WORD)
--          break;
--
--        /* Check for max # of targets.  */
--        if (targets.elements () == m_max_case_bit_tests
--            && !targets.contains (end_cluster->m_case_bb))
--          break;
--
--        targets.add (end_cluster->m_case_bb);
--        k++;
--      }
--
--      if (is_beneficial (k, targets.elements ()))
--      {
--        output.safe_push (new bit_test_cluster (clusters, i, i + k - 1,
--                                                i == 0 && k == l));
--      }
--      else
--      {
--        output.safe_push (clusters[i]);
--        /* ??? Might be able to skip more.  */
--        k = 1;
--      }
--    }
--
--  return output;
--}
--
- /* Find bit tests of given CLUSTERS, where all members of the vector
--   are of type simple_cluster.  Use a slow (quadratic) algorithm that always
--   finds the optimal solution (minimal number of clusters on the output).  New
--   clusters are returned.
--
--   You should call find_bit_tests () instead of calling this function
--   directly.  */
-+   are of type simple_cluster.   MAX_C is the approx max number of cases per
-+   label.  New clusters are returned.  */
- 
- vec<cluster *>
--bit_test_cluster::find_bit_tests_slow (vec<cluster *> &clusters)
-+bit_test_cluster::find_bit_tests (vec<cluster *> &clusters, int max_c)
- {
-+  if (!is_enabled () || max_c == 1)
-+    return clusters.copy ();
-+
-   unsigned l = clusters.length ();
-   auto_vec<min_cluster_item> min;
-   min.reserve (l + 1);
-@@ -1904,25 +1834,6 @@ bit_test_cluster::find_bit_tests_slow (vec<cluster *> 
&clusters)
-   return output;
- }
- 
--/* Find bit tests of given CLUSTERS, where all members of the vector
--   are of type simple_cluster.  MAX_C is the approx max number of cases per
--   label.  New clusters are returned.  */
--
--vec<cluster *>
--bit_test_cluster::find_bit_tests (vec<cluster *> &clusters, int max_c)
--{
--  if (!is_enabled () || max_c == 1)
--    return clusters.copy ();
--
--  unsigned l = clusters.length ();
--
--  /* Note: l + 1 is the number of cases of the switch.  */
--  if (l + 1 > (unsigned) param_switch_lower_slow_alg_max_cases)
--    return find_bit_tests_fast (clusters);
--  else
--    return find_bit_tests_slow (clusters);
--}
--
- /* Return true when RANGE of case values with UNIQ labels
-    can build a bit test.  */
- 
-@@ -2353,19 +2264,10 @@ switch_decision_tree::analyze_switch_statement ()
- 
-   reset_out_edges_aux (m_switch);
- 
--  if (l > (unsigned) param_switch_lower_slow_alg_max_cases)
--    warning_at (gimple_location (m_switch), OPT_Wdisabled_optimization,
--             "Using faster switch lowering algorithms. "
--             "Number of switch cases (%d) exceeds "
--             "%<--param=switch-lower-slow-alg-max-cases=%d%> limit.",
--             l, param_switch_lower_slow_alg_max_cases);
--
-   /* Find bit-test clusters.  */
-   vec<cluster *> output = bit_test_cluster::find_bit_tests (clusters, max_c);
- 
--  /* Find jump table clusters.  We are looking for these in the sequences of
--     simple clusters which we didn't manage to convert into bit-test
--     clusters.  */
-+  /* Find jump table clusters.  */
-   vec<cluster *> output2;
-   auto_vec<cluster *> tmp;
-   output2.create (1);
-diff --git a/gcc/tree-switch-conversion.h b/gcc/tree-switch-conversion.h
-index 560620903a86..e6a85fa60258 100644
---- a/gcc/tree-switch-conversion.h
-+++ b/gcc/tree-switch-conversion.h
-@@ -397,24 +397,6 @@ public:
-            tree default_label_expr, basic_block default_bb, location_t loc)
-      final override;
- 
--  /* Find bit tests of given CLUSTERS, where all members of the vector are of
--     type simple_cluster.  Use a fast algorithm that might not find the 
optimal
--     solution (minimal number of clusters on the output).  New clusters are
--     returned.
--
--     You should call find_bit_tests () instead of calling this function
--     directly.  */
--  static vec<cluster *> find_bit_tests_fast (vec<cluster *> &clusters);
--
--  /* Find bit tests of given CLUSTERS, where all members of the vector
--     are of type simple_cluster.  Use a slow (quadratic) algorithm that always
--     finds the optimal solution (minimal number of clusters on the output).  
New
--     clusters are returned.
--
--     You should call find_bit_tests () instead of calling this function
--     directly.  */
--  static vec<cluster *> find_bit_tests_slow (vec<cluster *> &clusters);
--
-   /* Find bit tests of given CLUSTERS, where all members of the vector
-      are of type simple_cluster.  New clusters are returned.  */
-   static vec<cluster *> find_bit_tests (vec<cluster *> &clusters, int max_c);
-
-base-commit: b11e85adbfdb02bc7743098d358a5ea362648ca1
--- 
-2.47.1
-

diff --git 
a/15.0.0/gentoo/78_all_PR118032-tree-switch-conversion-don-t-apply-switch-size-limit.patch
 
b/15.0.0/gentoo/78_all_PR118032-tree-switch-conversion-don-t-apply-switch-size-limit.patch
new file mode 100644
index 0000000..20018ef
--- /dev/null
+++ 
b/15.0.0/gentoo/78_all_PR118032-tree-switch-conversion-don-t-apply-switch-size-limit.patch
@@ -0,0 +1,51 @@
+https://inbox.sourceware.org/gcc-patches/20250105172539.906393-1-m...@klomp.org/
+
+From 4e8dc9973c98a8b0c5cfe555221dc7dee5d92662 Mon Sep 17 00:00:00 2001
+Message-ID: 
<4e8dc9973c98a8b0c5cfe555221dc7dee5d92662.1736136715.git....@gentoo.org>
+From: Mark Wielaard <m...@klomp.org>
+Date: Sun, 5 Jan 2025 18:25:39 +0100
+Subject: [PATCH] tree-switch-conversion: don't apply switch size limit on jump
+ tables
+
+commit 56946c801a7c ("gimple: Add limit after which slower switchlower
+algs are used [PR117091] [PR117352]") introduced a limit on the number
+of cases of a switch. It also bails out on finding jump tables if the
+switch is too large. This introduces a compile time regression during
+bootstrap. A riscv bootstrap takes hours longer. Particularly
+insn-attrtab.cc will take hours instead of minutes. Fix this by not
+applying the switch size limit on jump tables.
+
+An alternative would be to implement greedy switch clustering for jump
+tables as is done for switch bitmap clustering.
+
+gcc/ChangeLog:
+
+PR tree-optimization/118032
+       * tree-switch-conversion.cc (jump_table_cluster::find_jump_tables):
+       Remove param_switch_lower_slow_alg_max_cases check.
+---
+ gcc/tree-switch-conversion.cc | 4 ----
+ 1 file changed, 4 deletions(-)
+
+diff --git a/gcc/tree-switch-conversion.cc b/gcc/tree-switch-conversion.cc
+index 432970597c97..39a8a893edde 100644
+--- a/gcc/tree-switch-conversion.cc
++++ b/gcc/tree-switch-conversion.cc
+@@ -1643,10 +1643,6 @@ jump_table_cluster::find_jump_tables (vec<cluster *> 
&clusters)
+ 
+   unsigned l = clusters.length ();
+ 
+-  /* Note: l + 1 is the number of cases of the switch.  */
+-  if (l + 1 > (unsigned) param_switch_lower_slow_alg_max_cases)
+-    return clusters.copy ();
+-
+   auto_vec<min_cluster_item> min;
+   min.reserve (l + 1);
+ 
+
+base-commit: 451ff5b58f7c5958f8341160343680262944a63f
+prerequisite-patch-id: cca034489e37f362f6ff4ff1aba0258270153a6a
+prerequisite-patch-id: dcb0315887787c40fae21980c53d20d0b6e234b7
+-- 
+2.47.1
+

diff --git a/15.0.0/gentoo/README.history b/15.0.0/gentoo/README.history
index b49ecdf..412cb40 100644
--- a/15.0.0/gentoo/README.history
+++ b/15.0.0/gentoo/README.history
@@ -1,5 +1,7 @@
 37     ????
 
+       - 
78_all_PR118032-Revert-gimple-Add-limit-after-which-slower-switchlow.patch
+       + 
78_all_PR118032-tree-switch-conversion-don-t-apply-switch-size-limit.patch
        + 80_all_PR81358-Enable-automatic-linking-of-libatomic.patch
        + 
81_all_PR118199-c-Clear-TARGET_EXPR_ELIDING_P-when-forced-to-use-a-c.patch
 

Reply via email to