Commit 260f91c2 by Dale Johannesen Committed by Dale Johannesen

Insert memory clobbers before the code that pops variable arrays.

This prevents the scheduler from moving references to the arrays
below the stack pop.

From-SVN: r56328
parent 615d009f
2002-08-14 Dale Johannesen <dalej@apple.com>
* explow.c (emit_stack_restore): Emit memory clobbers
preceding the stack pop, to prevent the scheduler from
moving refs to variable arrays below this pop.
* reload1.c (reload): Preserve these clobbers for sched2.
* doc/rtl.texi: Document clobber (mem:BLK (scratch)).
2002-08-14 Neil Booth <neil@daikokuya.co.uk> 2002-08-14 Neil Booth <neil@daikokuya.co.uk>
* c-opts.c (c_common_post_options): Correct test. * c-opts.c (c_common_post_options): Correct test.
......
...@@ -2294,7 +2294,8 @@ trouble to describe the values that are stored, but it is essential to ...@@ -2294,7 +2294,8 @@ trouble to describe the values that are stored, but it is essential to
inform the compiler that the registers will be altered, lest it inform the compiler that the registers will be altered, lest it
attempt to keep data in them across the string instruction. attempt to keep data in them across the string instruction.
If @var{x} is @code{(mem:BLK (const_int 0))}, it means that all memory If @var{x} is @code{(mem:BLK (const_int 0))} or
@code{(mem:BLK (scratch))}, it means that all memory
locations must be presumed clobbered. If @var{x} is a @code{parallel}, locations must be presumed clobbered. If @var{x} is a @code{parallel},
it has the same meaning as a @code{parallel} in a @code{set} expression. it has the same meaning as a @code{parallel} in a @code{set} expression.
......
...@@ -1079,7 +1079,17 @@ emit_stack_restore (save_level, sa, after) ...@@ -1079,7 +1079,17 @@ emit_stack_restore (save_level, sa, after)
} }
if (sa != 0) if (sa != 0)
{
sa = validize_mem (sa); sa = validize_mem (sa);
/* These clobbers prevent the scheduler from moving
references to variable arrays below the code
that deletes (pops) the arrays. */
emit_insn (gen_rtx_CLOBBER (VOIDmode,
gen_rtx_MEM (BLKmode,
gen_rtx_SCRATCH (VOIDmode))));
emit_insn (gen_rtx_CLOBBER (VOIDmode,
gen_rtx_MEM (BLKmode, stack_pointer_rtx)));
}
if (after) if (after)
{ {
......
...@@ -1181,9 +1181,11 @@ reload (first, global) ...@@ -1181,9 +1181,11 @@ reload (first, global)
/* Make a pass over all the insns and delete all USEs which we inserted /* Make a pass over all the insns and delete all USEs which we inserted
only to tag a REG_EQUAL note on them. Remove all REG_DEAD and REG_UNUSED only to tag a REG_EQUAL note on them. Remove all REG_DEAD and REG_UNUSED
notes. Delete all CLOBBER insns that don't refer to the return value notes. Delete all CLOBBER insns that don't refer to the return value
and simplify (subreg (reg)) operands. Also remove all REG_RETVAL and or to memory (mem:BLK CLOBBERs must be retained to prevent the scheduler
REG_LIBCALL notes since they are no longer useful or accurate. Strip from misarranging variable-array code) and simplify (subreg (reg))
and regenerate REG_INC notes that may have been moved around. */ operands. Also remove all REG_RETVAL and REG_LIBCALL notes since they
are no longer useful or accurate. Strip and regenerate REG_INC notes
that may have been moved around. */
for (insn = first; insn; insn = NEXT_INSN (insn)) for (insn = first; insn; insn = NEXT_INSN (insn))
if (INSN_P (insn)) if (INSN_P (insn))
...@@ -1200,6 +1202,8 @@ reload (first, global) ...@@ -1200,6 +1202,8 @@ reload (first, global)
&& (GET_MODE (insn) == QImode && (GET_MODE (insn) == QImode
|| find_reg_note (insn, REG_EQUAL, NULL_RTX))) || find_reg_note (insn, REG_EQUAL, NULL_RTX)))
|| (GET_CODE (PATTERN (insn)) == CLOBBER || (GET_CODE (PATTERN (insn)) == CLOBBER
&& (GET_CODE (XEXP (PATTERN (insn), 0)) != MEM
|| GET_MODE (XEXP (PATTERN (insn), 0)) != BLKmode)
&& (GET_CODE (XEXP (PATTERN (insn), 0)) != REG && (GET_CODE (XEXP (PATTERN (insn), 0)) != REG
|| ! REG_FUNCTION_VALUE_P (XEXP (PATTERN (insn), 0))))) || ! REG_FUNCTION_VALUE_P (XEXP (PATTERN (insn), 0)))))
{ {
......
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