Hi,
I noticed that pic_offset_table_rtx is initialized twice in GCC.  Take
x86_32 as an example.
The first initialization is done in emit_init_regs, with below code:

  pic_offset_table_rtx = NULL_RTX;
  if ((unsigned) PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)
    pic_offset_table_rtx = gen_raw_REG (Pmode, PIC_OFFSET_TABLE_REGNUM);

On x86_32 with pic, we have:

(gdb) call debug_rtx(this_target_rtl->x_pic_offset_table_rtx)
(reg:SI 3 bx)

The second initialization is in expand_used_vars, with below code:

  if (targetm.use_pseudo_pic_reg ())
    pic_offset_table_rtx = gen_reg_rtx (Pmode);

On x86_32 with pic, we have:

(gdb) call debug_rtx(this_target_rtl->x_pic_offset_table_rtx)
(reg:SI 87)

So basically after expanding the first function, pic_offset_table_rtx
is set to a pseudo register, rather than the one initialized in
emit_init_regs.

Also this causes inconsistent compilation for the first/rest functions
in one compilation unit.

A bug?

Thanks,
bin

Reply via email to