diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cf00fef37a8..79b2c01ab6f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2008-10-21 Richard Henderson + + PR 37815 + * emit-rtl.c (get_spill_slot_decl): Export. + * emit-rtl.h (get_spill_slot_decl): Declare. + * var-tracking.c (vt_add_function_parameters): Relax assertion + on the contents of MEM_EXPR in a PARM_DECL to include a spill slot. + 2008-10-21 Bob Wilson * var-tracking.c (insn_stack_adjust_offset_pre_post): If insn has a diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c index 46fefda614b..ced4e58b160 100644 --- a/gcc/emit-rtl.c +++ b/gcc/emit-rtl.c @@ -2141,13 +2141,13 @@ widen_memory_access (rtx memref, enum machine_mode mode, HOST_WIDE_INT offset) /* A fake decl that is used as the MEM_EXPR of spill slots. */ static GTY(()) tree spill_slot_decl; -static tree -get_spill_slot_decl (void) +tree +get_spill_slot_decl (bool force_build_p) { tree d = spill_slot_decl; rtx rd; - if (d) + if (d || !force_build_p) return d; d = build_decl (VAR_DECL, get_identifier ("%sfp"), void_type_node); @@ -2179,7 +2179,7 @@ set_mem_attrs_for_spill (rtx mem) rtx addr, offset; tree expr; - expr = get_spill_slot_decl (); + expr = get_spill_slot_decl (true); alias = MEM_ALIAS_SET (DECL_RTL (expr)); /* We expect the incoming memory to be of the form: diff --git a/gcc/emit-rtl.h b/gcc/emit-rtl.h index 6d4249f518e..11921a4e737 100644 --- a/gcc/emit-rtl.h +++ b/gcc/emit-rtl.h @@ -37,6 +37,7 @@ extern void set_mem_size (rtx, rtx); /* Set the attributes for MEM appropriate for a spill slot. */ extern void set_mem_attrs_for_spill (rtx); +extern tree get_spill_slot_decl (bool); /* Return a memory reference like MEMREF, but with its address changed to ADDR. The caller is asserting that the actual piece of memory pointed diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index 2b92e403bf2..1451278e8a4 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -3182,7 +3182,16 @@ vt_add_function_parameters (void) if (!decl) continue; - gcc_assert (parm == decl); + if (parm != decl) + { + /* Assume that DECL_RTL was a pseudo that got spilled to + memory. The spill slot sharing code will force the + memory to reference spill_slot_decl (%sfp), so we don't + match above. That's ok, the pseudo must have referenced + the entire parameter, so just reset OFFSET. */ + gcc_assert (decl == get_spill_slot_decl (false)); + offset = 0; + } if (!track_loc_p (incoming, parm, offset, false, &mode, &offset)) continue;