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> 2014-03-11 Joern Rennecke <joern.rennecke@embecosm.com>
* config/arc/arc.c (conditionalize_nonjump): New function, broken * config/arc/arc.c (conditionalize_nonjump): New function, broken
......
...@@ -910,18 +910,27 @@ expand_builtin_setjmp_receiver (rtx receiver_label ATTRIBUTE_UNUSED) ...@@ -910,18 +910,27 @@ expand_builtin_setjmp_receiver (rtx receiver_label ATTRIBUTE_UNUSED)
#ifdef HAVE_nonlocal_goto #ifdef HAVE_nonlocal_goto
if (! HAVE_nonlocal_goto) if (! HAVE_nonlocal_goto)
#endif #endif
/* First adjust our frame pointer to its actual value. It was {
previously set to the start of the virtual area corresponding to /* First adjust our frame pointer to its actual value. It was
the stacked variables when we branched here and now needs to be previously set to the start of the virtual area corresponding to
adjusted to the actual hardware fp value. 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 Assignments to virtual registers are converted by
to the underlying register (fp in this case) that makes instantiate_virtual_regs into the corresponding assignment
the original assignment true. to the underlying register (fp in this case) that makes
So the following insn will actually be decrementing fp by the original assignment true.
STARTING_FRAME_OFFSET. */ So the following insn will actually be decrementing fp by
emit_move_insn (virtual_stack_vars_rtx, hard_frame_pointer_rtx); 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 !HARD_FRAME_POINTER_IS_ARG_POINTER
if (fixed_regs[ARG_POINTER_REGNUM]) if (fixed_regs[ARG_POINTER_REGNUM])
...@@ -965,8 +974,7 @@ expand_builtin_setjmp_receiver (rtx receiver_label ATTRIBUTE_UNUSED) ...@@ -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 /* We must not allow the code we just generated to be reordered by
scheduling. Specifically, the update of the frame pointer must scheduling. Specifically, the update of the frame pointer must
happen immediately, not later. Similarly, we must block happen immediately, not later. */
(frame-related) register values to be used across this code. */
emit_insn (gen_blockage ()); emit_insn (gen_blockage ());
} }
......
...@@ -5682,11 +5682,6 @@ cse_insn (rtx insn) ...@@ -5682,11 +5682,6 @@ cse_insn (rtx insn)
invalidate (XEXP (dest, 0), GET_MODE (dest)); 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) /* Don't cse over a call to setjmp; on some machines (eg VAX)
the regs restored by the longjmp come from a later time the regs restored by the longjmp come from a later time
than the setjmp. */ than the setjmp. */
......
...@@ -2645,12 +2645,10 @@ cselib_process_insn (rtx insn) ...@@ -2645,12 +2645,10 @@ cselib_process_insn (rtx insn)
cselib_current_insn = 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) if ((LABEL_P (insn)
|| (CALL_P (insn) || (CALL_P (insn)
&& find_reg_note (insn, REG_SETJMP, NULL)) && find_reg_note (insn, REG_SETJMP, NULL)))
|| (NONJUMP_INSN_P (insn)
&& volatile_insn_p (PATTERN (insn))))
&& !cselib_preserve_constants) && !cselib_preserve_constants)
{ {
cselib_reset_table (next_uid); cselib_reset_table (next_uid);
......
...@@ -2470,16 +2470,6 @@ scan_insn (bb_info_t bb_info, rtx insn) ...@@ -2470,16 +2470,6 @@ scan_insn (bb_info_t bb_info, rtx insn)
return; 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. */ /* Look at all of the uses in the insn. */
note_uses (&PATTERN (insn), check_mem_read_use, bb_info); 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