]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
mips.c (mips_expand_epilogue): Generate a simple_return only if the return address...
authorBernd Schmidt <bernds@codesourcery.com>
Wed, 14 Sep 2011 11:15:09 +0000 (11:15 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Wed, 14 Sep 2011 11:15:09 +0000 (11:15 +0000)
* config/mips/mips.c (mips_expand_epilogue): Generate a
simple_return only if the return address is in r31.

From-SVN: r178847

gcc/ChangeLog
gcc/config/mips/mips.c

index 74b187a8eff4b5729c2bde59b3fcf1a2ab5a98e9..7de4c651ecb571dbde30768f413185fe4e009c02 100644 (file)
@@ -1,3 +1,8 @@
+2011-09-14  Bernd Schmidt  <bernds@codesourcery.com>
+
+       * config/mips/mips.c (mips_expand_epilogue): Generate a
+       simple_return only if the return address is in r31.
+
 2011-09-13  Bernd Schmidt  <bernds@codesourcery.com>
 
        * cfgcleanup.c (try_head_merge_bb): If get_condition returns
index 0c3b184bcb2d201e96d93650d941ebc231c044eb..22cb60b6b112cb326300b6d40e6719e9803c759f 100644 (file)
@@ -10521,7 +10521,7 @@ mips_expand_epilogue (bool sibcall_p)
        }
       else
        {
-         unsigned int regno;
+         rtx pat;
 
          /* When generating MIPS16 code, the normal
             mips_for_each_saved_gpr_and_fpr path will restore the return
@@ -10529,11 +10529,21 @@ mips_expand_epilogue (bool sibcall_p)
          if (TARGET_MIPS16
              && !GENERATE_MIPS16E_SAVE_RESTORE
              && BITSET_P (frame->mask, RETURN_ADDR_REGNUM))
-           regno = GP_REG_FIRST + 7;
+           {
+             /* simple_returns cannot rely on values that are only available
+                on paths through the epilogue (because return paths that do
+                not pass through the epilogue may nevertheless reuse a
+                simple_return that occurs at the end of the epilogue).
+                Use a normal return here instead.  */
+             rtx reg = gen_rtx_REG (Pmode, GP_REG_FIRST + 7);
+             pat = gen_return_internal (reg);
+           }
          else
-           regno = RETURN_ADDR_REGNUM;
-         emit_jump_insn (gen_simple_return_internal (gen_rtx_REG (Pmode,
-                                                                  regno)));
+           {
+             rtx reg = gen_rtx_REG (Pmode, RETURN_ADDR_REGNUM);
+             pat = gen_simple_return_internal (reg);
+           }
+         emit_jump_insn (pat);
        }
     }