function.h (struct emit_status): Clarify potential contents of regno_reg_rtx array.

* function.h (struct emit_status): Clarify potential contents
        of regno_reg_rtx array.
        * integrate.c (copy_rtx_and_substitute): Update comments.  Make
        sure entry in regno_reg_rtx is a REG before checking REG_POINTER.

Co-Authored-By: Jeff Law <law@redhat.com>

From-SVN: r54924
This commit is contained in:
Jan Hubicka 2002-06-23 17:57:53 +02:00 committed by Jeff Law
parent 3bfb9a0be1
commit f81a79ef6a
3 changed files with 21 additions and 2 deletions

View File

@ -1,4 +1,10 @@
2002-06-23 Jan Hubicka <jh@suse.cz>
Jeff Law <law@redhat.com>
* function.h (struct emit_status): Clarify potential contents
of regno_reg_rtx array.
* integrate.c (copy_rtx_and_substitute): Update comments. Make
sure entry in regno_reg_rtx is a REG before checking REG_POINTER.
* reg-stack.c (convert_regs_exit): Push the registers to stack in
proper order.

View File

@ -105,7 +105,10 @@ struct emit_status GTY(())
tree * GTY ((length ("%h.regno_pointer_align_length"))) regno_decl;
/* Indexed by pseudo register number, gives the rtx for that pseudo.
Allocated in parallel with regno_pointer_align. */
Allocated in parallel with regno_pointer_align.
Note MEM expressions can appear in this array due to the actions
of put_var_into_stack. */
rtx * GTY ((length ("%h.regno_pointer_align_length"))) x_regno_reg_rtx;
};

View File

@ -2062,7 +2062,17 @@ copy_rtx_and_substitute (orig, map, for_lhs)
RTX_UNCHANGING_P (map->reg_map[regno]) = RTX_UNCHANGING_P (temp);
/* A reg with REG_FUNCTION_VALUE_P true will never reach here. */
if (REG_POINTER (map->x_regno_reg_rtx[regno]))
/* Objects may initially be represented as registers, but
but turned into a MEM if their address is taken by
put_var_into_stack. Therefore, the register table may have
entries which are MEMs.
We briefly tried to clear such entries, but that ended up
cascading into many changes due to the optimizers not being
prepared for empty entries in the register table. So we've
decided to allow the MEMs in the register table for now. */
if (REG_P (map->x_regno_reg_rtx[regno])
&& REG_POINTER (map->x_regno_reg_rtx[regno]))
mark_reg_pointer (map->reg_map[regno],
map->regno_pointer_align[regno]);
regno = REGNO (map->reg_map[regno]);