Message ID | 20230914132409.2381527-1-qing.zhao@oracle.com |
---|---|
State | New |
Headers | show |
Series | tree optimization/111407--SSA corruption due to widening_mul opt | expand |
On Thu, Sep 14, 2023 at 3:25 PM Qing Zhao via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > on conflict across an abnormal edge > > This is a bug in tree-ssa-math-opts.cc, 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. > > bootstrapped and regression tested on both aarch64 and x86, no issue. > > Okay for committing? OK. > thanks. > > Qing > > ===== > > PR tree-optimization/111407 > > gcc/ChangeLog: > > * tree-ssa-math-opts.cc (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. > --- > gcc/testsuite/gcc.dg/pr111407.c | 21 +++++++++++++++++++++ > gcc/tree-ssa-math-opts.cc | 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 00000000000..a171074753f > --- /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.cc b/gcc/tree-ssa-math-opts.cc > index 3db69ad5733..51c14d6bad9 100644 > --- a/gcc/tree-ssa-math-opts.cc > +++ b/gcc/tree-ssa-math-opts.cc > @@ -2755,6 +2755,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 >
thanks. Committed as https://gcc.gnu.org/pipermail/gcc-cvs/2023-September/389614.html Qing > On Sep 15, 2023, at 2:12 AM, Richard Biener <richard.guenther@gmail.com> wrote: > > On Thu, Sep 14, 2023 at 3:25 PM Qing Zhao via Gcc-patches > <gcc-patches@gcc.gnu.org> wrote: >> >> on conflict across an abnormal edge >> >> This is a bug in tree-ssa-math-opts.cc, 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. >> >> bootstrapped and regression tested on both aarch64 and x86, no issue. >> >> Okay for committing? > > OK. > >> thanks. >> >> Qing >> >> ===== >> >> PR tree-optimization/111407 >> >> gcc/ChangeLog: >> >> * tree-ssa-math-opts.cc (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. >> --- >> gcc/testsuite/gcc.dg/pr111407.c | 21 +++++++++++++++++++++ >> gcc/tree-ssa-math-opts.cc | 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 00000000000..a171074753f >> --- /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.cc b/gcc/tree-ssa-math-opts.cc >> index 3db69ad5733..51c14d6bad9 100644 >> --- a/gcc/tree-ssa-math-opts.cc >> +++ b/gcc/tree-ssa-math-opts.cc >> @@ -2755,6 +2755,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 00000000000..a171074753f --- /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.cc b/gcc/tree-ssa-math-opts.cc index 3db69ad5733..51c14d6bad9 100644 --- a/gcc/tree-ssa-math-opts.cc +++ b/gcc/tree-ssa-math-opts.cc @@ -2755,6 +2755,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)