+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
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)
{
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))
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. */
type, DF_REF_IN_NOTE);
}
}
-
- return false;
}
+
+ return ok;
}
+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
--- /dev/null
+/* 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 } } */