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 |
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 >
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 --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)