aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2013-10-28 23:15:12 +0000
committerVladimir Makarov <vmakarov@gcc.gnu.org>2013-10-28 23:15:12 +0000
commite697148cb05240b68764232fb1d47d2acbdcfb3b (patch)
tree684f19b05b7a869896d92d5ec9a43ac551ab0547 /gcc
parent829812272776c340b4008f2b0a3c44d61b08c6e0 (diff)
downloadgcc-e697148cb05240b68764232fb1d47d2acbdcfb3b.zip
gcc-e697148cb05240b68764232fb1d47d2acbdcfb3b.tar.gz
gcc-e697148cb05240b68764232fb1d47d2acbdcfb3b.tar.bz2
lra-spills.c (lra_final_code_change): Remove useless move insns originated from moves of pseudos.
2013-10-28 Vladimir Makarov <vmakarov@redhat.com> * lra-spills.c (lra_final_code_change): Remove useless move insns originated from moves of pseudos. From-SVN: r204140
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/lra-spills.c24
2 files changed, 28 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 013fe73..70193b4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2013-10-28 Vladimir Makarov <vmakarov@redhat.com>
+
+ * lra-spills.c (lra_final_code_change): Remove useless move insns
+ originated from moves of pseudos.
+
2013-10-28 Jeff Law <law@redhat.com>
* lower-subreg.c (resolve_simple_move): Fix comment typo.
diff --git a/gcc/lra-spills.c b/gcc/lra-spills.c
index 7c0c630..7690fbc 100644
--- a/gcc/lra-spills.c
+++ b/gcc/lra-spills.c
@@ -625,7 +625,7 @@ lra_final_code_change (void)
{
int i, hard_regno;
basic_block bb;
- rtx insn, curr;
+ rtx insn, curr, set;
int max_regno = max_reg_num ();
for (i = FIRST_PSEUDO_REGISTER; i < max_regno; i++)
@@ -636,6 +636,7 @@ lra_final_code_change (void)
FOR_BB_INSNS_SAFE (bb, insn, curr)
if (INSN_P (insn))
{
+ bool change_p;
rtx pat = PATTERN (insn);
if (GET_CODE (pat) == CLOBBER && LRA_TEMP_CLOBBER_P (pat))
@@ -648,6 +649,12 @@ lra_final_code_change (void)
continue;
}
+ set = single_set (insn);
+ change_p = (set != NULL
+ && REG_P (SET_SRC (set)) && REG_P (SET_DEST (set))
+ && REGNO (SET_SRC (set)) >= FIRST_PSEUDO_REGISTER
+ && REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER);
+
lra_insn_recog_data_t id = lra_get_insn_recog_data (insn);
struct lra_static_insn_data *static_id = id->insn_static_data;
bool insn_change_p = false;
@@ -661,5 +668,20 @@ lra_final_code_change (void)
}
if (insn_change_p)
lra_update_operator_dups (id);
+
+ if (change_p && REGNO (SET_SRC (set)) == REGNO (SET_DEST (set)))
+ {
+ /* Remove an useless move insn but only involving
+ pseudos as some subsequent optimizations are based on
+ that move insns involving originally hard registers
+ are preserved. IRA can generate move insns involving
+ pseudos. It is better remove them earlier to speed
+ up compiler a bit. It is also better to do it here
+ as they might not pass final RTL check in LRA,
+ (e.g. insn moving a control register into
+ itself). */
+ lra_invalidate_insn_data (insn);
+ delete_insn (insn);
+ }
}
}