[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:
parent
cc68ad8701
commit
274a4d2942
@ -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
|
||||
|
8
gcc/testsuite/gcc.target/v850/pr104400.c
Normal file
8
gcc/testsuite/gcc.target/v850/pr104400.c
Normal file
@ -0,0 +1,8 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -mv850e3v5" } */
|
||||
|
||||
double frob (double r)
|
||||
{
|
||||
r = -r;
|
||||
return r;
|
||||
}
|
41
gcc/testsuite/gcc.target/v850/v850.exp
Normal file
41
gcc/testsuite/gcc.target/v850/v850.exp
Normal 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
|
Loading…
Reference in New Issue
Block a user