diff options
author | Paolo Bonzini <bonzini@gnu.org> | 2007-11-09 13:02:25 +0000 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2007-11-09 14:02:25 +0100 |
commit | de266950570fd88e4e205bfb87bcbd7ba89b5c27 (patch) | |
tree | 2787d0ea1d32fb11d9a9124a3793a190bc159486 /gcc/fwprop.c | |
parent | 96cdfb52ff5c5ff9c7b73ef81b23fc1e637b925b (diff) | |
download | gcc-de266950570fd88e4e205bfb87bcbd7ba89b5c27.tar.gz |
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
Diffstat (limited to 'gcc/fwprop.c')
-rw-r--r-- | gcc/fwprop.c | 39 |
1 files changed, 31 insertions, 8 deletions
diff --git a/gcc/fwprop.c b/gcc/fwprop.c index ff3123fe9e3..eecd0a0a5de 100644 --- a/gcc/fwprop.c +++ b/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; } |