Message ID | 1637135214-8113-1-git-send-email-apinski@marvell.com |
---|---|
State | New |
Headers | show |
Series | Fix PR 103288, ICE after PHI-OPT, move an assigment when still in use for another bb | expand |
On November 17, 2021 8:46:54 AM GMT+01:00, apinski--- via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: >From: Andrew Pinski <apinski@marvell.com> > >The problem is r12-5300-gf98f373dd822b35c allows phiopt to recognize more basic blocks >but missed one location where phiopt could move an assignment from the middle block >to the non-middle one. This patch fixes that. > >OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions. OK. Richard. > PR 103288 > >gcc/ChangeLog: > > * tree-ssa-phiopt.c (value_replacement): Return early if middle > block has more than one pred. > >gcc/testsuite/ChangeLog: > > * gcc.c-torture/compile/pr103288-1.c: New test. >--- > gcc/testsuite/gcc.c-torture/compile/pr103288-1.c | 6 ++++++ > gcc/tree-ssa-phiopt.c | 3 +++ > 2 files changed, 9 insertions(+) > create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr103288-1.c > >diff --git a/gcc/testsuite/gcc.c-torture/compile/pr103288-1.c b/gcc/testsuite/gcc.c-torture/compile/pr103288-1.c >new file mode 100644 >index 00000000000..88d1c675599 >--- /dev/null >+++ b/gcc/testsuite/gcc.c-torture/compile/pr103288-1.c >@@ -0,0 +1,6 @@ >+ >+int ui_5; >+long func_14_uli_8; >+void func_14() { >+ ui_5 &= (func_14_uli_8 ? 60 : ui_5) ? 5 : 0; >+} >diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c >index 6b22f6bedd4..8984a5e15ab 100644 >--- a/gcc/tree-ssa-phiopt.c >+++ b/gcc/tree-ssa-phiopt.c >@@ -1381,6 +1381,9 @@ value_replacement (basic_block cond_bb, basic_block middle_bb, > } > } > >+ if (!single_pred_p (middle_bb)) >+ return 0; >+ > /* Now optimize (x != 0) ? x + y : y to just x + y. */ > gsi = gsi_last_nondebug_bb (middle_bb); > if (gsi_end_p (gsi))
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr103288-1.c b/gcc/testsuite/gcc.c-torture/compile/pr103288-1.c new file mode 100644 index 00000000000..88d1c675599 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr103288-1.c @@ -0,0 +1,6 @@ + +int ui_5; +long func_14_uli_8; +void func_14() { + ui_5 &= (func_14_uli_8 ? 60 : ui_5) ? 5 : 0; +} diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c index 6b22f6bedd4..8984a5e15ab 100644 --- a/gcc/tree-ssa-phiopt.c +++ b/gcc/tree-ssa-phiopt.c @@ -1381,6 +1381,9 @@ value_replacement (basic_block cond_bb, basic_block middle_bb, } } + if (!single_pred_p (middle_bb)) + return 0; + /* Now optimize (x != 0) ? x + y : y to just x + y. */ gsi = gsi_last_nondebug_bb (middle_bb); if (gsi_end_p (gsi))
From: Andrew Pinski <apinski@marvell.com> The problem is r12-5300-gf98f373dd822b35c allows phiopt to recognize more basic blocks but missed one location where phiopt could move an assignment from the middle block to the non-middle one. This patch fixes that. OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions. PR 103288 gcc/ChangeLog: * tree-ssa-phiopt.c (value_replacement): Return early if middle block has more than one pred. gcc/testsuite/ChangeLog: * gcc.c-torture/compile/pr103288-1.c: New test. --- gcc/testsuite/gcc.c-torture/compile/pr103288-1.c | 6 ++++++ gcc/tree-ssa-phiopt.c | 3 +++ 2 files changed, 9 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr103288-1.c