re PR target/17377 (cris.md bug in "return" pattern trigged by __builtin_return_address)
authorHans-Peter Nilsson <hp@axis.com>
Thu, 9 Sep 2004 20:36:31 +0000 (20:36 +0000)
committerHans-Peter Nilsson <hp@gcc.gnu.org>
Thu, 9 Sep 2004 20:36:31 +0000 (20:36 +0000)
PR target/17377
* config/cris/cris-protos.h (cris_return_address_on_stack): Declare.
* config/cris/cris.c (cris_return_address_on_stack): New function.
* config/cris/cris.md ("return"): For location of return address,
also check cris_return_address_on_stack.

From-SVN: r87251

gcc/ChangeLog
gcc/config/cris/cris-protos.h
gcc/config/cris/cris.c
gcc/config/cris/cris.md

index 7df898152fae51896865270dd4e81a264976a8c5..8d1f90fd47656cb61ac6c899ebbd92e8b1c7e253 100644 (file)
@@ -1,3 +1,11 @@
+2004-09-09  Hans-Peter Nilsson  <hp@axis.com>
+
+       PR target/17377
+       * config/cris/cris-protos.h (cris_return_address_on_stack): Declare.
+       * config/cris/cris.c (cris_return_address_on_stack): New function.
+       * config/cris/cris.md ("return"): For location of return address,
+       also check cris_return_address_on_stack.
+
 2004-09-09  Diego Novillo  <dnovillo@redhat.com>
 
        * tree-outof-ssa.c (coalesce_abnormal_edges): Fix typo in
index 0e65dc2da8cbc5c5ea53310b3e9ec4d9beb38de1..15e91df8a5999f2e2caa6a7a398e654301606bf1 100644 (file)
@@ -47,6 +47,8 @@ extern int cris_cfun_uses_pic_table (void);
 extern void cris_target_asm_named_section (const char *, unsigned int);
 #endif /* RTX_CODE */
 
+extern int cris_return_address_on_stack (void);
+
 extern void cris_pragma_expand_mul (struct cpp_reader *);
 
 /* Need one that returns an int; usable in expressions.  */
index 25db5ecc34fce5c2d4dcf4a672f6ca5855621c01..468859f9f4241c887d695186ea00d3aa17704bf1 100644 (file)
@@ -1700,6 +1700,15 @@ cris_return_addr_rtx (int count, rtx frameaddr ATTRIBUTE_UNUSED)
     : NULL_RTX;
 }
 
+/* Accessor used in cris.md:return because cfun->machine isn't available
+   there.  */
+
+int
+cris_return_address_on_stack ()
+{
+  return cfun->machine->needs_return_address_on_stack;
+}
+
 /* This used to be the INITIAL_FRAME_POINTER_OFFSET worker; now only
    handles FP -> SP elimination offset.  */
 
index 4001a2a3b31d55777342991f3ab45ecc311090f7..be137a58d61ec6c85f0751f75d8dbfafded34f54 100644 (file)
   if (i >= 0)
     sprintf (rd, \"movem [$sp+],$%s\", reg_names [i]);
 
-  if (regs_ever_live[CRIS_SRP_REGNUM])
+  if (regs_ever_live[CRIS_SRP_REGNUM]
+      || cris_return_address_on_stack ())
     {
       if (*rd)
        output_asm_insn (rd, operands);
 }"
   [(set (attr "slottable")
        (if_then_else
-        (ne (symbol_ref "regs_ever_live[CRIS_SRP_REGNUM]") (const_int 0))
+        (ne (symbol_ref
+             "(regs_ever_live[CRIS_SRP_REGNUM]
+               || cris_return_address_on_stack ())")
+            (const_int 0))
         (const_string "no")         ; If jump then not slottable.
         (if_then_else
          (ne (symbol_ref