diff mbox

[SH] Add simple_return pattern

Message ID 1347316135.15222.6.camel@yam-132-YW-E178-FTW
State New
Headers show

Commit Message

Oleg Endo Sept. 10, 2012, 10:28 p.m. UTC
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

Comments

Christian Bruel Sept. 11, 2012, 6:37 a.m. UTC | #1
On 09/11/2012 12:28 AM, Oleg Endo wrote:
> 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?


yes, there is this new iterator.md file. I'm moving the iterator there.
Will resent.

Thanks

Christian
diff mbox

Patch

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