Commit f1257268 by Richard Sandiford Committed by Richard Sandiford

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
parent 5af1876c
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,6 +910,7 @@ 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
......@@ -923,6 +924,14 @@ expand_builtin_setjmp_receiver (rtx receiver_label ATTRIBUTE_UNUSED)
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);
......
......@@ -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);
......
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