builtins.c (expand_builtin_setjmp_receiver): Use and clobber hard_frame_pointer_rtx.
gcc/ * builtins.c (expand_builtin_setjmp_receiver): Use and clobber hard_frame_pointer_rtx. * cse.c (cse_insn): Remove volatile check. * cselib.c (cselib_process_insn): Likewise. * dse.c (scan_insn): Likewise. From-SVN: r208498
This commit is contained in:
parent
5af1876c65
commit
f12572682e
@ -1,3 +1,11 @@
|
||||
2014-03-11 Richard Sandiford <rdsandiford@googlemail.com>
|
||||
|
||||
* builtins.c (expand_builtin_setjmp_receiver): Use and clobber
|
||||
hard_frame_pointer_rtx.
|
||||
* cse.c (cse_insn): Remove volatile check.
|
||||
* cselib.c (cselib_process_insn): Likewise.
|
||||
* dse.c (scan_insn): Likewise.
|
||||
|
||||
2014-03-11 Joern Rennecke <joern.rennecke@embecosm.com>
|
||||
|
||||
* config/arc/arc.c (conditionalize_nonjump): New function, broken
|
||||
|
@ -910,18 +910,27 @@ expand_builtin_setjmp_receiver (rtx receiver_label ATTRIBUTE_UNUSED)
|
||||
#ifdef HAVE_nonlocal_goto
|
||||
if (! HAVE_nonlocal_goto)
|
||||
#endif
|
||||
/* First adjust our frame pointer to its actual value. It was
|
||||
previously set to the start of the virtual area corresponding to
|
||||
the stacked variables when we branched here and now needs to be
|
||||
adjusted to the actual hardware fp value.
|
||||
{
|
||||
/* First adjust our frame pointer to its actual value. It was
|
||||
previously set to the start of the virtual area corresponding to
|
||||
the stacked variables when we branched here and now needs to be
|
||||
adjusted to the actual hardware fp value.
|
||||
|
||||
Assignments to virtual registers are converted by
|
||||
instantiate_virtual_regs into the corresponding assignment
|
||||
to the underlying register (fp in this case) that makes
|
||||
the original assignment true.
|
||||
So the following insn will actually be decrementing fp by
|
||||
STARTING_FRAME_OFFSET. */
|
||||
emit_move_insn (virtual_stack_vars_rtx, hard_frame_pointer_rtx);
|
||||
Assignments to virtual registers are converted by
|
||||
instantiate_virtual_regs into the corresponding assignment
|
||||
to the underlying register (fp in this case) that makes
|
||||
the original assignment true.
|
||||
So the following insn will actually be decrementing fp by
|
||||
STARTING_FRAME_OFFSET. */
|
||||
emit_move_insn (virtual_stack_vars_rtx, hard_frame_pointer_rtx);
|
||||
|
||||
/* Restoring the frame pointer also modifies the hard frame pointer.
|
||||
Mark it used (so that the previous assignment remains live once
|
||||
the frame pointer is eliminated) and clobbered (to represent the
|
||||
implicit update from the assignment). */
|
||||
emit_use (hard_frame_pointer_rtx);
|
||||
emit_clobber (hard_frame_pointer_rtx);
|
||||
}
|
||||
|
||||
#if !HARD_FRAME_POINTER_IS_ARG_POINTER
|
||||
if (fixed_regs[ARG_POINTER_REGNUM])
|
||||
@ -965,8 +974,7 @@ expand_builtin_setjmp_receiver (rtx receiver_label ATTRIBUTE_UNUSED)
|
||||
|
||||
/* We must not allow the code we just generated to be reordered by
|
||||
scheduling. Specifically, the update of the frame pointer must
|
||||
happen immediately, not later. Similarly, we must block
|
||||
(frame-related) register values to be used across this code. */
|
||||
happen immediately, not later. */
|
||||
emit_insn (gen_blockage ());
|
||||
}
|
||||
|
||||
|
@ -5682,11 +5682,6 @@ cse_insn (rtx insn)
|
||||
invalidate (XEXP (dest, 0), GET_MODE (dest));
|
||||
}
|
||||
|
||||
/* A volatile ASM or an UNSPEC_VOLATILE invalidates everything. */
|
||||
if (NONJUMP_INSN_P (insn)
|
||||
&& volatile_insn_p (PATTERN (insn)))
|
||||
flush_hash_table ();
|
||||
|
||||
/* Don't cse over a call to setjmp; on some machines (eg VAX)
|
||||
the regs restored by the longjmp come from a later time
|
||||
than the setjmp. */
|
||||
|
@ -2645,12 +2645,10 @@ cselib_process_insn (rtx insn)
|
||||
|
||||
cselib_current_insn = insn;
|
||||
|
||||
/* Forget everything at a CODE_LABEL, a volatile insn, or a setjmp. */
|
||||
/* Forget everything at a CODE_LABEL or a setjmp. */
|
||||
if ((LABEL_P (insn)
|
||||
|| (CALL_P (insn)
|
||||
&& find_reg_note (insn, REG_SETJMP, NULL))
|
||||
|| (NONJUMP_INSN_P (insn)
|
||||
&& volatile_insn_p (PATTERN (insn))))
|
||||
&& find_reg_note (insn, REG_SETJMP, NULL)))
|
||||
&& !cselib_preserve_constants)
|
||||
{
|
||||
cselib_reset_table (next_uid);
|
||||
|
10
gcc/dse.c
10
gcc/dse.c
@ -2470,16 +2470,6 @@ scan_insn (bb_info_t bb_info, rtx insn)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Cselib clears the table for this case, so we have to essentially
|
||||
do the same. */
|
||||
if (NONJUMP_INSN_P (insn)
|
||||
&& volatile_insn_p (PATTERN (insn)))
|
||||
{
|
||||
add_wild_read (bb_info);
|
||||
insn_info->cannot_delete = true;
|
||||
return;
|
||||
}
|
||||
|
||||
/* Look at all of the uses in the insn. */
|
||||
note_uses (&PATTERN (insn), check_mem_read_use, bb_info);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user