diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2016-09-22 16:34:09 +0200 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2016-09-22 14:34:09 +0000 |
commit | d6da226a1e2931d818dc70602715c8bce7dddb01 (patch) | |
tree | 4057da0f7154824f3602ba3c5932548352a4f529 /gcc/regcprop.c | |
parent | 2dbe56bdfbf6c570cf23073f0c596da6bd1531c8 (diff) | |
download | gcc-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.c | 24 |
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) |