[PR104400] LRA: Modify exclude start hard register calculation for insn alternative

v850 target has an interesting insn alternative constraint 'e!r' where e
denotes even general regs and e is a subset of r.  We cannot just make
union of exclude start hard registers for e and r and should use only
exclude start hard registers of r.  The following patch implements this.

gcc/ChangeLog:

	PR rtl-optimization/104400
	* lra-constraints.cc (process_alt_operands): Don't make union of
	this_alternative_exclude_start_hard_regs when reg class in insn
	alternative covers other reg classes in the same alternative.

gcc/testsuite/ChangeLog:

	PR rtl-optimization/104400
	* gcc.target/v850/pr104400.c: New.
	* gcc.target/v850/v850.exp: New.
This commit is contained in:
Vladimir N. Makarov 2022-02-11 09:52:14 -05:00
parent cc68ad8701
commit 274a4d2942
3 changed files with 57 additions and 2 deletions

View File

@ -2498,9 +2498,15 @@ process_alt_operands (int only_alternative)
if (mode == BLKmode)
break;
this_alternative = reg_class_subunion[this_alternative][cl];
if (hard_reg_set_subset_p (this_alternative_set,
reg_class_contents[cl]))
this_alternative_exclude_start_hard_regs
= ira_exclude_class_mode_regs[cl][mode];
else if (!hard_reg_set_subset_p (reg_class_contents[cl],
this_alternative_set))
this_alternative_exclude_start_hard_regs
|= ira_exclude_class_mode_regs[cl][mode];
this_alternative_set |= reg_class_contents[cl];
this_alternative_exclude_start_hard_regs
|= ira_exclude_class_mode_regs[cl][mode];
if (costly_p)
{
this_costly_alternative

View File

@ -0,0 +1,8 @@
/* { dg-do compile } */
/* { dg-options "-O2 -mv850e3v5" } */
double frob (double r)
{
r = -r;
return r;
}

View File

@ -0,0 +1,41 @@
# Copyright (C) 2022 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 v850 target.
if ![istarget v850*-*-*] 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