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:
parent
96cdfb52ff
commit
de26695057
4 changed files with 69 additions and 8 deletions
|
@ -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
|
||||
|
|
39
gcc/fwprop.c
39
gcc/fwprop.c
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
25
gcc/testsuite/gcc.target/i386/pr34012.c
Normal file
25
gcc/testsuite/gcc.target/i386/pr34012.c
Normal 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 } } */
|
Loading…
Add table
Reference in a new issue