aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam James <sam@gentoo.org>2024-11-09 07:55:37 +0000
committerSam James <sam@gentoo.org>2024-11-09 07:55:37 +0000
commita6cc1808601268d37a0c43ad67b5c116d9678c4d (patch)
treee512a776494f8fe2cd823e55443c44e5b1f44105
parent15.0.0: add workaround for recursion in sccvn (diff)
downloadgcc-patches-a6cc1808601268d37a0c43ad67b5c116d9678c4d.tar.gz
gcc-patches-a6cc1808601268d37a0c43ad67b5c116d9678c4d.tar.bz2
gcc-patches-a6cc1808601268d37a0c43ad67b5c116d9678c4d.zip
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>
-rw-r--r--15.0.0/gentoo/73_all_PR117493-sccvn-insert_predicates_for_cond-limit.patch107
1 files changed, 82 insertions, 25 deletions
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
+