]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
xtensa: backport fix for PR target/91880
authorMax Filippov <jcmvbkbc@gmail.com>
Thu, 26 Sep 2019 20:51:27 +0000 (20:51 +0000)
committerMax Filippov <jcmvbkbc@gmail.com>
Wed, 15 Apr 2020 21:13:59 +0000 (14:13 -0700)
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.

2020-04-15  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/ChangeLog
gcc/config/xtensa/xtensa.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/xtensa/pr91880.c [new file with mode: 0644]
gcc/testsuite/gcc.target/xtensa/xtensa.exp [new file with mode: 0644]

index 25bca188e49e879fde45f2720551248188e1976a..478bd086276780c4f603605400356062560b57d1 100644 (file)
@@ -1,3 +1,12 @@
+2020-04-15  Max Filippov  <jcmvbkbc@gmail.com>
+
+       Backport from mainline.
+       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.
+
 2020-04-15  Uroš Bizjak  <ubizjak@gmail.com>
 
        PR target/94603
index ee5612441e25d7a48502234ab2188e3abfd2315f..2527468d57dbf212025d4eb838f35d9bd8011bb3 100644 (file)
@@ -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))
index aa9f6d98eae5d8f4597f1b4da06ffe7ee454cd40..b322f4bec34f7b6fb230621cc2998ffeb9aa49fb 100644 (file)
@@ -1,3 +1,11 @@
+2020-04-15  Max Filippov  <jcmvbkbc@gmail.com>
+
+       Backport from mainline.
+       2019-09-26  Max Filippov  <jcmvbkbc@gmail.com>
+
+       * gcc.target/xtensa/pr91880.c: New test case.
+       * gcc.target/xtensa/xtensa.exp: New test suite.
+
 2020-04-15  Uroš Bizjak  <ubizjak@gmail.com>
 
        PR target/94603
diff --git a/gcc/testsuite/gcc.target/xtensa/pr91880.c b/gcc/testsuite/gcc.target/xtensa/pr91880.c
new file mode 100644 (file)
index 0000000..f4895a1
--- /dev/null
@@ -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 (file)
index 0000000..8720327
--- /dev/null
@@ -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