From a6cc1808601268d37a0c43ad67b5c116d9678c4d Mon Sep 17 00:00:00 2001
From: Sam James <sam@gentoo.org>
Date: Sat, 9 Nov 2024 07:55:37 +0000
Subject: 15.0.0: update
 73_all_PR117493-sccvn-insert_predicates_for_cond-limit.patch

This version will be committed shortly.

Signed-off-by: Sam James <sam@gentoo.org>
---
 ...93-sccvn-insert_predicates_for_cond-limit.patch | 107 ++++++++++++++++-----
 1 file changed, 82 insertions(+), 25 deletions(-)

(limited to '15.0.0/gentoo/73_all_PR117493-sccvn-insert_predicates_for_cond-limit.patch')

diff --git a/15.0.0/gentoo/73_all_PR117493-sccvn-insert_predicates_for_cond-limit.patch b/15.0.0/gentoo/73_all_PR117493-sccvn-insert_predicates_for_cond-limit.patch
index 2000754..9816e52 100644
--- a/15.0.0/gentoo/73_all_PR117493-sccvn-insert_predicates_for_cond-limit.patch
+++ b/15.0.0/gentoo/73_all_PR117493-sccvn-insert_predicates_for_cond-limit.patch
@@ -1,41 +1,98 @@
-https://gcc.gnu.org/PR117493
-https://gcc.gnu.org/PR117496
+From a49a60790ae2032dfeee617ba9488fc80e09b3a8 Mon Sep 17 00:00:00 2001
+Message-ID: <a49a60790ae2032dfeee617ba9488fc80e09b3a8.1731138919.git.sam@gentoo.org>
+From: Andrew Pinski <quic_apinski@quicinc.com>
+Date: Fri, 8 Nov 2024 17:35:02 -0800
+Subject: [PATCH] VN: Don't recurse on for the same value of `a | b` [PR117496]
 
-https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117493#c5
+After adding vn_valueize to the handle the `a | b ==/!= 0` case
+of insert_predicates_for_cond, it would go into an infinite loop
+as the Value number for either a or b could be the same as what it
+is for the whole expression. This avoids that recursion so there is
+no infinite loop here.
+
+Bootstrapped and tested on x86_64-linux.
+
+	PR tree-optimization/117496
+
+gcc/ChangeLog:
+
+	* tree-ssa-sccvn.cc (insert_predicates_for_cond): If the
+	valueization for the new lhs is the same as the old one,
+	don't recurse.
+
+gcc/testsuite/ChangeLog:
+
+	* gcc.dg/torture/pr117496-1.c: New test.
+
+Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
+---
+ gcc/testsuite/gcc.dg/torture/pr117496-1.c | 25 +++++++++++++++++++++++
+ gcc/tree-ssa-sccvn.cc                     | 11 ++++++++--
+ 2 files changed, 34 insertions(+), 2 deletions(-)
+ create mode 100644 gcc/testsuite/gcc.dg/torture/pr117496-1.c
+
+diff --git a/gcc/testsuite/gcc.dg/torture/pr117496-1.c b/gcc/testsuite/gcc.dg/torture/pr117496-1.c
+new file mode 100644
+index 000000000000..f35d13dfa85d
+--- /dev/null
++++ b/gcc/testsuite/gcc.dg/torture/pr117496-1.c
+@@ -0,0 +1,25 @@
++/* { dg-do compile } */
++
++
++/* PR tree-optimization/117496 */
++/* This would go into an infinite loop into VN while recording
++   the predicates for the `tracks == 0 && wm == 0` GIMPLE_COND.
++   As wm_N and tracks_N would valueize back to `tracks | wm`.  */
++
++int main_argc, gargs_preemp, gargs_nopreemp;
++static void gargs();
++void main_argv() {
++  int tracks = 0;
++  gargs(main_argc, main_argv, &tracks);
++}
++void gargs(int, char *, int *tracksp) {
++  int tracks = *tracksp, wm;
++  for (;;) {
++    if (tracks == 0)
++      wm |= 4;
++    if (gargs_nopreemp)
++      gargs_preemp = 0;
++    if (tracks == 0 && wm == 0)
++      tracks++;
++  }
++}
+diff --git a/gcc/tree-ssa-sccvn.cc b/gcc/tree-ssa-sccvn.cc
+index 1967bbdca84d..9c460fc1bdb3 100644
 --- a/gcc/tree-ssa-sccvn.cc
 +++ b/gcc/tree-ssa-sccvn.cc
-@@ -7902,8 +7902,11 @@ insert_related_predicates_on_edge (enum tree_code code, tree *ops, edge pred_e)
+@@ -7897,6 +7897,7 @@ insert_related_predicates_on_edge (enum tree_code code, tree *ops, edge pred_e)
+ 
+ /* Insert on the TRUE_E true and FALSE_E false predicates
     derived from LHS CODE RHS.  */
++
  static void
  insert_predicates_for_cond (tree_code code, tree lhs, tree rhs,
--			    edge true_e, edge false_e)
-+			    edge true_e, edge false_e, int n = 0)
- {
-+  if (n > 5)
-+    return;
-+
-   /* If both edges are null, then there is nothing to be done. */
-   if (!true_e && !false_e)
-     return;
-@@ -7964,7 +7967,7 @@ insert_predicates_for_cond (tree_code code, tree lhs, tree rhs,
- 	    edge nf = false_e;
- 	    if (code == EQ_EXPR)
- 	      std::swap (nt, nf);
--	    insert_predicates_for_cond (nc, nlhs, nrhs, nt, nf);
-+	    insert_predicates_for_cond (nc, nlhs, nrhs, nt, nf, n + 1);
- 	  }
-       /* (a | b) == 0 ->
- 	    on true edge assert: a == 0 & b == 0. */
-@@ -7977,10 +7980,10 @@ insert_predicates_for_cond (tree_code code, tree lhs, tree rhs,
+ 			    edge true_e, edge false_e)
+@@ -7973,10 +7974,16 @@ insert_predicates_for_cond (tree_code code, tree lhs, tree rhs,
  	  tree nlhs;
  
  	  nlhs = vn_valueize (gimple_assign_rhs1 (def_stmt));
 -	  insert_predicates_for_cond (EQ_EXPR, nlhs, rhs, e, nullptr);
-+	  insert_predicates_for_cond (EQ_EXPR, nlhs, rhs, e, nullptr, n + 1);
++	  /* A valueization of the `a` might return the old lhs
++	     which is already handled above. */
++	  if (nlhs != lhs)
++	    insert_predicates_for_cond (EQ_EXPR, nlhs, rhs, e, nullptr);
  
++	  /* A valueization of the `b` might return the old lhs
++	     which is already handled above. */
  	  nlhs = vn_valueize (gimple_assign_rhs2 (def_stmt));
 -	  insert_predicates_for_cond (EQ_EXPR, nlhs, rhs, e, nullptr);
-+	  insert_predicates_for_cond (EQ_EXPR, nlhs, rhs, e, nullptr, n + 1);
++	  if (nlhs != lhs)
++	    insert_predicates_for_cond (EQ_EXPR, nlhs, rhs, e, nullptr);
  	}
      }
  }
+-- 
+2.47.0
+
-- 
cgit v1.2.3-65-gdbad