[Bug jit/64722] On 2nd time libgccjit is run in-process on i686, generated code clobbers %ebx register
dmalcolm at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Jan 23 16:05:00 GMT 2015
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64722
--- Comment #13 from David Malcolm <dmalcolm at gcc dot gnu.org> ---
(In reply to Ilya Enkovich from comment #11)
> (In reply to David Malcolm from comment #10)
> > which led to investigating this code in ix86_conditional_register_usage:
> > 4394 j = PIC_OFFSET_TABLE_REGNUM;
> > 4395 if (j != INVALID_REGNUM)
> > 4396 fixed_regs[j] = call_used_regs[j] = 1;
> > and line 4396 is bizarrely only called on the 2nd iteration, not the 1st,
> > which led me to investigate "PIC_OFFSET_TABLE_REGNUM", and discover what
> > appears to be the root cause, as described in comment #1.
>
> Now I see. The problem also is in ix86_conditional_register_usage that
> relies on pic_offset_table_rtx value. As I said EBX value is used only to
> estimate costs for middle-end. Thus we shouldn't fix reg here if pseudo pic
> register is used and correct code would be:
>
> @@ -4388,7 +4388,7 @@ ix86_conditional_register_usage (void)
>
> /* The PIC register, if it exists, is fixed. */
> j = PIC_OFFSET_TABLE_REGNUM;
> - if (j != INVALID_REGNUM)
> + if (j != INVALID_REGNUM && !ix86_use_pseudo_pic_reg ())
> fixed_regs[j] = call_used_regs[j] = 1;
>
> /* For 32-bit targets, squash the REX registers. */
Ilya: I can't speak to the correctness of the above code or patch, but r220044
fixes the original issue I ran into. Do you want me to keep this bug open, or
should we track the above in a separate PR?
More information about the Gcc-bugs
mailing list