diff options
Diffstat (limited to 'gcc/postreload.c')
-rw-r--r-- | gcc/postreload.c | 30 |
1 files changed, 16 insertions, 14 deletions
diff --git a/gcc/postreload.c b/gcc/postreload.c index f5a987a7f0d..835a7218b36 100644 --- a/gcc/postreload.c +++ b/gcc/postreload.c @@ -664,7 +664,7 @@ reload_combine (void) FOR_EACH_BB_REVERSE (bb) { - insn = bb->head; + insn = BB_HEAD (bb); if (GET_CODE (insn) == CODE_LABEL) { HARD_REG_SET live; @@ -718,7 +718,9 @@ reload_combine (void) ... (MEM (PLUS (REGZ) (REGY)))... . First, check that we have (set (REGX) (PLUS (REGX) (REGY))) - and that we know all uses of REGX before it dies. */ + and that we know all uses of REGX before it dies. + Also, explicitly check that REGX != REGY; our life information + does not yet show whether REGY changes in this insn. */ set = single_set (insn); if (set != NULL_RTX && GET_CODE (SET_DEST (set)) == REG @@ -728,6 +730,7 @@ reload_combine (void) && GET_CODE (SET_SRC (set)) == PLUS && GET_CODE (XEXP (SET_SRC (set), 1)) == REG && rtx_equal_p (XEXP (SET_SRC (set), 0), SET_DEST (set)) + && !rtx_equal_p (XEXP (SET_SRC (set), 1), SET_DEST (set)) && last_label_ruid < reg_state[REGNO (SET_DEST (set))].use_ruid) { rtx reg = SET_DEST (set); @@ -1196,14 +1199,12 @@ reload_cse_move2add (rtx first) else if (rtx_cost (new_src, PLUS) < rtx_cost (src, SET) && have_add2_insn (reg, new_src)) { - rtx newpat = gen_add2_insn (reg, new_src); - if (INSN_P (newpat) && NEXT_INSN (newpat) == NULL_RTX) - newpat = PATTERN (newpat); - /* If it was the first insn of a sequence or - some other emitted insn, validate_change will - reject it. */ - validate_change (insn, &PATTERN (insn), - newpat, 0); + rtx newpat = gen_rtx_SET (VOIDmode, + reg, + gen_rtx_PLUS (GET_MODE (reg), + reg, + new_src)); + validate_change (insn, &PATTERN (insn), newpat, 0); } else { @@ -1285,10 +1286,11 @@ reload_cse_move2add (rtx first) < COSTS_N_INSNS (1) + rtx_cost (src3, SET)) && have_add2_insn (reg, new_src)) { - rtx newpat = gen_add2_insn (reg, new_src); - if (INSN_P (newpat) - && NEXT_INSN (newpat) == NULL_RTX) - newpat = PATTERN (newpat); + rtx newpat = gen_rtx_SET (VOIDmode, + reg, + gen_rtx_PLUS (GET_MODE (reg), + reg, + new_src)); success = validate_change (next, &PATTERN (next), newpat, 0); |