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
This commit is contained in:
Max Filippov 2019-09-26 20:51:27 +00:00 committed by Max Filippov
parent 25b45c7c6c
commit d7326aaf20
5 changed files with 65 additions and 2 deletions

View File

@ -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.

View File

@ -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))

View File

@ -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.

View File

@ -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];
}

View File

@ -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