Commit 4692943d by Bernd Schmidt Committed by Jeff Law

re PR rtl-optimization/79728 (ICE in setup_pressure_classes, at ira.c:912)

	PR rtl-optimization/79728
	* regs.h (struct target_regs): New field
	x_contains_allocatable_regs_of_mode.
	(contains_allocatable_regs_of_mode): New macro.
	* reginfo.c (init_reg_sets_1): Initialize it, and change
	contains_reg_of_mode so it includes global regs as well.
	* reload.c (push_reload): Use contains_allocatable_regs_of_mode
	rather than contains_regs_of_mode.

	PR rtl-optimization/79728
	* gcc.target/i386/sse-globalreg.c: New test.

From-SVN: r246138
parent 6c841832
2017-03-14 Bernd Schmidt <bschmidt@redhat.com>
PR rtl-optimization/79728
* regs.h (struct target_regs): New field
x_contains_allocatable_regs_of_mode.
(contains_allocatable_regs_of_mode): New macro.
* reginfo.c (init_reg_sets_1): Initialize it, and change
contains_reg_of_mode so it includes global regs as well.
* reload.c (push_reload): Use contains_allocatable_regs_of_mode
rather than contains_regs_of_mode.
2017-03-14 Martin Liska <mliska@suse.cz> 2017-03-14 Martin Liska <mliska@suse.cz>
* doc/invoke.texi: Document options that can't be combined with * doc/invoke.texi: Document options that can't be combined with
......
...@@ -468,19 +468,29 @@ init_reg_sets_1 (void) ...@@ -468,19 +468,29 @@ init_reg_sets_1 (void)
memset (contains_reg_of_mode, 0, sizeof (contains_reg_of_mode)); memset (contains_reg_of_mode, 0, sizeof (contains_reg_of_mode));
for (m = 0; m < (unsigned int) MAX_MACHINE_MODE; m++) for (m = 0; m < (unsigned int) MAX_MACHINE_MODE; m++)
{ {
HARD_REG_SET ok_regs; HARD_REG_SET ok_regs, ok_regs2;
CLEAR_HARD_REG_SET (ok_regs); CLEAR_HARD_REG_SET (ok_regs);
CLEAR_HARD_REG_SET (ok_regs2);
for (j = 0; j < FIRST_PSEUDO_REGISTER; j++) for (j = 0; j < FIRST_PSEUDO_REGISTER; j++)
if (!fixed_regs [j] && HARD_REGNO_MODE_OK (j, (machine_mode) m)) if (!TEST_HARD_REG_BIT (fixed_nonglobal_reg_set, j)
SET_HARD_REG_BIT (ok_regs, j); && HARD_REGNO_MODE_OK (j, (machine_mode) m))
{
SET_HARD_REG_BIT (ok_regs, j);
if (!fixed_regs[j])
SET_HARD_REG_BIT (ok_regs2, j);
}
for (i = 0; i < N_REG_CLASSES; i++) for (i = 0; i < N_REG_CLASSES; i++)
if ((targetm.class_max_nregs ((reg_class_t) i, (machine_mode) m) if ((targetm.class_max_nregs ((reg_class_t) i, (machine_mode) m)
<= reg_class_size[i]) <= reg_class_size[i])
&& hard_reg_set_intersect_p (ok_regs, reg_class_contents[i])) && hard_reg_set_intersect_p (ok_regs, reg_class_contents[i]))
{ {
contains_reg_of_mode [i][m] = 1; contains_reg_of_mode[i][m] = 1;
have_regs_of_mode [m] = 1; if (hard_reg_set_intersect_p (ok_regs2, reg_class_contents[i]))
{
have_regs_of_mode[m] = 1;
contains_allocatable_reg_of_mode[i][m] = 1;
}
} }
} }
} }
......
...@@ -218,6 +218,10 @@ struct target_regs { ...@@ -218,6 +218,10 @@ struct target_regs {
/* 1 if the corresponding class contains a register of the given mode. */ /* 1 if the corresponding class contains a register of the given mode. */
char x_contains_reg_of_mode[N_REG_CLASSES][MAX_MACHINE_MODE]; char x_contains_reg_of_mode[N_REG_CLASSES][MAX_MACHINE_MODE];
/* 1 if the corresponding class contains a register of the given mode
which is not global and can therefore be allocated. */
char x_contains_allocatable_reg_of_mode[N_REG_CLASSES][MAX_MACHINE_MODE];
/* Record for each mode whether we can move a register directly to or /* Record for each mode whether we can move a register directly to or
from an object of that mode in memory. If we can't, we won't try from an object of that mode in memory. If we can't, we won't try
to use that mode directly when accessing a field of that mode. */ to use that mode directly when accessing a field of that mode. */
...@@ -243,6 +247,8 @@ extern struct target_regs *this_target_regs; ...@@ -243,6 +247,8 @@ extern struct target_regs *this_target_regs;
(this_target_regs->x_have_regs_of_mode) (this_target_regs->x_have_regs_of_mode)
#define contains_reg_of_mode \ #define contains_reg_of_mode \
(this_target_regs->x_contains_reg_of_mode) (this_target_regs->x_contains_reg_of_mode)
#define contains_allocatable_reg_of_mode \
(this_target_regs->x_contains_allocatable_reg_of_mode)
#define direct_load \ #define direct_load \
(this_target_regs->x_direct_load) (this_target_regs->x_direct_load)
#define direct_store \ #define direct_store \
......
...@@ -1055,7 +1055,7 @@ push_reload (rtx in, rtx out, rtx *inloc, rtx *outloc, ...@@ -1055,7 +1055,7 @@ push_reload (rtx in, rtx out, rtx *inloc, rtx *outloc,
#ifdef CANNOT_CHANGE_MODE_CLASS #ifdef CANNOT_CHANGE_MODE_CLASS
&& !CANNOT_CHANGE_MODE_CLASS (GET_MODE (SUBREG_REG (in)), inmode, rclass) && !CANNOT_CHANGE_MODE_CLASS (GET_MODE (SUBREG_REG (in)), inmode, rclass)
#endif #endif
&& contains_reg_of_mode[(int) rclass][(int) GET_MODE (SUBREG_REG (in))] && contains_allocatable_reg_of_mode[rclass][GET_MODE (SUBREG_REG (in))]
&& (CONSTANT_P (SUBREG_REG (in)) && (CONSTANT_P (SUBREG_REG (in))
|| GET_CODE (SUBREG_REG (in)) == PLUS || GET_CODE (SUBREG_REG (in)) == PLUS
|| strict_low || strict_low
...@@ -1164,7 +1164,7 @@ push_reload (rtx in, rtx out, rtx *inloc, rtx *outloc, ...@@ -1164,7 +1164,7 @@ push_reload (rtx in, rtx out, rtx *inloc, rtx *outloc,
#ifdef CANNOT_CHANGE_MODE_CLASS #ifdef CANNOT_CHANGE_MODE_CLASS
&& !CANNOT_CHANGE_MODE_CLASS (GET_MODE (SUBREG_REG (out)), outmode, rclass) && !CANNOT_CHANGE_MODE_CLASS (GET_MODE (SUBREG_REG (out)), outmode, rclass)
#endif #endif
&& contains_reg_of_mode[(int) rclass][(int) GET_MODE (SUBREG_REG (out))] && contains_allocatable_reg_of_mode[rclass][GET_MODE (SUBREG_REG (out))]
&& (CONSTANT_P (SUBREG_REG (out)) && (CONSTANT_P (SUBREG_REG (out))
|| strict_low || strict_low
|| (((REG_P (SUBREG_REG (out)) || (((REG_P (SUBREG_REG (out))
......
2017-03-14 Bernd Schmidt <bschmidt@redhat.com>
PR rtl-optimization/79728
* gcc.target/i386/sse-globalreg.c: New test.
2017-03-14 Martin Liska <mliska@suse.cz> 2017-03-14 Martin Liska <mliska@suse.cz>
PR lto/66295 PR lto/66295
......
/* { dg-do compile } */
/* { dg-options "-O2 -msse2 -w" } */
/* { dg-require-effective-target sse2 } */
register int a __asm__("xmm0");
void fn1() {}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment