Revert revsion 229087 changes in lra-spills.c

r229087, which caused PR 69530, was supposed to fix PR 67609.  r229458
has made r229087 unnecessary.

gcc/

	PR target/69530
	* lra-splill.c (lra_final_code_change): Revert r229087 by
	removing all sub-registers.

gcc/testsuite/

	PR target/69530
	* gcc.target/i386/pr69530.c: New test.

From-SVN: r232991
This commit is contained in:
H.J. Lu 2016-01-29 18:03:42 +00:00 committed by H.J. Lu
parent af932cdb8a
commit 6bbacdb544
4 changed files with 30 additions and 38 deletions

View File

@ -1,3 +1,9 @@
2016-01-29 H.J. Lu <hongjiu.lu@intel.com>
PR target/69530
* lra-splill.c (lra_final_code_change): Revert r229087 by
removing all sub-registers.
2016-01-29 Steve Ellcey <sellcey@imgtec.com>
PR target/65604

View File

@ -760,44 +760,14 @@ lra_final_code_change (void)
struct lra_static_insn_data *static_id = id->insn_static_data;
bool insn_change_p = false;
for (i = id->insn_static_data->n_operands - 1; i >= 0; i--)
{
if (! DEBUG_INSN_P (insn) && static_id->operand[i].is_operator)
continue;
rtx op = *id->operand_loc[i];
if (static_id->operand[i].type == OP_OUT
&& GET_CODE (op) == SUBREG && REG_P (SUBREG_REG (op))
&& ! LRA_SUBREG_P (op))
{
hard_regno = REGNO (SUBREG_REG (op));
/* We can not always remove sub-registers of
hard-registers as we may lose information that
only a part of registers is changed and
subsequent optimizations may do wrong
transformations (e.g. dead code eliminations).
We can not also keep all sub-registers as the
subsequent optimizations can not handle all such
cases. Here is a compromise which works. */
if ((GET_MODE_SIZE (GET_MODE (op))
< GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))))
&& (hard_regno_nregs[hard_regno][GET_MODE (SUBREG_REG (op))]
== hard_regno_nregs[hard_regno][GET_MODE (op)])
#ifdef STACK_REGS
&& (hard_regno < FIRST_STACK_REG
|| hard_regno > LAST_STACK_REG)
#endif
)
continue;
}
if (alter_subregs (id->operand_loc[i], ! DEBUG_INSN_P (insn)))
{
lra_update_dup (id, i);
insn_change_p = true;
}
}
for (i = id->insn_static_data->n_operands - 1; i >= 0; i--)
if ((DEBUG_INSN_P (insn) || ! static_id->operand[i].is_operator)
&& alter_subregs (id->operand_loc[i], ! DEBUG_INSN_P (insn)))
{
lra_update_dup (id, i);
insn_change_p = true;
}
if (insn_change_p)
lra_update_operator_dups (id);
}

View File

@ -1,3 +1,8 @@
2016-01-29 H.J. Lu <hongjiu.lu@intel.com>
PR target/69530
* gcc.target/i386/pr69530.c: New test.
2016-01-29 Steve Ellcey <sellcey@imgtec.com>
PR target/65604

View File

@ -0,0 +1,11 @@
/* { dg-do compile { target int128 } } */
/* { dg-options "-O -fno-forward-propagate -fno-split-wide-types -mavx " } */
typedef unsigned __int128 v32u128 __attribute__ ((vector_size (32)));
v32u128
foo (v32u128 v32u128_0)
{
v32u128_0[0] *= v32u128_0[1];
return v32u128_0;
}