summaryrefslogtreecommitdiff
path: root/gcc/config/a29k
diff options
context:
space:
mode:
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>1997-11-09 08:59:55 +0000
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>1997-11-09 08:59:55 +0000
commit1f9c29d23ec910586b483ad838d09e6cf72a671f (patch)
tree76286ec4bd6a2cdb041d24f2479b4632fe025b6e /gcc/config/a29k
parentb44a7bcd70b19aec55f031b7cbaaec92ccd888b5 (diff)
downloadgcc-1f9c29d23ec910586b483ad838d09e6cf72a671f.tar.gz
* a29k.h (ELIGIBLE_FOR_EPILOGUE_DELAY): Avoid loads from varying
addresses in the epilogue delay slot. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@16394 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/a29k')
-rw-r--r--gcc/config/a29k/a29k.h9
1 files changed, 7 insertions, 2 deletions
diff --git a/gcc/config/a29k/a29k.h b/gcc/config/a29k/a29k.h
index 59e9a13d628..db6e378d252 100644
--- a/gcc/config/a29k/a29k.h
+++ b/gcc/config/a29k/a29k.h
@@ -987,13 +987,18 @@ extern char *a29k_function_name;
On the 29k, we must be able to place it in a delay slot, it must
not use sp if the frame pointer cannot be eliminated, and it cannot
- use local regs if we need to push the register stack. */
+ use local regs if we need to push the register stack.
+ If this is a SET with a memory as source, it might load from
+ a stack slot, unless the address is constant. */
#define ELIGIBLE_FOR_EPILOGUE_DELAY(INSN,N) \
(get_attr_in_delay_slot (INSN) == IN_DELAY_SLOT_YES \
&& ! (frame_pointer_needed \
&& reg_mentioned_p (stack_pointer_rtx, PATTERN (INSN))) \
- && ! (needs_regstack_p () && uses_local_reg_p (PATTERN (INSN))))
+ && ! (needs_regstack_p () && uses_local_reg_p (PATTERN (INSN))) \
+ && (GET_CODE (PATTERN (INSN)) != SET \
+ || GET_CODE (SET_SRC (PATTERN (INSN))) != MEM \
+ || ! rtx_varies_p (XEXP (SET_SRC (PATTERN (INSN)), 0))))
/* Output assembler code for a block containing the constant parts
of a trampoline, leaving space for the variable parts.