re PR rtl-optimization/42258 (redundant register move around mul instruction)

gcc/
	PR rtl-optimization/42258
	* ira-lives.c (check_and_make_def_conflict): Ignore conflict for a
	use that may match DEF.

testsuite/
	PR rtl-optimization/42258
	* gcc.target/arm/thumb1-mul-moves.c: New test.

From-SVN: r157581
This commit is contained in:
Bernd Schmidt 2010-03-19 18:18:54 +00:00 committed by Bernd Schmidt
parent f9ceed32dc
commit 002b2dee5d
4 changed files with 40 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2010-03-19 Bernd Schmidt <bernd.schmidt@codesourcery.com>
PR rtl-optimization/42258
* ira-lives.c (check_and_make_def_conflict): Ignore conflict for a
use that may match DEF.
2010-03-19 Michael Matz <matz@suse.de>
PR c++/43116

View File

@ -499,6 +499,8 @@ check_and_make_def_conflict (int alt, int def, enum reg_class def_cl)
for (use = 0; use < recog_data.n_operands; use++)
{
int alt1;
if (use == def || recog_data.operand_type[use] == OP_OUT)
continue;
@ -507,6 +509,22 @@ check_and_make_def_conflict (int alt, int def, enum reg_class def_cl)
else
use_cl = recog_op_alt[use][alt].cl;
/* If there's any alternative that allows USE to match DEF, do not
record a conflict. If that causes us to create an invalid
instruction due to the earlyclobber, reload must fix it up. */
for (alt1 = 0; alt1 < recog_data.n_alternatives; alt1++)
if (recog_op_alt[use][alt1].matches == def
|| (use < recog_data.n_operands - 1
&& recog_data.constraints[use][0] == '%'
&& recog_op_alt[use + 1][alt1].matches == def)
|| (use >= 1
&& recog_data.constraints[use - 1][0] == '%'
&& recog_op_alt[use - 1][alt1].matches == def))
break;
if (alt1 < recog_data.n_alternatives)
continue;
advance_p = check_and_make_def_use_conflict (dreg, def_cl, use,
use_cl, advance_p);

View File

@ -1,3 +1,8 @@
2010-03-19 Bernd Schmidt <bernd.schmidt@codesourcery.com>
PR rtl-optimization/42258
* gcc.target/arm/thumb1-mul-moves.c: New test.
2010-03-19 Michael Matz <matz@suse.de>
PR c++/43116

View File

@ -0,0 +1,11 @@
/* Check for unnecessary register moves. */
/* { dg-options "-mthumb -Os" } */
/* { dg-require-effective-target arm_thumb1_ok } */
int f(int x)
{
return x*42;
}
/* { dg-final { scan-assembler-not "mov\[\\t \]*r0," } } */