Ping?
 
> > -----Original Message-----
> > From: gcc-patches-ow...@gcc.gnu.org [mailto:gcc-patches-
> > ow...@gcc.gnu.org] On Behalf Of Thomas Preud'homme
> > Sent: Wednesday, August 20, 2014 9:28 AM
> > To: gcc-patches@gcc.gnu.org
> > Subject: [PATCH][ARM] Fix -fcall-saved-rX for X > 7
> >
> > This patch makes -fcall-saved-rX for X > 7 on Thumb target when optimizing
> > for size. It works by adding a new field x_user_set_call_save_regs in struct
> > target_hard_regs to track whether an entry in fields x_fixed_regs,
> > x_call_used_regs and x_call_really_used_regs was user set or is in its
> default
> > value. Then it can decide whether to set a given high register as caller 
> > saved
> > or not when optimizing for size based on this information.
> >
> > ChangeLog are as follows:
> >
> > *** gcc/ChangeLog ***
> >
> > 2014-08-15  Thomas Preud'homme  <thomas.preudho...@arm.com>
> >
> >         * config/arm/arm.c (arm_conditional_register_usage): Only set high
> >         registers as caller saved when optimizing for size *and* the user 
> > did
> >         not asked otherwise through -fcall-saved-* switch.
> >         * hard-reg-set.h (x_user_set_call_save_regs): New.
> >         (user_set_call_save_regs): Define.
> >         * reginfo.c (init_reg_sets): Initialize user_set_call_save_regs.
> >         (fix_register): Indicate in user_set_call_save_regs that the value 
> > set
> >         in call_save_regs and fixed_regs is user set.
> >
> >
> > *** gcc/testsuite/ChangeLog ***
> >
> > 2014-08-15  Thomas Preud'homme  <thomas.preudho...@arm.com>
> >
> >         * gcc.target/arm/fcall-save-rhigh.c: New.
> >
> >
> > diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c
> > index 2f8d327..8324fa3 100644
> > --- a/gcc/config/arm/arm.c
> > +++ b/gcc/config/arm/arm.c
> > @@ -30084,7 +30084,8 @@ arm_conditional_register_usage (void)
> >          stacking them.  */
> >        for (regno = FIRST_HI_REGNUM;
> >        regno <= LAST_HI_REGNUM; ++regno)
> > -   fixed_regs[regno] = call_used_regs[regno] = 1;
> > +   if (!user_set_call_save_regs[regno])
> > +     fixed_regs[regno] = call_used_regs[regno] = 1;
> >      }
> >
> >    /* The link register can be clobbered by any branch insn,
> > diff --git a/gcc/hard-reg-set.h b/gcc/hard-reg-set.h
> > index b8ab3df..b523637 100644
> > --- a/gcc/hard-reg-set.h
> > +++ b/gcc/hard-reg-set.h
> > @@ -614,6 +614,11 @@ struct target_hard_regs {
> >
> >    char x_call_really_used_regs[FIRST_PSEUDO_REGISTER];
> >
> > +  /* Indexed by hard register number, contains 1 for registers
> > +     whose saving at function call was decided by the user
> > +     with -fcall-saved-*, -fcall-used-* or -ffixed-*.  */
> > +  char x_user_set_call_save_regs[FIRST_PSEUDO_REGISTER];
> > +
> >    /* The same info as a HARD_REG_SET.  */
> >    HARD_REG_SET x_call_used_reg_set;
> >
> > @@ -685,6 +690,8 @@ extern struct target_hard_regs
> > *this_target_hard_regs;
> >    (this_target_hard_regs->x_call_used_regs)
> >  #define call_really_used_regs \
> >    (this_target_hard_regs->x_call_really_used_regs)
> > +#define user_set_call_save_regs \
> > +  (this_target_hard_regs->x_user_set_call_save_regs)
> >  #define call_used_reg_set \
> >    (this_target_hard_regs->x_call_used_reg_set)
> >  #define call_fixed_reg_set \
> > diff --git a/gcc/reginfo.c b/gcc/reginfo.c
> > index 7668be0..0b35f7f 100644
> > --- a/gcc/reginfo.c
> > +++ b/gcc/reginfo.c
> > @@ -183,6 +183,7 @@ init_reg_sets (void)
> >    memcpy (call_really_used_regs, initial_call_really_used_regs,
> >       sizeof call_really_used_regs);
> >  #endif
> > +  memset (user_set_call_save_regs, 0, sizeof user_set_call_save_regs);
> >  #ifdef REG_ALLOC_ORDER
> >    memcpy (reg_alloc_order, initial_reg_alloc_order, sizeof 
> > reg_alloc_order);
> >  #endif
> > @@ -742,6 +743,7 @@ fix_register (const char *name, int fixed, int
> call_used)
> >           if (fixed == 0)
> >             call_really_used_regs[i] = call_used;
> >  #endif
> > +         user_set_call_save_regs[i] = 1;
> >         }
> >     }
> >      }
> > diff --git a/gcc/testsuite/gcc.target/arm/fcall-save-rhigh.c
> > b/gcc/testsuite/gcc.target/arm/fcall-save-rhigh.c
> > new file mode 100644
> > index 0000000..a321a2b
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/arm/fcall-save-rhigh.c
> > @@ -0,0 +1,10 @@
> > +/* { dg-do compile } */
> > +/* { dg-final { scan-assembler "mov\\s+r.\\s*,\\s*r8" } } */
> > +/* { dg-require-effective-target arm_thumb1_ok } */
> > +/* { dg-options "-Os -mthumb -mcpu=cortex-m0 -fcall-saved-r8" } */
> > +
> > +void
> > +save_regs (void)
> > +{
> > +  asm volatile ("" ::: "r7", "r8");
> > +}
> >
> > Ok for trunk?
> >
> > Best regards,
> >
> > Thomas
> >
> >
> 
> 
> 



Reply via email to