Bernd Edlinger <[email protected]> writes:
> --- gcc/config/mips/mips.c.jj 2015-06-08 23:06:50.000000000 +0200
> +++ gcc/config/mips/mips.c 2015-07-03 13:16:02.637293167 +0200
> @@ -9902,8 +9902,11 @@ mips_cfun_has_inflexible_gp_ref_p (void)
> static bool
> mips_insn_has_flexible_gp_ref_p (rtx_insn *insn)
> {
> - return (get_attr_got (insn) != GOT_UNSET
> - || mips_small_data_pattern_p (PATTERN (insn))
> + rtx_insn *subinsn;
> + FOR_EACH_SUBINSN (subinsn, insn)
> + if (get_attr_got (subinsn) != GOT_UNSET)
> + return true;
> + return (mips_small_data_pattern_p (PATTERN (insn))
> || reg_overlap_mentioned_p (pic_offset_table_rtx, PATTERN (insn)));
> }
>
The final return here would also mishandle SEQUENCE PATTERNs.
The idea was that this function would only see "real" instructions,
so I think instead the FOR_EACH_SUBINSN should be here:
static bool
mips_find_gp_ref (bool *cache, bool (*pred) (rtx_insn *))
{
rtx_insn *insn;
if (!*cache)
{
push_topmost_sequence ();
for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
---->
if (USEFUL_INSN_P (insn) && pred (insn))
Thanks,
Richard