diff mbox series

[3/3] phiprop: VOP phi confuses phiprop [PR116824]

Message ID 20240924161312.1556293-3-quic_apinski@quicinc.com
State New
Headers show
Series [1/3] Add an alternative testcase for PR 70740 | expand

Commit Message

Andrew Pinski Sept. 24, 2024, 4:13 p.m. UTC
Another small phiprop improvement, in some cases
we could have a vop defining statement be a phi which might
be the same bb as the load happens. This is ok since the phi
here is not a store so we can just accept it.

Bootstrapped and tested on x86_64-linux-gnu.

	PR tree-optimization/116824

gcc/ChangeLog:

	* tree-ssa-phiprop.cc (propagate_with_phi): Don't
	reject if the bb of the def_stmt is the same as load
	and if the def_stmt was a phi.

gcc/testsuite/ChangeLog:

	* gcc.dg/tree-ssa/phiprop-3.c: New test.

Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
---
 gcc/testsuite/gcc.dg/tree-ssa/phiprop-3.c | 30 +++++++++++++++++++++++
 gcc/tree-ssa-phiprop.cc                   |  3 ++-
 2 files changed, 32 insertions(+), 1 deletion(-)
 create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/phiprop-3.c

Comments

Richard Biener Sept. 25, 2024, 8:37 a.m. UTC | #1
On Tue, Sep 24, 2024 at 6:14 PM Andrew Pinski <quic_apinski@quicinc.com> wrote:
>
> Another small phiprop improvement, in some cases
> we could have a vop defining statement be a phi which might
> be the same bb as the load happens. This is ok since the phi
> here is not a store so we can just accept it.
>
> Bootstrapped and tested on x86_64-linux-gnu.

OK.

>         PR tree-optimization/116824
>
> gcc/ChangeLog:
>
>         * tree-ssa-phiprop.cc (propagate_with_phi): Don't
>         reject if the bb of the def_stmt is the same as load
>         and if the def_stmt was a phi.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.dg/tree-ssa/phiprop-3.c: New test.
>
> Signed-off-by: Andrew Pinski <quic_apinski@quicinc.com>
> ---
>  gcc/testsuite/gcc.dg/tree-ssa/phiprop-3.c | 30 +++++++++++++++++++++++
>  gcc/tree-ssa-phiprop.cc                   |  3 ++-
>  2 files changed, 32 insertions(+), 1 deletion(-)
>  create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/phiprop-3.c
>
> diff --git a/gcc/testsuite/gcc.dg/tree-ssa/phiprop-3.c b/gcc/testsuite/gcc.dg/tree-ssa/phiprop-3.c
> new file mode 100644
> index 00000000000..a0d5891dc60
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/tree-ssa/phiprop-3.c
> @@ -0,0 +1,30 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O1 -fdump-tree-phiprop1-details -fdump-tree-cselim-details -fdump-tree-phiopt2" } */
> +
> +/* PR tree-optimization/116824 */
> +/* phiprop should be able to handle the case where the vops defining
> +   statement was a phi in the same bb as the deference. */
> +
> +int g(int i, int *tt)
> +{
> +  const int t = 10;
> +  const int *a;
> +  {
> +    if (t < i)
> +    {
> +      *tt = 1;
> +      a = &t;
> +    }
> +    else
> +    {
> +      *tt = 1;
> +      a = &i;
> +    }
> +  }
> +  return *a;
> +}
> +
> +/* { dg-final { scan-tree-dump-times "Inserting PHI for result of load" 1 "phiprop1"} } */
> +/* { dg-final { scan-tree-dump-times "factoring out stores" 1 "cselim"} } */
> +/* { dg-final { scan-tree-dump-times "MIN_EXPR" 1 "phiopt2"} } */
> +
> diff --git a/gcc/tree-ssa-phiprop.cc b/gcc/tree-ssa-phiprop.cc
> index f04990e8cb4..4d1df7d351e 100644
> --- a/gcc/tree-ssa-phiprop.cc
> +++ b/gcc/tree-ssa-phiprop.cc
> @@ -401,7 +401,8 @@ propagate_with_phi (basic_block bb, gphi *phi, struct phiprop_d *phivn,
>           def_stmt = SSA_NAME_DEF_STMT (vuse);
>         }
>        if (!SSA_NAME_IS_DEFAULT_DEF (vuse)
> -         && (gimple_bb (def_stmt) == bb
> +         && ((gimple_bb (def_stmt) == bb
> +              && !is_a<gphi *>(def_stmt))
>               || (gimple_bb (def_stmt)
>                   && !dominated_by_p (CDI_DOMINATORS,
>                                       bb, gimple_bb (def_stmt)))))
> --
> 2.43.0
>
diff mbox series

Patch

diff --git a/gcc/testsuite/gcc.dg/tree-ssa/phiprop-3.c b/gcc/testsuite/gcc.dg/tree-ssa/phiprop-3.c
new file mode 100644
index 00000000000..a0d5891dc60
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/phiprop-3.c
@@ -0,0 +1,30 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O1 -fdump-tree-phiprop1-details -fdump-tree-cselim-details -fdump-tree-phiopt2" } */
+
+/* PR tree-optimization/116824 */
+/* phiprop should be able to handle the case where the vops defining
+   statement was a phi in the same bb as the deference. */
+
+int g(int i, int *tt)
+{
+  const int t = 10;
+  const int *a;
+  {
+    if (t < i)
+    {
+      *tt = 1;
+      a = &t;
+    }
+    else
+    {
+      *tt = 1;
+      a = &i;
+    }
+  }
+  return *a;
+}
+
+/* { dg-final { scan-tree-dump-times "Inserting PHI for result of load" 1 "phiprop1"} } */
+/* { dg-final { scan-tree-dump-times "factoring out stores" 1 "cselim"} } */
+/* { dg-final { scan-tree-dump-times "MIN_EXPR" 1 "phiopt2"} } */
+
diff --git a/gcc/tree-ssa-phiprop.cc b/gcc/tree-ssa-phiprop.cc
index f04990e8cb4..4d1df7d351e 100644
--- a/gcc/tree-ssa-phiprop.cc
+++ b/gcc/tree-ssa-phiprop.cc
@@ -401,7 +401,8 @@  propagate_with_phi (basic_block bb, gphi *phi, struct phiprop_d *phivn,
 	  def_stmt = SSA_NAME_DEF_STMT (vuse);
 	}
       if (!SSA_NAME_IS_DEFAULT_DEF (vuse)
-	  && (gimple_bb (def_stmt) == bb
+	  && ((gimple_bb (def_stmt) == bb
+	       && !is_a<gphi *>(def_stmt))
 	      || (gimple_bb (def_stmt)
 		  && !dominated_by_p (CDI_DOMINATORS,
 				      bb, gimple_bb (def_stmt)))))