diff mbox series

VN: Don't recurse on for the same value of `a | b` [PR117496]

Message ID 20241109013502.2642495-1-quic_apinski@quicinc.com
State New
Headers show
Series VN: Don't recurse on for the same value of `a | b` [PR117496] | expand

Commit Message

Andrew Pinski Nov. 9, 2024, 1:35 a.m. UTC
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

Comments

Richard Biener Nov. 9, 2024, 7:45 a.m. UTC | #1
> Am 09.11.2024 um 02:36 schrieb Andrew Pinski <quic_apinski@quicinc.com>:
> 
> 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.

Ok

Richard 

>    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 00000000000..f35d13dfa85
> --- /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 16299662b95..e93acb44200 100644
> --- a/gcc/tree-ssa-sccvn.cc
> +++ b/gcc/tree-ssa-sccvn.cc
> @@ -7900,6 +7900,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)
> @@ -7977,10 +7978,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);
> +      /* 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);
> +      if (nlhs != lhs)
> +        insert_predicates_for_cond (EQ_EXPR, nlhs, rhs, e, nullptr);
>    }
>     }
> }
> --
> 2.43.0
>
diff mbox series

Patch

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 00000000000..f35d13dfa85
--- /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 16299662b95..e93acb44200 100644
--- a/gcc/tree-ssa-sccvn.cc
+++ b/gcc/tree-ssa-sccvn.cc
@@ -7900,6 +7900,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)
@@ -7977,10 +7978,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);
+	  /* 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);
+	  if (nlhs != lhs)
+	    insert_predicates_for_cond (EQ_EXPR, nlhs, rhs, e, nullptr);
 	}
     }
 }