mirror of git://gcc.gnu.org/git/gcc.git
re PR target/55019 (Incorrectly use live argument register to save high register in thumb1 prologue)
gcc/ PR target/55019 * config/arm/arm.c (thumb1_expand_prologue): Don't push high regs with live argument regs. gcc/testsuite/ PR target/55019 * gcc.dg/pr55019.c: New. From-SVN: r192703
This commit is contained in:
parent
e4878d25f3
commit
0b7463235f
|
|
@ -1,3 +1,9 @@
|
|||
2012-10-23 Terry Guo <terry.guo@arm.com>
|
||||
|
||||
PR target/55019
|
||||
* config/arm/arm.c (thumb1_expand_prologue): Don't push high regs with
|
||||
live argument regs.
|
||||
|
||||
2012-10-23 Hans-Peter Nilsson <hp@bitrange.com>
|
||||
|
||||
PR middle-end/55030
|
||||
|
|
|
|||
|
|
@ -22753,12 +22753,18 @@ thumb1_expand_prologue (void)
|
|||
{
|
||||
unsigned pushable_regs;
|
||||
unsigned next_hi_reg;
|
||||
unsigned arg_regs_num = TARGET_AAPCS_BASED ? crtl->args.info.aapcs_ncrn
|
||||
: crtl->args.info.nregs;
|
||||
unsigned arg_regs_mask = (1 << arg_regs_num) - 1;
|
||||
|
||||
for (next_hi_reg = 12; next_hi_reg > LAST_LO_REGNUM; next_hi_reg--)
|
||||
if (live_regs_mask & (1 << next_hi_reg))
|
||||
break;
|
||||
|
||||
pushable_regs = l_mask & 0xff;
|
||||
/* Here we need to mask out registers used for passing arguments
|
||||
even if they can be pushed. This is to avoid using them to stash the high
|
||||
registers. Such kind of stash may clobber the use of arguments. */
|
||||
pushable_regs = l_mask & (~arg_regs_mask) & 0xff;
|
||||
|
||||
if (pushable_regs == 0)
|
||||
pushable_regs = 1 << thumb_find_work_register (live_regs_mask);
|
||||
|
|
|
|||
|
|
@ -1,3 +1,8 @@
|
|||
2012-10-23 Terry Guo <terry.guo@arm.com>
|
||||
|
||||
PR target/55019
|
||||
* gcc.dg/pr55019.c: New.
|
||||
|
||||
2012-10-22 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
|
||||
|
||||
PR tree-optimization/55008
|
||||
|
|
|
|||
|
|
@ -0,0 +1,41 @@
|
|||
/* { dg-do run } */
|
||||
/* { dg-options "-O1 -funroll-loops" } */
|
||||
/* { dg-add-options ieee } */
|
||||
|
||||
extern void exit (int);
|
||||
extern void abort (void);
|
||||
|
||||
void
|
||||
compare (double a, double b)
|
||||
{
|
||||
do
|
||||
{
|
||||
double s1 = __builtin_copysign ((double) 1.0, a);
|
||||
double s2 = __builtin_copysign ((double) 1.0, b);
|
||||
|
||||
if (s1 != s2)
|
||||
abort ();
|
||||
|
||||
if ((__builtin_isnan (a) != 0) != (__builtin_isnan (b) != 0))
|
||||
abort ();
|
||||
|
||||
if ((a != b) != (__builtin_isnan (a) != 0))
|
||||
abort ();
|
||||
} while (0);
|
||||
}
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
double a = 0.0;
|
||||
double b = 0.0;
|
||||
_Complex double cr = __builtin_complex (a, b);
|
||||
static _Complex double cs = __builtin_complex (0.0, 0.0);
|
||||
|
||||
compare (__real__ cr, 0.0);
|
||||
compare (__imag__ cr, 0.0);
|
||||
compare (__real__ cs, 0.0);
|
||||
compare (__imag__ cs, 0.0);
|
||||
|
||||
exit (0);
|
||||
}
|
||||
Loading…
Reference in New Issue