aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Filippov <jcmvbkbc@gmail.com>2019-09-26 20:51:27 +0000
committerMax Filippov <jcmvbkbc@gcc.gnu.org>2019-09-26 20:51:27 +0000
commitd7326aaf20871a81feb39673d78922c1bc83efec (patch)
treef946f3aba697deed6752d518e37e3d3e810b5e03
parent25b45c7c6cea24f85d2f87c11c0e3c99ef20b655 (diff)
downloadgcc-d7326aaf20871a81feb39673d78922c1bc83efec.zip
gcc-d7326aaf20871a81feb39673d78922c1bc83efec.tar.gz
gcc-d7326aaf20871a81feb39673d78922c1bc83efec.tar.bz2
xtensa: fix PR target/91880
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-26 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. From-SVN: r276166
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/xtensa/xtensa.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/xtensa/pr91880.c10
-rw-r--r--gcc/testsuite/gcc.target/xtensa/xtensa.exp41
5 files changed, 65 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 416bf63..3d12337 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2019-09-26 Max Filippov <jcmvbkbc@gmail.com>
+
+ * 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.
+
2019-09-26 Jakub Jelinek <jakub@redhat.com>
* function.c (gimplify_parameters): Use build_clobber function.
diff --git a/gcc/config/xtensa/xtensa.c b/gcc/config/xtensa/xtensa.c
index 3c129fd..9453f0c 100644
--- a/gcc/config/xtensa/xtensa.c
+++ b/gcc/config/xtensa/xtensa.c
@@ -4230,7 +4230,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;
@@ -4251,7 +4253,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/ChangeLog b/gcc/testsuite/ChangeLog
index 2d78fdd..7cdc8f0 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2019-09-26 Max Filippov <jcmvbkbc@gmail.com>
+
+ * gcc.target/xtensa/pr91880.c: New test case.
+ * gcc.target/xtensa/xtensa.exp: New test suite.
+
2019-09-26 Will Schmidt <will_schmidt@vnet.ibm.com>
* gcc.target/powerpc/pure-builtin-redundant-load.c: New.
diff --git a/gcc/testsuite/gcc.target/xtensa/pr91880.c b/gcc/testsuite/gcc.target/xtensa/pr91880.c
new file mode 100644
index 0000000..f4895a1
--- /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 0000000..8720327
--- /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