aboutsummaryrefslogtreecommitdiff
path: root/gcc/regcprop.c
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2016-09-22 16:34:09 +0200
committerJan Hubicka <hubicka@gcc.gnu.org>2016-09-22 14:34:09 +0000
commitd6da226a1e2931d818dc70602715c8bce7dddb01 (patch)
tree4057da0f7154824f3602ba3c5932548352a4f529 /gcc/regcprop.c
parent2dbe56bdfbf6c570cf23073f0c596da6bd1531c8 (diff)
downloadgcc-d6da226a1e2931d818dc70602715c8bce7dddb01.zip
gcc-d6da226a1e2931d818dc70602715c8bce7dddb01.tar.gz
gcc-d6da226a1e2931d818dc70602715c8bce7dddb01.tar.bz2
* regcprop.c (copyprop_hardreg_forward_1): Remove noop moves.
From-SVN: r240365
Diffstat (limited to 'gcc/regcprop.c')
-rw-r--r--gcc/regcprop.c24
1 files changed, 23 insertions, 1 deletions
diff --git a/gcc/regcprop.c b/gcc/regcprop.c
index 1498300..d1c1f8b 100644
--- a/gcc/regcprop.c
+++ b/gcc/regcprop.c
@@ -771,6 +771,26 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd)
}
set = single_set (insn);
+
+ /* Detect noop sets and remove them before processing side effects. */
+ if (set && REG_P (SET_DEST (set)) && REG_P (SET_SRC (set)))
+ {
+ unsigned int regno = REGNO (SET_SRC (set));
+ rtx r1 = find_oldest_value_reg (REGNO_REG_CLASS (regno),
+ SET_DEST (set), vd);
+ rtx r2 = find_oldest_value_reg (REGNO_REG_CLASS (regno),
+ SET_SRC (set), vd);
+ if (rtx_equal_p (r1 ? r1 : SET_DEST (set), r2 ? r2 : SET_SRC (set)))
+ {
+ bool last = insn == BB_END (bb);
+ fprintf (stderr, "Bingo\n");
+ delete_insn (insn);
+ if (last)
+ break;
+ continue;
+ }
+ }
+
extract_constrain_insn (insn);
preprocess_constraints (insn);
const operand_alternative *op_alt = which_op_alt ();
@@ -860,7 +880,9 @@ copyprop_hardreg_forward_1 (basic_block bb, struct value_data *vd)
register in the same class. */
if (REG_P (SET_DEST (set)))
{
- new_rtx = find_oldest_value_reg (REGNO_REG_CLASS (regno), src, vd);
+ new_rtx = find_oldest_value_reg (REGNO_REG_CLASS (regno),
+ src, vd);
+
if (new_rtx && validate_change (insn, &SET_SRC (set), new_rtx, 0))
{
if (dump_file)