aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2002-06-23 17:57:53 +0200
committerJeff Law <law@gcc.gnu.org>2002-06-23 09:57:53 -0600
commitf81a79ef6acdf5f2098389cfd7dff11d61672483 (patch)
tree25a03e09f8475979e1fefa9b2ac78afaf5c19863
parent3bfb9a0be1071418b1f5fe8ce81ca7ea2b12e3a4 (diff)
downloadgcc-f81a79ef6acdf5f2098389cfd7dff11d61672483.zip
gcc-f81a79ef6acdf5f2098389cfd7dff11d61672483.tar.gz
gcc-f81a79ef6acdf5f2098389cfd7dff11d61672483.tar.bz2
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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/function.h5
-rw-r--r--gcc/integrate.c12
3 files changed, 21 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 8d31820..6409625 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/function.h b/gcc/function.h
index 1c6337c..3dbd6fd 100644
--- a/gcc/function.h
+++ b/gcc/function.h
@@ -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;
};
diff --git a/gcc/integrate.c b/gcc/integrate.c
index 4bbfcea..ead6d31 100644
--- a/gcc/integrate.c
+++ b/gcc/integrate.c
@@ -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]);