re PR rtl-optimization/34012 (Pessimization caused by fwprop)

PR rtl-optimization/34012
	* fwprop.c (try_fwprop_subst): Do not replace if the new
	SET_SRC has a higher cost than the old one.

	* gcc.target/i386/pr34012.c: New test.

Co-Authored-By: Jakub Jelinek <jakub@redhat.com>

From-SVN: r130043
This commit is contained in:
Paolo Bonzini 2007-11-09 13:02:25 +00:00 committed by Jakub Jelinek
parent 96cdfb52ff
commit de26695057
4 changed files with 69 additions and 8 deletions

View File

@ -1,3 +1,10 @@
2007-11-09 Paolo Bonzini <bonzini@gnu.org>
Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/34012
* fwprop.c (try_fwprop_subst): Do not replace if the new
SET_SRC has a higher cost than the old one.
2007-11-09 Eric Botcazou <ebotcazou@libertysurf.fr>
PR rtl-optimization/33732

View File

@ -675,6 +675,9 @@ try_fwprop_subst (struct df_ref *use, rtx *loc, rtx new, rtx def_insn, bool set_
rtx insn = DF_REF_INSN (use);
enum df_ref_type type = DF_REF_TYPE (use);
int flags = DF_REF_FLAGS (use);
rtx set = single_set (insn);
int old_cost = rtx_cost (SET_SRC (set), SET);
bool ok;
if (dump_file)
{
@ -685,11 +688,34 @@ try_fwprop_subst (struct df_ref *use, rtx *loc, rtx new, rtx def_insn, bool set_
fprintf (dump_file, "\n");
}
if (validate_unshare_change (insn, loc, new, false))
validate_unshare_change (insn, loc, new, true);
if (!verify_changes (0))
{
if (dump_file)
fprintf (dump_file, "Changes to insn %d not recognized\n",
INSN_UID (insn));
ok = false;
}
else if (rtx_cost (SET_SRC (set), SET) > old_cost)
{
if (dump_file)
fprintf (dump_file, "Changes to insn %d not profitable\n",
INSN_UID (insn));
ok = false;
}
else
{
num_changes++;
if (dump_file)
fprintf (dump_file, "Changed insn %d\n", INSN_UID (insn));
ok = true;
}
if (ok)
{
confirm_change_group ();
num_changes++;
df_ref_remove (use);
if (!CONSTANT_P (new))
@ -697,13 +723,10 @@ try_fwprop_subst (struct df_ref *use, rtx *loc, rtx new, rtx def_insn, bool set_
update_df (insn, loc, DF_INSN_USES (def_insn), type, flags);
update_df (insn, loc, DF_INSN_EQ_USES (def_insn), type, flags);
}
return true;
}
else
{
if (dump_file)
fprintf (dump_file, "Changes to insn %d not recognized\n",
INSN_UID (insn));
cancel_changes (0);
/* Can also record a simplified value in a REG_EQUAL note, making a
new one if one does not already exist. */
@ -724,9 +747,9 @@ try_fwprop_subst (struct df_ref *use, rtx *loc, rtx new, rtx def_insn, bool set_
type, DF_REF_IN_NOTE);
}
}
return false;
}
return ok;
}

View File

@ -1,3 +1,9 @@
2007-11-09 Paolo Bonzini <bonzini@gnu.org>
Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/34012
* gcc.target/i386/pr34012.c: New test.
2007-11-09 Richard Guenther <rguenther@suse.de>
PR tree-optimization/33604

View File

@ -0,0 +1,25 @@
/* PR rtl-optimization/34012 */
/* { dg-do compile } */
/* { dg-require-effective-target lp64 } */
/* { dg-options "-O2" } */
void bar (long int *);
void
foo (void)
{
long int buf[10];
buf[0] = 0x0808080808080808;
buf[1] = 0x0808080808080808;
buf[2] = 0x0808080808080808;
buf[3] = 0x0808080808080808;
buf[4] = 0x0808080808080808;
buf[5] = 0x0808080808080808;
buf[6] = 0x0808080808080808;
buf[7] = 0x0808080808080808;
buf[8] = 0x0808080808080808;
buf[9] = 0x0808080808080808;
bar (buf);
}
/* Check that CSE did its job and fwprop hasn't undone it. */
/* { dg-final { scan-assembler-times "578721382704613384|0808080808080808" 1 } } */