Commit 3d7e23f6 by Richard Henderson Committed by Richard Henderson

re PR middle-end/37815 (ICE in vt_add_function_parameters (bootstrap error))

        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.

From-SVN: r141278
parent 86b9515c
2008-10-21 Richard Henderson <rth@redhat.com>
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 <bob.wilson@acm.org> 2008-10-21 Bob Wilson <bob.wilson@acm.org>
* var-tracking.c (insn_stack_adjust_offset_pre_post): If insn has a * var-tracking.c (insn_stack_adjust_offset_pre_post): If insn has a
......
...@@ -2141,13 +2141,13 @@ widen_memory_access (rtx memref, enum machine_mode mode, HOST_WIDE_INT offset) ...@@ -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. */ /* A fake decl that is used as the MEM_EXPR of spill slots. */
static GTY(()) tree spill_slot_decl; static GTY(()) tree spill_slot_decl;
static tree tree
get_spill_slot_decl (void) get_spill_slot_decl (bool force_build_p)
{ {
tree d = spill_slot_decl; tree d = spill_slot_decl;
rtx rd; rtx rd;
if (d) if (d || !force_build_p)
return d; return d;
d = build_decl (VAR_DECL, get_identifier ("%sfp"), void_type_node); d = build_decl (VAR_DECL, get_identifier ("%sfp"), void_type_node);
...@@ -2179,7 +2179,7 @@ set_mem_attrs_for_spill (rtx mem) ...@@ -2179,7 +2179,7 @@ set_mem_attrs_for_spill (rtx mem)
rtx addr, offset; rtx addr, offset;
tree expr; tree expr;
expr = get_spill_slot_decl (); expr = get_spill_slot_decl (true);
alias = MEM_ALIAS_SET (DECL_RTL (expr)); alias = MEM_ALIAS_SET (DECL_RTL (expr));
/* We expect the incoming memory to be of the form: /* We expect the incoming memory to be of the form:
......
...@@ -37,6 +37,7 @@ extern void set_mem_size (rtx, rtx); ...@@ -37,6 +37,7 @@ extern void set_mem_size (rtx, rtx);
/* Set the attributes for MEM appropriate for a spill slot. */ /* Set the attributes for MEM appropriate for a spill slot. */
extern void set_mem_attrs_for_spill (rtx); 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 /* Return a memory reference like MEMREF, but with its address changed to
ADDR. The caller is asserting that the actual piece of memory pointed ADDR. The caller is asserting that the actual piece of memory pointed
......
...@@ -3182,7 +3182,16 @@ vt_add_function_parameters (void) ...@@ -3182,7 +3182,16 @@ vt_add_function_parameters (void)
if (!decl) if (!decl)
continue; 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)) if (!track_loc_p (incoming, parm, offset, false, &mode, &offset))
continue; continue;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment