diff options
Diffstat (limited to 'gcc/combine.c')
-rw-r--r-- | gcc/combine.c | 47 |
1 files changed, 21 insertions, 26 deletions
diff --git a/gcc/combine.c b/gcc/combine.c index 0005e2a..3a173de 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -2167,30 +2167,23 @@ try_combine (i3, i2, i1, new_direct_jump_p) } } - /* If we've split a jump pattern, we'll wind up with a sequence even - with one instruction. We can handle that below, so extract it. */ - if (m_split && GET_CODE (m_split) == SEQUENCE - && XVECLEN (m_split, 0) == 1) - m_split = PATTERN (XVECEXP (m_split, 0, 0)); - - if (m_split && GET_CODE (m_split) != SEQUENCE) + if (m_split && NEXT_INSN (m_split) == NULL_RTX) { + m_split = PATTERN (m_split); insn_code_number = recog_for_combine (&m_split, i3, &new_i3_notes); if (insn_code_number >= 0) newpat = m_split; } - else if (m_split && GET_CODE (m_split) == SEQUENCE - && XVECLEN (m_split, 0) == 2 + else if (m_split && NEXT_INSN (NEXT_INSN (m_split)) == NULL_RTX && (next_real_insn (i2) == i3 - || ! use_crosses_set_p (PATTERN (XVECEXP (m_split, 0, 0)), - INSN_CUID (i2)))) + || ! use_crosses_set_p (PATTERN (m_split), INSN_CUID (i2)))) { rtx i2set, i3set; - rtx newi3pat = PATTERN (XVECEXP (m_split, 0, 1)); - newi2pat = PATTERN (XVECEXP (m_split, 0, 0)); + rtx newi3pat = PATTERN (NEXT_INSN (m_split)); + newi2pat = PATTERN (m_split); - i3set = single_set (XVECEXP (m_split, 0, 1)); - i2set = single_set (XVECEXP (m_split, 0, 0)); + i3set = single_set (NEXT_INSN (m_split)); + i2set = single_set (m_split); /* In case we changed the mode of I2DEST, replace it in the pseudo-register table here. We can't do it above in case this @@ -2960,20 +2953,22 @@ find_split_point (loc, insn) we can make put both sources together and make a split point in the middle. */ - if (seq && XVECLEN (seq, 0) == 2 - && GET_CODE (XVECEXP (seq, 0, 0)) == INSN - && GET_CODE (PATTERN (XVECEXP (seq, 0, 0))) == SET - && SET_DEST (PATTERN (XVECEXP (seq, 0, 0))) == reg + if (seq + && NEXT_INSN (seq) != NULL_RTX + && NEXT_INSN (NEXT_INSN (seq)) == NULL_RTX + && GET_CODE (seq) == INSN + && GET_CODE (PATTERN (seq)) == SET + && SET_DEST (PATTERN (seq)) == reg && ! reg_mentioned_p (reg, - SET_SRC (PATTERN (XVECEXP (seq, 0, 0)))) - && GET_CODE (XVECEXP (seq, 0, 1)) == INSN - && GET_CODE (PATTERN (XVECEXP (seq, 0, 1))) == SET - && SET_DEST (PATTERN (XVECEXP (seq, 0, 1))) == reg + SET_SRC (PATTERN (seq))) + && GET_CODE (NEXT_INSN (seq)) == INSN + && GET_CODE (PATTERN (NEXT_INSN (seq))) == SET + && SET_DEST (PATTERN (NEXT_INSN (seq))) == reg && memory_address_p (GET_MODE (x), - SET_SRC (PATTERN (XVECEXP (seq, 0, 1))))) + SET_SRC (PATTERN (NEXT_INSN (seq))))) { - rtx src1 = SET_SRC (PATTERN (XVECEXP (seq, 0, 0))); - rtx src2 = SET_SRC (PATTERN (XVECEXP (seq, 0, 1))); + rtx src1 = SET_SRC (PATTERN (seq)); + rtx src2 = SET_SRC (PATTERN (NEXT_INSN (seq))); /* Replace the placeholder in SRC2 with SRC1. If we can find where in SRC2 it was placed, that can become our |