diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 82c7a3580f9..ac457722dd4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2012-08-27 Richard Sandiford + + * config/mips/mips.c (mips_pic_call_symbol_from_set): Check for + SYMBOL_REF SET_SRCs. + 2012-08-27 Richard Sandiford * config/mips/mips.c (vr4130_align_insns): Don't simulate diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index b20e4ed3636..7721a7c1ce1 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -14706,13 +14706,13 @@ mips_pic_call_symbol_from_set (df_ref def, rtx reg, bool recurse_p) { rtx note, src, symbol; - /* First, look at REG_EQUAL/EQUIV notes. */ - note = find_reg_equal_equiv_note (def_insn); - if (note && GET_CODE (XEXP (note, 0)) == SYMBOL_REF) - return XEXP (note, 0); - - /* For %call16 references we don't have REG_EQUAL. */ + /* First see whether the source is a plain symbol. This is used + when calling symbols that are not lazily bound. */ src = SET_SRC (set); + if (GET_CODE (src) == SYMBOL_REF) + return src; + + /* Handle %call16 references. */ symbol = mips_strip_unspec_call (src); if (symbol) { @@ -14720,6 +14720,12 @@ mips_pic_call_symbol_from_set (df_ref def, rtx reg, bool recurse_p) return symbol; } + /* If we have something more complicated, look for a + REG_EQUAL or REG_EQUIV note. */ + note = find_reg_equal_equiv_note (def_insn); + if (note && GET_CODE (XEXP (note, 0)) == SYMBOL_REF) + return XEXP (note, 0); + /* Follow at most one simple register copy. Such copies are interesting in cases like: