diff options
author | Sam James <sam@gentoo.org> | 2024-11-09 07:55:37 +0000 |
---|---|---|
committer | Sam James <sam@gentoo.org> | 2024-11-09 07:55:37 +0000 |
commit | a6cc1808601268d37a0c43ad67b5c116d9678c4d (patch) | |
tree | e512a776494f8fe2cd823e55443c44e5b1f44105 | |
parent | 15.0.0: add workaround for recursion in sccvn (diff) | |
download | gcc-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.patch | 107 |
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 + |