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