diff mbox series

[Backport,GCC10] Fix SSA corruption due to widening_mul opt on conflict across an abnormal edge [PR111407]

Message ID 20240401133518.714608-1-qing.zhao@oracle.com
State New
Headers show
Series [Backport,GCC10] Fix SSA corruption due to widening_mul opt on conflict across an abnormal edge [PR111407] | expand

Commit Message

Qing Zhao April 1, 2024, 1:35 p.m. UTC
This is a bug in tree-ssa-math-opts.c, when applying the widening mul
optimization, the compiler needs to check whether the operand is in a
ABNORMAL PHI, if YES, we should avoid the transformation.

	PR tree-optimization/111407

gcc/ChangeLog:

	* tree-ssa-math-opts.c (convert_mult_to_widen): Avoid the transform
	when one of the operands is subject to abnormal coalescing.

gcc/testsuite/ChangeLog:

	* gcc.dg/pr111407.c: New test.

(cherry picked from commit 4aca1cfd6235090e48a53dab734437740671bbf3)

bootstraped and regression tested on both aarch64 and x86.

Okay for commit to GCC10?

thanks.

Qing
---
 gcc/testsuite/gcc.dg/pr111407.c | 21 +++++++++++++++++++++
 gcc/tree-ssa-math-opts.c        |  8 ++++++++
 2 files changed, 29 insertions(+)
 create mode 100644 gcc/testsuite/gcc.dg/pr111407.c

Comments

Richard Biener April 2, 2024, 7:06 a.m. UTC | #1
On Mon, Apr 1, 2024 at 3:36 PM Qing Zhao <qing.zhao@oracle.com> wrote:
>
> This is a bug in tree-ssa-math-opts.c, when applying the widening mul
> optimization, the compiler needs to check whether the operand is in a
> ABNORMAL PHI, if YES, we should avoid the transformation.
>
>         PR tree-optimization/111407
>
> gcc/ChangeLog:
>
>         * tree-ssa-math-opts.c (convert_mult_to_widen): Avoid the transform
>         when one of the operands is subject to abnormal coalescing.
>
> gcc/testsuite/ChangeLog:
>
>         * gcc.dg/pr111407.c: New test.
>
> (cherry picked from commit 4aca1cfd6235090e48a53dab734437740671bbf3)
>
> bootstraped and regression tested on both aarch64 and x86.
>
> Okay for commit to GCC10?

Note the GCC 10 branch is closed.  If the patch boostraps/tests on the
11, 12 and 13
branches it is OK there.  You do not need approval to backport fixes
for _regressions_
if the patch cherry-picks without major edits and boostraps/tests OK.

Thanks,
Richard.

> thanks.
>
> Qing
> ---
>  gcc/testsuite/gcc.dg/pr111407.c | 21 +++++++++++++++++++++
>  gcc/tree-ssa-math-opts.c        |  8 ++++++++
>  2 files changed, 29 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.dg/pr111407.c
>
> diff --git a/gcc/testsuite/gcc.dg/pr111407.c b/gcc/testsuite/gcc.dg/pr111407.c
> new file mode 100644
> index 000000000000..a171074753f9
> --- /dev/null
> +++ b/gcc/testsuite/gcc.dg/pr111407.c
> @@ -0,0 +1,21 @@
> +/* PR tree-optimization/111407*/
> +/* { dg-do compile } */
> +/* { dg-options "-O2" } */
> +enum { SEND_TOFILE } __sigsetjmp();
> +void fclose();
> +void foldergets();
> +void sendpart_stats(int *p1, int a1, int b1) {
> + int *a = p1;
> + fclose();
> + p1 = 0;
> + long t = b1;
> + if (__sigsetjmp()) {
> +   {
> +     long t1 = a1;
> +     a1+=1;
> +     fclose(a1*(long)t1);
> +   }
> + }
> + if (p1)
> +   fclose();
> +}
> diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c
> index dd0b8c6f0577..47981da20e05 100644
> --- a/gcc/tree-ssa-math-opts.c
> +++ b/gcc/tree-ssa-math-opts.c
> @@ -2543,6 +2543,14 @@ convert_mult_to_widen (gimple *stmt, gimple_stmt_iterator *gsi)
>    if (!is_widening_mult_p (stmt, &type1, &rhs1, &type2, &rhs2))
>      return false;
>
> +  /* if any one of rhs1 and rhs2 is subject to abnormal coalescing,
> +     avoid the tranform. */
> +  if ((TREE_CODE (rhs1) == SSA_NAME
> +       && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs1))
> +      || (TREE_CODE (rhs2) == SSA_NAME
> +         && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs2)))
> +    return false;
> +
>    to_mode = SCALAR_INT_TYPE_MODE (type);
>    from_mode = SCALAR_INT_TYPE_MODE (type1);
>    if (to_mode == from_mode)
> --
> 2.31.1
>
Qing Zhao April 2, 2024, 1:29 p.m. UTC | #2
On Apr 2, 2024, at 03:06, Richard Biener <richard.guenther@gmail.com> wrote:

On Mon, Apr 1, 2024 at 3:36 PM Qing Zhao <qing.zhao@oracle.com<mailto:qing.zhao@oracle.com>> wrote:

This is a bug in tree-ssa-math-opts.c, when applying the widening mul
optimization, the compiler needs to check whether the operand is in a
ABNORMAL PHI, if YES, we should avoid the transformation.

       PR tree-optimization/111407

gcc/ChangeLog:

       * tree-ssa-math-opts.c (convert_mult_to_widen): Avoid the transform
       when one of the operands is subject to abnormal coalescing.

gcc/testsuite/ChangeLog:

       * gcc.dg/pr111407.c: New test.

(cherry picked from commit 4aca1cfd6235090e48a53dab734437740671bbf3)

bootstraped and regression tested on both aarch64 and x86.

Okay for commit to GCC10?

Note the GCC 10 branch is closed.  If the patch boostraps/tests on the
11, 12 and 13
branches it is OK there.  You do not need approval to backport fixes
for _regressions_
if the patch cherry-picks without major edits and boostraps/tests OK.

Thanks for the info.

I will commit the patches for GCC11, 12, and 13 soon.

Qing

Thanks,
Richard.

thanks.

Qing
---
gcc/testsuite/gcc.dg/pr111407.c | 21 +++++++++++++++++++++
gcc/tree-ssa-math-opts.c        |  8 ++++++++
2 files changed, 29 insertions(+)
create mode 100644 gcc/testsuite/gcc.dg/pr111407.c

diff --git a/gcc/testsuite/gcc.dg/pr111407.c b/gcc/testsuite/gcc.dg/pr111407.c
new file mode 100644
index 000000000000..a171074753f9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr111407.c
@@ -0,0 +1,21 @@
+/* PR tree-optimization/111407*/
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+enum { SEND_TOFILE } __sigsetjmp();
+void fclose();
+void foldergets();
+void sendpart_stats(int *p1, int a1, int b1) {
+ int *a = p1;
+ fclose();
+ p1 = 0;
+ long t = b1;
+ if (__sigsetjmp()) {
+   {
+     long t1 = a1;
+     a1+=1;
+     fclose(a1*(long)t1);
+   }
+ }
+ if (p1)
+   fclose();
+}
diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c
index dd0b8c6f0577..47981da20e05 100644
--- a/gcc/tree-ssa-math-opts.c
+++ b/gcc/tree-ssa-math-opts.c
@@ -2543,6 +2543,14 @@ convert_mult_to_widen (gimple *stmt, gimple_stmt_iterator *gsi)
  if (!is_widening_mult_p (stmt, &type1, &rhs1, &type2, &rhs2))
    return false;

+  /* if any one of rhs1 and rhs2 is subject to abnormal coalescing,
+     avoid the tranform. */
+  if ((TREE_CODE (rhs1) == SSA_NAME
+       && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs1))
+      || (TREE_CODE (rhs2) == SSA_NAME
+         && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs2)))
+    return false;
+
  to_mode = SCALAR_INT_TYPE_MODE (type);
  from_mode = SCALAR_INT_TYPE_MODE (type1);
  if (to_mode == from_mode)
--
2.31.1
diff mbox series

Patch

diff --git a/gcc/testsuite/gcc.dg/pr111407.c b/gcc/testsuite/gcc.dg/pr111407.c
new file mode 100644
index 000000000000..a171074753f9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr111407.c
@@ -0,0 +1,21 @@ 
+/* PR tree-optimization/111407*/
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+enum { SEND_TOFILE } __sigsetjmp();
+void fclose();
+void foldergets();
+void sendpart_stats(int *p1, int a1, int b1) {
+ int *a = p1;
+ fclose();
+ p1 = 0;
+ long t = b1;
+ if (__sigsetjmp()) {
+   {
+     long t1 = a1;
+     a1+=1;
+     fclose(a1*(long)t1);
+   }
+ }
+ if (p1)
+   fclose();
+}
diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c
index dd0b8c6f0577..47981da20e05 100644
--- a/gcc/tree-ssa-math-opts.c
+++ b/gcc/tree-ssa-math-opts.c
@@ -2543,6 +2543,14 @@  convert_mult_to_widen (gimple *stmt, gimple_stmt_iterator *gsi)
   if (!is_widening_mult_p (stmt, &type1, &rhs1, &type2, &rhs2))
     return false;
 
+  /* if any one of rhs1 and rhs2 is subject to abnormal coalescing,
+     avoid the tranform. */
+  if ((TREE_CODE (rhs1) == SSA_NAME
+       && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs1))
+      || (TREE_CODE (rhs2) == SSA_NAME
+	  && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs2)))
+    return false;
+
   to_mode = SCALAR_INT_TYPE_MODE (type);
   from_mode = SCALAR_INT_TYPE_MODE (type1);
   if (to_mode == from_mode)