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 > >