This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [SH] Add simple_return pattern


On Mon, 2012-09-10 at 15:51 +0200, Christian Bruel wrote:
> This patch implements the simple_return pattern to enable -fshrink-wrap
> on SH. It also clean up some redundancies for expand_epilogue (called
> twice from the "return" and "epilogue" patterns and the
> sh_expand_prologue parameter type.
> 
> No regressions with sh-superh-elf and sh4-linux gcc testsuites.
> 
> Thanks
> 
> Christian
> 

Regarding the iterators, maybe it's better to put them in
config/sh/iterators.md.  The optab code attr is not needed in this case,
"<code>" is sufficient.  How about the attached patch instead?

BTW, I'm now also testing the modified attached patch and your previous
newlib related patch.

Cheers,
Oleg
Index: gcc/config/sh/sh.md
===================================================================
--- gcc/config/sh/sh.md	(revision 191161)
+++ gcc/config/sh/sh.md	(working copy)
@@ -9335,7 +9335,7 @@
   [(return)]
   ""
 {
-  sh_expand_epilogue (1);
+  sh_expand_epilogue (true);
   if (TARGET_SHCOMPACT)
     {
       rtx insn, set;
@@ -10154,9 +10154,12 @@
 }
   [(set_attr "type" "load_media")])
 
+(define_expand "simple_return"
+  [(simple_return)])
+
 (define_expand "return"
-  [(return)]
-  "reload_completed && ! sh_need_epilogue ()"
+  [(simple_return)]
+ "reload_completed && epilogue_completed"
 {
   if (TARGET_SHMEDIA)
     {
@@ -10172,8 +10175,8 @@
     }
 })
 
-(define_insn "*return_i"
-  [(return)]
+(define_insn "*<code>_i"
+  [(RETURN)]
   "TARGET_SH1 && ! (TARGET_SHCOMPACT
 		    && (crtl->args.info.call_cookie
 			& CALL_COOKIE_RET_TRAMP (1)))
@@ -10299,19 +10302,12 @@
 (define_expand "prologue"
   [(const_int 0)]
   ""
-{
-  sh_expand_prologue ();
-  DONE;
-})
+  "sh_expand_prologue (); DONE;")
 
 (define_expand "epilogue"
   [(return)]
   ""
-{
-  sh_expand_epilogue (0);
-  emit_jump_insn (gen_return ());
-  DONE;
-})
+  "sh_expand_epilogue (false);")
 
 (define_expand "eh_return"
   [(use (match_operand 0 "register_operand" ""))]
Index: gcc/config/sh/iterators.md
===================================================================
--- gcc/config/sh/iterators.md	(revision 191161)
+++ gcc/config/sh/iterators.md	(working copy)
@@ -34,3 +34,5 @@
 (define_mode_attr disp04 [(QI "K04") (HI "K05")])
 (define_mode_attr disp12 [(QI "K12") (HI "K13")])
 
+;; Code iterator for return codes.
+(define_code_iterator RETURN [return simple_return])
Index: gcc/config/sh/sh-protos.h
===================================================================
--- gcc/config/sh/sh-protos.h	(revision 191161)
+++ gcc/config/sh/sh-protos.h	(working copy)
@@ -117,7 +117,6 @@
 extern int sh_media_register_for_return (void);
 extern void sh_expand_prologue (void);
 extern void sh_expand_epilogue (bool);
-extern bool sh_need_epilogue (void);
 extern void sh_set_return_address (rtx, rtx);
 extern int initial_elimination_offset (int, int);
 extern bool fldi_ok (void);
Index: gcc/config/sh/sh.c
===================================================================
--- gcc/config/sh/sh.c	(revision 191161)
+++ gcc/config/sh/sh.c	(working copy)
@@ -7901,22 +7901,6 @@
 
 static int sh_need_epilogue_known = 0;
 
-bool
-sh_need_epilogue (void)
-{
-  if (! sh_need_epilogue_known)
-    {
-      rtx epilogue;
-
-      start_sequence ();
-      sh_expand_epilogue (0);
-      epilogue = get_insns ();
-      end_sequence ();
-      sh_need_epilogue_known = (epilogue == NULL ? -1 : 1);
-    }
-  return sh_need_epilogue_known > 0;
-}
-
 /* Emit code to change the current function's return address to RA.
    TEMP is available as a scratch register, if needed.  */
 
@@ -7996,7 +7980,6 @@
 sh_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED,
 			     HOST_WIDE_INT size ATTRIBUTE_UNUSED)
 {
-  sh_need_epilogue_known = 0;
 }
 
 static rtx

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]