Message ID | 20190925004111.14989-1-jcmvbkbc@gmail.com |
---|---|
State | New |
Headers | show |
Series | xtensa: fix PR target/91880 | expand |
On Tue, Sep 24, 2019 at 5:41 PM Max Filippov <jcmvbkbc@gmail.com> wrote: > > Xtensa hwloop_optimize segfaults when zero overhead loop is about to be > inserted as the first instruction of the function. > Insert zero overhead loop instruction into new basic block before the > loop when basic block that precedes the loop is empty. > > 2019-09-24 Max Filippov <jcmvbkbc@gmail.com> > gcc/ > * config/xtensa/xtensa.c (hwloop_optimize): Insert zero overhead > loop instruction into new basic block before the loop when basic > block that precedes the loop is empty. > > gcc/testsuite/ > * gcc.target/xtensa/pr91880.c: New test case. > * gcc.target/xtensa/xtensa.exp: New test suite. > --- > gcc/config/xtensa/xtensa.c | 5 ++-- > gcc/testsuite/gcc.target/xtensa/pr91880.c | 10 ++++++++ > gcc/testsuite/gcc.target/xtensa/xtensa.exp | 41 ++++++++++++++++++++++++++++++ > 3 files changed, 54 insertions(+), 2 deletions(-) > create mode 100644 gcc/testsuite/gcc.target/xtensa/pr91880.c > create mode 100644 gcc/testsuite/gcc.target/xtensa/xtensa.exp Approved. Thanks.
On Thu, Sep 26, 2019 at 1:42 PM augustine.sterling@gmail.com <augustine.sterling@gmail.com> wrote: > > On Tue, Sep 24, 2019 at 5:41 PM Max Filippov <jcmvbkbc@gmail.com> wrote: > > > > Xtensa hwloop_optimize segfaults when zero overhead loop is about to be > > inserted as the first instruction of the function. > > Insert zero overhead loop instruction into new basic block before the > > loop when basic block that precedes the loop is empty. > > > > 2019-09-24 Max Filippov <jcmvbkbc@gmail.com> > > gcc/ > > * config/xtensa/xtensa.c (hwloop_optimize): Insert zero overhead > > loop instruction into new basic block before the loop when basic > > block that precedes the loop is empty. > > > > gcc/testsuite/ > > * gcc.target/xtensa/pr91880.c: New test case. > > * gcc.target/xtensa/xtensa.exp: New test suite. > > --- > > gcc/config/xtensa/xtensa.c | 5 ++-- > > gcc/testsuite/gcc.target/xtensa/pr91880.c | 10 ++++++++ > > gcc/testsuite/gcc.target/xtensa/xtensa.exp | 41 ++++++++++++++++++++++++++++++ > > 3 files changed, 54 insertions(+), 2 deletions(-) > > create mode 100644 gcc/testsuite/gcc.target/xtensa/pr91880.c > > create mode 100644 gcc/testsuite/gcc.target/xtensa/xtensa.exp > > Approved. Thanks. Thanks. Applied to trunk. I'll backport it later to gcc-7..9 branches. -- Max
diff --git a/gcc/config/xtensa/xtensa.c b/gcc/config/xtensa/xtensa.c index ee5612441e25..2527468d57db 100644 --- a/gcc/config/xtensa/xtensa.c +++ b/gcc/config/xtensa/xtensa.c @@ -4235,7 +4235,9 @@ hwloop_optimize (hwloop_info loop) seq = get_insns (); - if (!single_succ_p (entry_bb) || vec_safe_length (loop->incoming) > 1) + entry_after = BB_END (entry_bb); + if (!single_succ_p (entry_bb) || vec_safe_length (loop->incoming) > 1 + || !entry_after) { basic_block new_bb; edge e; @@ -4256,7 +4258,6 @@ hwloop_optimize (hwloop_info loop) } else { - entry_after = BB_END (entry_bb); while (DEBUG_INSN_P (entry_after) || (NOTE_P (entry_after) && NOTE_KIND (entry_after) != NOTE_INSN_BASIC_BLOCK)) diff --git a/gcc/testsuite/gcc.target/xtensa/pr91880.c b/gcc/testsuite/gcc.target/xtensa/pr91880.c new file mode 100644 index 000000000000..f4895a1bb8ec --- /dev/null +++ b/gcc/testsuite/gcc.target/xtensa/pr91880.c @@ -0,0 +1,10 @@ +/* { dg-do compile } */ +/* { dg-options "-O3 -fomit-frame-pointer -fno-tree-vectorize" } */ + +void foo (unsigned int n, char *a, char *b) +{ + int i; + + for (i = 0; i <= n - 1; ++i) + a[i] = b[i]; +} diff --git a/gcc/testsuite/gcc.target/xtensa/xtensa.exp b/gcc/testsuite/gcc.target/xtensa/xtensa.exp new file mode 100644 index 000000000000..8720327f526e --- /dev/null +++ b/gcc/testsuite/gcc.target/xtensa/xtensa.exp @@ -0,0 +1,41 @@ +# Copyright (C) 2019 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with GCC; see the file COPYING3. If not see +# <http://www.gnu.org/licenses/>. + +# GCC testsuite that uses the `dg.exp' driver. + +# Exit immediately if this isn't an Xtensa target. +if ![istarget xtensa*-*-*] then { + return +} + +# Load support procs. +load_lib gcc-dg.exp + +# If a testcase doesn't have special options, use these. +global DEFAULT_CFLAGS +if ![info exists DEFAULT_CFLAGS] then { + set DEFAULT_CFLAGS " -ansi -pedantic-errors" +} + +# Initialize `dg'. +dg-init + +# Main loop. +dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] \ + "" $DEFAULT_CFLAGS + +# All done. +dg-finish