gengenrtl.c (special_rtx): PC, CC0 and RETURN are special.
authorBernd Schmidt <bernds@codesourcery.com>
Tue, 3 May 2011 11:52:38 +0000 (11:52 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Tue, 3 May 2011 11:52:38 +0000 (11:52 +0000)
* gengenrtl.c (special_rtx): PC, CC0 and RETURN are special.
* genemit.c (gen_exp): Handle RETURN.
* emit-rtl.c (verify_rtx_sharing): Likewise.
(init_emit_regs): Create pc_rtx, ret_rtx and cc0_rtx specially.
* rtl.c (copy_rtx): RETURN is shared.
* rtl.h (enum global_rtl_index): Add GR_RETURN.
(ret_rtx): New.
* jump.c (redirect_exp_1): Don't use gen_rtx_RETURN.
* config/s390/s390.c (s390_emit_epilogue): Likewise.
* config/rx/rx.c (gen_rx_rtsd_vector): Likewise.
* config/cris/cris.c (cris_expand_return): Likewise.
* config/m68k/m68k.c (m68k_expand_epilogue): Likewise.
* config/rs6000/rs6000.c (rs6000_make_savres_rtx,
rs6000_emit_epilogue, rs6000_output_mi_thunk): Likewise.
* config/picochip/picochip.c (picochip_expand_epilogue): Likewise.
* config/h8300/h8300.c (h8300_push_pop, h8300_expand_epilogue):
Likewise.
* config/v850/v850.c (expand_epilogue): Likewise.
* config/bfin/bfin.c (bfin_expand_call): Likewise.
* config/arm/arm.md (epilogue): Likewise.
* config/mn10300/mn10300.c (mn10300_expand_epilogue): Likewise.
* config/sparc/sparc.c (sparc_struct_value_rtx): Rename ret_rtx
variable to ret_reg.

From-SVN: r173300

19 files changed:
gcc/ChangeLog
gcc/config/arm/arm.md
gcc/config/bfin/bfin.c
gcc/config/cris/cris.c
gcc/config/h8300/h8300.c
gcc/config/m68k/m68k.c
gcc/config/mn10300/mn10300.c
gcc/config/picochip/picochip.c
gcc/config/rs6000/rs6000.c
gcc/config/rx/rx.c
gcc/config/s390/s390.c
gcc/config/sparc/sparc.c
gcc/config/v850/v850.c
gcc/emit-rtl.c
gcc/genemit.c
gcc/gengenrtl.c
gcc/jump.c
gcc/rtl.c
gcc/rtl.h

index 468a2945b6f7f08b3de71a967a5b40b271a168ad..e59561d8234c494d213292f3edc4b30e7f57b76f 100644 (file)
@@ -1,3 +1,29 @@
+2011-05-03  Bernd Schmidt  <bernds@codesourcery.com>
+
+       * gengenrtl.c (special_rtx): PC, CC0 and RETURN are special.
+       * genemit.c (gen_exp): Handle RETURN.
+       * emit-rtl.c (verify_rtx_sharing): Likewise.
+       (init_emit_regs): Create pc_rtx, ret_rtx and cc0_rtx specially.
+       * rtl.c (copy_rtx): RETURN is shared.
+       * rtl.h (enum global_rtl_index): Add GR_RETURN.
+       (ret_rtx): New.
+       * jump.c (redirect_exp_1): Don't use gen_rtx_RETURN.
+       * config/s390/s390.c (s390_emit_epilogue): Likewise.
+       * config/rx/rx.c (gen_rx_rtsd_vector): Likewise.
+       * config/cris/cris.c (cris_expand_return): Likewise.
+       * config/m68k/m68k.c (m68k_expand_epilogue): Likewise.
+       * config/rs6000/rs6000.c (rs6000_make_savres_rtx,
+       rs6000_emit_epilogue, rs6000_output_mi_thunk): Likewise.
+       * config/picochip/picochip.c (picochip_expand_epilogue): Likewise.
+       * config/h8300/h8300.c (h8300_push_pop, h8300_expand_epilogue):
+       Likewise.
+       * config/v850/v850.c (expand_epilogue): Likewise.
+       * config/bfin/bfin.c (bfin_expand_call): Likewise.
+       * config/arm/arm.md (epilogue): Likewise.
+       * config/mn10300/mn10300.c (mn10300_expand_epilogue): Likewise.
+       * config/sparc/sparc.c (sparc_struct_value_rtx): Rename ret_rtx
+       variable to ret_reg.
+
 2011-05-03  Richard Guenther  <rguenther@suse.de>
 
        PR lto/48846
index 9e23d9bd1752ceff333ccf42331a7ecf2b0c124f..40ebf35d547f29aea59efa62ede534585f26a766 100644 (file)
       DONE;
     }
   emit_jump_insn (gen_rtx_UNSPEC_VOLATILE (VOIDmode,
-       gen_rtvec (1,
-               gen_rtx_RETURN (VOIDmode)),
-       VUNSPEC_EPILOGUE));
+       gen_rtvec (1, ret_rtx), VUNSPEC_EPILOGUE));
   DONE;
   "
 )
index 25316cf679c04cd8a89110fbd86f5d76f07a9a29..9369d1d0d67013fe3747efb8d3ed307811d2b23a 100644 (file)
@@ -2334,7 +2334,7 @@ bfin_expand_call (rtx retval, rtx fnaddr, rtx callarg1, rtx cookie, int sibcall)
     XVECEXP (pat, 0, n++) = gen_rtx_USE (VOIDmode, picreg);
   XVECEXP (pat, 0, n++) = gen_rtx_USE (VOIDmode, cookie);
   if (sibcall)
-    XVECEXP (pat, 0, n++) = gen_rtx_RETURN (VOIDmode);
+    XVECEXP (pat, 0, n++) = ret_rtx;
   else
     XVECEXP (pat, 0, n++) = gen_rtx_CLOBBER (VOIDmode, retsreg);
   call = emit_call_insn (pat);
index c1aa94380e423197bfd69b4b387df1654f394926..110e98593f7bc8693d6054d386f9a90b25282ef7 100644 (file)
@@ -1790,7 +1790,7 @@ cris_expand_return (bool on_stack)
      we do that until they're fixed.  Currently, all return insns in a
      function must be the same (not really a limiting factor) so we need
      to check that it doesn't change half-way through.  */
-  emit_jump_insn (gen_rtx_RETURN (VOIDmode));
+  emit_jump_insn (ret_rtx);
 
   CRIS_ASSERT (cfun->machine->return_type != CRIS_RETINSN_RET || !on_stack);
   CRIS_ASSERT (cfun->machine->return_type != CRIS_RETINSN_JUMP || on_stack);
index de41d702f467b8198e1276c52be87beb4a4d59a5..28c232e3bc125c673430d855b6c992f618089c5d 100644 (file)
@@ -643,7 +643,7 @@ h8300_push_pop (int regno, int nregs, bool pop_p, bool return_p)
   /* Add the return instruction.  */
   if (return_p)
     {
-      RTVEC_ELT (vec, i) = gen_rtx_RETURN (VOIDmode);
+      RTVEC_ELT (vec, i) = ret_rtx;
       i++;
     }
 
@@ -927,7 +927,7 @@ h8300_expand_epilogue (void)
     }
 
   if (!returned_p)
-    emit_jump_insn (gen_rtx_RETURN (VOIDmode));
+    emit_jump_insn (ret_rtx);
 }
 
 /* Return nonzero if the current function is an interrupt
index b286347e44fc32c6128ae6f60834310f0e56b630..47f47af888c76c5f195a47d0f04689a5d0b8e6c1 100644 (file)
@@ -1308,7 +1308,7 @@ m68k_expand_epilogue (bool sibcall_p)
                           EH_RETURN_STACKADJ_RTX));
 
   if (!sibcall_p)
-    emit_jump_insn (gen_rtx_RETURN (VOIDmode));
+    emit_jump_insn (ret_rtx);
 }
 \f
 /* Return true if X is a valid comparison operator for the dbcc 
index 635b1cb4583d8849f04614723b6d30566dfb63b5..1bae9f30eef083bcaf0f2109e24e97504a4f8ff3 100644 (file)
@@ -1255,7 +1255,7 @@ mn10300_expand_epilogue (void)
 
   /* Adjust the stack and restore callee-saved registers, if any.  */
   if (mn10300_can_use_rets_insn ())
-    emit_jump_insn (gen_rtx_RETURN (VOIDmode));
+    emit_jump_insn (ret_rtx);
   else
     emit_jump_insn (gen_return_ret (GEN_INT (size + REG_SAVE_BYTES)));
 }
index 1ca95b4920d2bddf3f22b880a5e2e400d9866eab..cab639b2333924ccd28b81b6d879e7e965be33e0 100644 (file)
@@ -2273,7 +2273,7 @@ picochip_expand_epilogue (int is_sibling_call ATTRIBUTE_UNUSED)
     rtvec p;
     p = rtvec_alloc (2);
 
-    RTVEC_ELT (p, 0) = gen_rtx_RETURN (VOIDmode);
+    RTVEC_ELT (p, 0) = ret_rtx;
     RTVEC_ELT (p, 1) = gen_rtx_USE (VOIDmode,
                                    gen_rtx_REG (Pmode, LINK_REGNUM));
     emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
index 899699f8aa1210257cfa4c3f56461cef13fa2f56..1bf717c6cf7387b63e0ff98f25ede49a518c5952 100644 (file)
@@ -20358,7 +20358,7 @@ rs6000_make_savres_rtx (rs6000_stack_t *info,
   p = rtvec_alloc ((lr ? 4 : 3) + n_regs);
 
   if (!savep && lr)
-    RTVEC_ELT (p, offset++) = gen_rtx_RETURN (VOIDmode);
+    RTVEC_ELT (p, offset++) = ret_rtx;
 
   RTVEC_ELT (p, offset++)
     = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, 65));
@@ -21350,7 +21350,7 @@ rs6000_emit_epilogue (int sibcall)
       alloc_rname = ggc_strdup (rname);
 
       j = 0;
-      RTVEC_ELT (p, j++) = gen_rtx_RETURN (VOIDmode);
+      RTVEC_ELT (p, j++) = ret_rtx;
       RTVEC_ELT (p, j++) = gen_rtx_USE (VOIDmode,
                                        gen_rtx_REG (Pmode,
                                                     LR_REGNO));
@@ -21966,7 +21966,7 @@ rs6000_emit_epilogue (int sibcall)
       else
        p = rtvec_alloc (2);
 
-      RTVEC_ELT (p, 0) = gen_rtx_RETURN (VOIDmode);
+      RTVEC_ELT (p, 0) = ret_rtx;
       RTVEC_ELT (p, 1) = ((restoring_FPRs_inline || !lr)
                          ? gen_rtx_USE (VOIDmode, gen_rtx_REG (Pmode, 65))
                          : gen_rtx_CLOBBER (VOIDmode,
@@ -22405,7 +22405,7 @@ rs6000_output_mi_thunk (FILE *file, tree thunk_fndecl ATTRIBUTE_UNUSED,
                        gen_rtx_USE (VOIDmode,
                                     gen_rtx_REG (SImode,
                                                  LR_REGNO)),
-                       gen_rtx_RETURN (VOIDmode))));
+                       ret_rtx)));
   SIBLING_CALL_P (insn) = 1;
   emit_barrier ();
 
index d9894c2a50d409a9577deacbec58b7adc7b88dcc..ccf1a5d11b96c359e85bd62930389a7884b9b1fa 100644 (file)
@@ -1567,7 +1567,7 @@ gen_rx_rtsd_vector (unsigned int adjust, unsigned int low, unsigned int high)
                                : plus_constant (stack_pointer_rtx,
                                                 i * UNITS_PER_WORD)));
 
-  XVECEXP (vector, 0, count - 1) = gen_rtx_RETURN (VOIDmode);
+  XVECEXP (vector, 0, count - 1) = ret_rtx;
 
   return vector;
 }
index 2454c4f61d243a554ee1b5aa24ddf5942cc6bfaf..e0f98e686e387145c4a337cd6866f1d9202ba1b1 100644 (file)
@@ -8485,7 +8485,7 @@ s390_emit_epilogue (bool sibcall)
 
       p = rtvec_alloc (2);
 
-      RTVEC_ELT (p, 0) = gen_rtx_RETURN (VOIDmode);
+      RTVEC_ELT (p, 0) = ret_rtx;
       RTVEC_ELT (p, 1) = gen_rtx_USE (VOIDmode, return_reg);
       emit_jump_insn (gen_rtx_PARALLEL (VOIDmode, p));
     }
index 2abfdf4a6bdbfd3ee83c7bd16ed98f943600d778..46be9040785cd44ecfd1efe8660970311918aa9f 100644 (file)
@@ -6063,7 +6063,7 @@ sparc_struct_value_rtx (tree fndecl, int incoming)
          /* We must check and adjust the return address, as it is
             optional as to whether the return object is really
             provided.  */
-         rtx ret_rtx = gen_rtx_REG (Pmode, 31);
+         rtx ret_reg = gen_rtx_REG (Pmode, 31);
          rtx scratch = gen_reg_rtx (SImode);
          rtx endlab = gen_label_rtx ();
 
@@ -6080,12 +6080,12 @@ sparc_struct_value_rtx (tree fndecl, int incoming)
             it's an unimp instruction (the most significant 10 bits
             will be zero).  */
          emit_move_insn (scratch, gen_rtx_MEM (SImode,
-                                               plus_constant (ret_rtx, 8)));
+                                               plus_constant (ret_reg, 8)));
          /* Assume the size is valid and pre-adjust */
-         emit_insn (gen_add3_insn (ret_rtx, ret_rtx, GEN_INT (4)));
+         emit_insn (gen_add3_insn (ret_reg, ret_reg, GEN_INT (4)));
          emit_cmp_and_jump_insns (scratch, size_rtx, EQ, const0_rtx, SImode,
                                   0, endlab);
-         emit_insn (gen_sub3_insn (ret_rtx, ret_rtx, GEN_INT (4)));
+         emit_insn (gen_sub3_insn (ret_reg, ret_reg, GEN_INT (4)));
          /* Write the address of the memory pointed to by temp_val into
             the memory pointed to by mem */
          emit_move_insn (mem, XEXP (temp_val, 0));
index 86509e0ac4cb3c9d4608f7d29e9a22bfb37bfb5d..45dad92c35610a2d79a0086048f9e78f74c572db 100644 (file)
@@ -1890,7 +1890,7 @@ expand_epilogue (void)
          int offset;
          restore_all = gen_rtx_PARALLEL (VOIDmode,
                                          rtvec_alloc (num_restore + 2));
-         XVECEXP (restore_all, 0, 0) = gen_rtx_RETURN (VOIDmode);
+         XVECEXP (restore_all, 0, 0) = ret_rtx;
          XVECEXP (restore_all, 0, 1)
            = gen_rtx_SET (VOIDmode, stack_pointer_rtx,
                            gen_rtx_PLUS (Pmode,
index 9b57aeab47ae6738f2547e9c30f155af08622ea1..2e073b5da1f84661983d3e7e068d968ef7e2195d 100644 (file)
@@ -2450,6 +2450,7 @@ verify_rtx_sharing (rtx orig, rtx insn)
     case CODE_LABEL:
     case PC:
     case CC0:
+    case RETURN:
     case SCRATCH:
       return;
       /* SCRATCH must be shared because they represent distinct values.  */
@@ -5416,8 +5417,9 @@ init_emit_regs (void)
   init_reg_modes_target ();
 
   /* Assign register numbers to the globally defined register rtx.  */
-  pc_rtx = gen_rtx_PC (VOIDmode);
-  cc0_rtx = gen_rtx_CC0 (VOIDmode);
+  pc_rtx = gen_rtx_fmt_ (PC, VOIDmode);
+  ret_rtx = gen_rtx_fmt_ (RETURN, VOIDmode);
+  cc0_rtx = gen_rtx_fmt_ (CC0, VOIDmode);
   stack_pointer_rtx = gen_raw_REG (Pmode, STACK_POINTER_REGNUM);
   frame_pointer_rtx = gen_raw_REG (Pmode, FRAME_POINTER_REGNUM);
   hard_frame_pointer_rtx = gen_raw_REG (Pmode, HARD_FRAME_POINTER_REGNUM);
index aea7cb8b68a48c298a35bb4592b390f10d7cb6a7..ccad725d943a8af1e9f23f8a8aeb4970211c3689 100644 (file)
@@ -166,6 +166,9 @@ gen_exp (rtx x, enum rtx_code subroutine_type, char *used)
     case PC:
       printf ("pc_rtx");
       return;
+    case RETURN:
+      printf ("ret_rtx");
+      return;
     case CLOBBER:
       if (REG_P (XEXP (x, 0)))
        {
index fc530288b3e70b4ce6f4e4ddb14c539537a31d2a..a61995876baf22c5845009cf979e782b4ee8028b 100644 (file)
@@ -128,6 +128,9 @@ special_rtx (int idx)
          || strcmp (defs[idx].enumname, "REG") == 0
          || strcmp (defs[idx].enumname, "SUBREG") == 0
          || strcmp (defs[idx].enumname, "MEM") == 0
+         || strcmp (defs[idx].enumname, "PC") == 0
+         || strcmp (defs[idx].enumname, "CC0") == 0
+         || strcmp (defs[idx].enumname, "RETURN") == 0
          || strcmp (defs[idx].enumname, "CONST_VECTOR") == 0);
 }
 
index 39fc2340c31085561a3bb3b0323bb028076d40fc..1c64b85d40855b16d1769536254cb969e8101ff6 100644 (file)
@@ -1367,7 +1367,7 @@ redirect_exp_1 (rtx *loc, rtx olabel, rtx nlabel, rtx insn)
          if (nlabel)
            n = gen_rtx_LABEL_REF (Pmode, nlabel);
          else
-           n = gen_rtx_RETURN (VOIDmode);
+           n = ret_rtx;
 
          validate_change (insn, loc, n, 1);
          return;
@@ -1378,7 +1378,7 @@ redirect_exp_1 (rtx *loc, rtx olabel, rtx nlabel, rtx insn)
       if (nlabel)
        x = gen_rtx_LABEL_REF (Pmode, nlabel);
       else
-       x = gen_rtx_RETURN (VOIDmode);
+       x = ret_rtx;
       if (loc == &PATTERN (insn))
        x = gen_rtx_SET (VOIDmode, pc_rtx, x);
       validate_change (insn, loc, x, 1);
@@ -1389,7 +1389,7 @@ redirect_exp_1 (rtx *loc, rtx olabel, rtx nlabel, rtx insn)
       && GET_CODE (SET_SRC (x)) == LABEL_REF
       && XEXP (SET_SRC (x), 0) == olabel)
     {
-      validate_change (insn, loc, gen_rtx_RETURN (VOIDmode), 1);
+      validate_change (insn, loc, ret_rtx, 1);
       return;
     }
 
index 613cadb062b0b4220d185746861c613537fb74db..e335a39b241ecf98383557a66636abe9b0e725e4 100644 (file)
--- a/gcc/rtl.c
+++ b/gcc/rtl.c
@@ -255,6 +255,7 @@ copy_rtx (rtx orig)
     case CODE_LABEL:
     case PC:
     case CC0:
+    case RETURN:
     case SCRATCH:
       /* SCRATCH must be shared because they represent distinct values.  */
       return orig;
index 67dbf2b6ab5aea183881e9c11352bd894c33d037..04021a3f29d9a270207bba3350a5fb94a6f46e08 100644 (file)
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -2045,6 +2045,7 @@ enum global_rtl_index
 {
   GR_PC,
   GR_CC0,
+  GR_RETURN,
   GR_STACK_POINTER,
   GR_FRAME_POINTER,
 /* For register elimination to work properly these hard_frame_pointer_rtx,
@@ -2134,6 +2135,7 @@ extern struct target_rtl *this_target_rtl;
 
 /* Standard pieces of rtx, to be substituted directly into things.  */
 #define pc_rtx                  (global_rtl[GR_PC])
+#define ret_rtx                 (global_rtl[GR_RETURN])
 #define cc0_rtx                 (global_rtl[GR_CC0])
 
 /* All references to certain hard regs, except those created