> -----Original Message-----
> From: Steve Ellcey [mailto:sell...@imgtec.com]
> Sent: Friday, October 23, 2015 2:08 PM
> To: Myers, Joseph
> Cc: Bernd Schmidt; Mike Stump; gcc-patches@gcc.gnu.org;
> matthew.fort...@imgtec.com; Moore, Catherine
> Subject: Re: [Patch, MIPS] Frame header optimization for MIPS (part 2)
> 
> Just to follow up on this string, here is a new version of the patch
> with the extraneous parenthesis removed.
> 
> Steve Ellcey
> sell...@imgtec.com
> 
> 
> 2015-10-23  Steve Ellcey  <sell...@imgtec.com>
> 
>       * frame-header-opt.c (gate): Check for optimize > 0.
>       (has_inlined_assembly): New function.
>       (needs_frame_header_p): Remove is_leaf_function check,
>       add argument type check.
>       (callees_functions_use_frame_header): Add is_leaf_function
>       and has_inlined_assembly calls..
>       (set_callers_may_not_allocate_frame): New function.
>       (frame_header_opt): Add is_leaf_function call, add
>       set_callers_may_not_allocate_frame call.
>       * config/mips/mips.c (mips_compute_frame_info): Add check
>       to see if callee saved regs can be put in frame header.
>       (mips_expand_prologue): Add check to see if step1 is zero,
>       fix cfa restores when using frame header to store regs.
>       (mips_can_use_return_insn): Check to see if registers are
>       stored in frame header.
>       * config/mips/mips.h (machine_function): Add
>       callers_may_not_allocate_frame and
>       use_frame_header_for_callee_saved_regs fields.

This is okay after making the minor corrections embedded below.
I'm sorry that it took me so long to review this patch.
Catherine

> 
> diff --git a/gcc/config/mips/frame-header-opt.c b/gcc/config/mips/frame-
> header-opt.c
> index 7c7b1f2..2cf589d 100644
> --- a/gcc/config/mips/frame-header-opt.c
> +++ b/gcc/config/mips/frame-header-opt.c
> @@ -125,6 +125,29 @@ is_leaf_function (function *fn)
>    return true;
>  }
> 
> +/* Return true if this function has inline assembly code or if we cannot
> +   be certain that it does not.  False if know that there is no inline
> +   assembly.  */
> +

 s/False if know/False if we know/

> @@ -136,20 +159,26 @@ needs_frame_header_p (function *fn)
>    if (fn->decl == NULL)
>      return true;
> 
> -  if (fn->stdarg || !is_leaf_function (fn))
> +  if (fn->stdarg)
>      return true;
> 
>    for (t = DECL_ARGUMENTS (fn->decl); t; t = TREE_CHAIN (t))
>      {
>        if (!use_register_for_decl (t))
> -       return true;
> +     return true;
> +
> +      /* Some 64 bit types may get copied to general registers using the 
> frame
> +      header, see mips_output_64bit_xfer.  Checking for SImode only may be
> +         overly restrictive but it is gauranteed to be safe. */

  s/64 bit/64-bit/
 s/gauranteed/guaranteed/

> diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
> index c5affc8..5a9d48d 100644
> --- a/gcc/config/mips/mips.c
> +++ b/gcc/config/mips/mips.c
> @@ -10465,6 +10465,35 @@ mips_compute_frame_info (void)
>        frame->cop0_sp_offset = offset - UNITS_PER_WORD;
>      }
> 
> +  /* Determine if we can save the callee saved registers in the frame
> +     header.  Restrict this to functions where there is no other reason
> +     to allocate stack space so that we can completely eliminate the
> +     instructions that modify the stack pointer.  */
> +
  s/callee saved/callee-saved/
  s/completely//

> 
> 
> 
> 2015-10-23  Steve Ellcey  <sell...@imgtec.com>
> 
>       * gcc.target/mips/frame-header-4.c: New test.
> 
> diff --git a/gcc/testsuite/gcc.target/mips/frame-header-4.c
> b/gcc/testsuite/gcc.target/mips/frame-header-4.c
> index e69de29..3cddba1 100644
> --- a/gcc/testsuite/gcc.target/mips/frame-header-4.c
> +++ b/gcc/testsuite/gcc.target/mips/frame-header-4.c
> @@ -0,0 +1,20 @@
> +/* Verify that we can optimize away the frame header allocation in bar
> +   by having it use its frame header to store $31 in before calling foo.  */
> +
> +/* { dg-do compile } */
> +/* { dg-options "-mframe-header-opt -mabi=32" } */
> +/* { dg-skip-if "code quality test" { *-*-* } { "-O0" } { "" } } */
> +/* { dg-final { scan-assembler-not "\taddiu\t\\\$sp" } } */
> +
> +int __attribute__ ((noinline))
> +foo (int a, int b)
> +{
> +     return a + b;
> +}
> +
> +int  __attribute__ ((noinline))
> +bar (int a, int b)
> +{
> +     return 1 + foo(a,b);
> +}
> +

  Space after foo, please.  Change the two tabs to two space each.

Reply via email to