2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-03-25 10:30:43 +08:00

re PR target/64453 (Live high register not saved in function prolog on ARM with -Os)

2015-01-14  Thomas Preud'homme  <thomas.preudhomme@arm.com>

    gcc/
    PR target/64453
    * config/arm/arm.c (callee_saved_reg_p): Define.
    (arm_compute_save_reg0_reg12_mask): Use callee_saved_reg_p to check if
    register is callee saved instead of !call_used_regs[reg].
    (thumb1_compute_save_reg_mask): Likewise.

    gcc/testsuite/
    PR target/64453
    * gcc.target/arm/pr64453.c: New.

From-SVN: r219592
This commit is contained in:
Thomas Preud'homme 2015-01-14 11:51:40 +00:00 committed by Thomas Preud'homme
parent 6af2585d5c
commit 6f0a6218e3
4 changed files with 34 additions and 5 deletions
gcc
ChangeLog
config/arm
testsuite
ChangeLog
gcc.target/arm

@ -1,3 +1,11 @@
2015-01-14 Thomas Preud'homme <thomas.preudhomme@arm.com>
PR target/64453
* config/arm/arm.c (callee_saved_reg_p): Define.
(arm_compute_save_reg0_reg12_mask): Use callee_saved_reg_p to check if
register is callee saved instead of !call_used_regs[reg].
(thumb1_compute_save_reg_mask): Likewise.
2015-01-14 Hale Wang <hale.wang@arm.com>
* config/arm/arm.c: Tune the max_cond_insns/branch_cost for

@ -19033,6 +19033,14 @@ output_ascii_pseudo_op (FILE *stream, const unsigned char *p, int len)
fputs ("\"\n", stream);
}
/* Whether a register is callee saved or not. This is necessary because high
registers are marked as caller saved when optimizing for size on Thumb-1
targets despite being callee saved in order to avoid using them. */
#define callee_saved_reg_p(reg) \
(!call_used_regs[reg] \
|| (TARGET_THUMB1 && optimize_size \
&& reg >= FIRST_HI_REGNUM && reg <= LAST_HI_REGNUM))
/* Compute the register save mask for registers 0 through 12
inclusive. This code is used by arm_compute_save_reg_mask. */
@ -19093,7 +19101,7 @@ arm_compute_save_reg0_reg12_mask (void)
/* In the normal case we only need to save those registers
which are call saved and which are used by this function. */
for (reg = 0; reg <= 11; reg++)
if (df_regs_ever_live_p (reg) && ! call_used_regs[reg])
if (df_regs_ever_live_p (reg) && callee_saved_reg_p (reg))
save_reg_mask |= (1 << reg);
/* Handle the frame pointer as a special case. */
@ -19257,7 +19265,7 @@ thumb1_compute_save_reg_mask (void)
mask = 0;
for (reg = 0; reg < 12; reg ++)
if (df_regs_ever_live_p (reg) && !call_used_regs[reg])
if (df_regs_ever_live_p (reg) && callee_saved_reg_p (reg))
mask |= 1 << reg;
if (flag_pic
@ -19290,7 +19298,7 @@ thumb1_compute_save_reg_mask (void)
if (reg * UNITS_PER_WORD <= (unsigned) arm_size_return_regs ())
reg = LAST_LO_REGNUM;
if (! call_used_regs[reg])
if (callee_saved_reg_p (reg))
mask |= 1 << reg;
}
@ -27230,8 +27238,7 @@ arm_conditional_register_usage (void)
/* When optimizing for size on Thumb-1, it's better not
to use the HI regs, because of the overhead of
stacking them. */
for (regno = FIRST_HI_REGNUM;
regno <= LAST_HI_REGNUM; ++regno)
for (regno = FIRST_HI_REGNUM; regno <= LAST_HI_REGNUM; ++regno)
fixed_regs[regno] = call_used_regs[regno] = 1;
}

@ -1,3 +1,8 @@
2015-01-14 Thomas Preud'homme <thomas.preudhomme@arm.com>
PR target/64453
* gcc.target/arm/pr64453.c: New.
2015-01-14 Richard Biener <rguenther@suse.de>
PR lto/64415

@ -0,0 +1,9 @@
/* { dg-do compile } */
/* { dg-options "-mthumb -Os " } */
/* { dg-require-effective-target arm_thumb1_ok } */
void save_regs () {
__asm volatile ("" ::: "r8");
}
/* { dg-final { scan-assembler "\tmov\tr., r8" } } */