This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: df_insn_refs_record's handling of global_regs[]
On 10/19/07, David Miller <davem@davemloft.net> wrote:
> From: "Seongbae Park (박성배, 朴成培)" <seongbae.park@gmail.com>
> Date: Tue, 16 Oct 2007 22:56:49 -0700
>
> > Did you replace the DF_REF_REG_USE with DEF ?
> > If so, that's not correct. We need to add DEF as well as USE:
> ...
> > Then, we'll need to change the df_invalidated_by_call loop
> > not to add global_regs[] again (with MAY_CLOBBER bits).
>
> Seongbae-ssi, I've done full regstraps of mainline with the
> following patch on sparc-linux-gnu and sparc64-linux-gnu.
I've been testing this on x86-64 on top of 4.3,
and I see one regression in libgomp which I'm trying to find out
whether it's this patch or some other external cause.
> Do you mind if I check in this fix? I would also like to
> pursue getting this installed on the gcc-4.2 branch as well,
> as I stated I've already done several regstraps of the 4.2
> backport of this fix as well.
If you're not in a hurry, can you wait
till I run the regtest against 4.2 on x86-64 ?
I've already discussed the patch with Kenny
and we agreed that this is the right approach,
but I'd like to see the clean regtest on x86 for both 4.2 and 4.3
before I approve.
Thanks,
Seongbae
> Thank you.
>
> 2007-10-18 Seongbae Park <seongbae.park@gmail.com>
> David S. Miller <davem@davemloft.net>
>
> * df-scan.c (df_get_call_refs): Mark global registers as both a
> DF_REF_REG_USE and a non-clobber DF_REF_REG_DEF.
>
> --- df-scan.c.ORIG 2007-10-18 16:56:19.000000000 -0700
> +++ df-scan.c 2007-10-18 16:56:50.000000000 -0700
> @@ -3109,18 +3109,22 @@
> so they are recorded as used. */
> for (i = 0; i < FIRST_PSEUDO_REGISTER; i++)
> if (global_regs[i])
> - df_ref_record (collection_rec, regno_reg_rtx[i],
> - NULL, bb, insn, DF_REF_REG_USE, flags);
> + {
> + df_ref_record (collection_rec, regno_reg_rtx[i],
> + NULL, bb, insn, DF_REF_REG_USE, flags);
> + df_ref_record (collection_rec, regno_reg_rtx[i],
> + NULL, bb, insn, DF_REF_REG_DEF, flags);
> + }
>
> is_sibling_call = SIBLING_CALL_P (insn);
> EXECUTE_IF_SET_IN_BITMAP (df_invalidated_by_call, 0, ui, bi)
> {
> - if ((!bitmap_bit_p (defs_generated, ui))
> + if (!global_regs[ui]
> + && (!bitmap_bit_p (defs_generated, ui))
> && (!is_sibling_call
> || !bitmap_bit_p (df->exit_block_uses, ui)
> || refers_to_regno_p (ui, ui+1,
> current_function_return_rtx, NULL)))
> -
> df_ref_record (collection_rec, regno_reg_rtx[ui],
> NULL, bb, insn, DF_REF_REG_DEF, DF_REF_MAY_CLOBBER | flags);
> }