diff --git a/gcc/reginfo.c b/gcc/reginfo.c index 0cda6aa620098c752522add589b42631b382d9fc..ea96e236a5f76fb7ddc2c9406b7b377aa0eb3087 100644 --- a/gcc/reginfo.c +++ b/gcc/reginfo.c @@ -692,12 +692,13 @@ fix_register (const char *name, int fixed, int call_used) for (i = reg; i < reg + nregs; i++) { if ((i == STACK_POINTER_REGNUM + || ( #ifdef HARD_FRAME_POINTER_REGNUM - || i == HARD_FRAME_POINTER_REGNUM + i == HARD_FRAME_POINTER_REGNUM #else - || i == FRAME_POINTER_REGNUM + i == FRAME_POINTER_REGNUM #endif - ) + && !flag_omit_frame_pointer)) && (fixed == 0 || call_used == 0)) { switch (fixed) diff --git a/gcc/testsuite/gcc.target/aarch64/fp_free_1.c b/gcc/testsuite/gcc.target/aarch64/fp_free_1.c new file mode 100644 index 0000000000000000000000000000000000000000..79e23b13d3fb0f801e201c69286d27bac97aa013 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/fp_free_1.c @@ -0,0 +1,32 @@ +/* { dg-do run { target aarch64-*-* } } */ +/* { dg-options "-O2 -fno-inline -fomit-frame-pointer -ffixed-x2 -ffixed-x3 -ffixed-x4 -ffixed-x5 -ffixed-x6 -ffixed-x7 -ffixed-x8 -ffixed-x9 -ffixed-x10 -ffixed-x11 -ffixed-x12 -ffixed-x13 -ffixed-x14 -ffixed-x15 -ffixed-x16 -ffixed-x17 -ffixed-x18 -ffixed-x19 -ffixed-x20 -ffixed-x21 -ffixed-x22 -ffixed-x23 -ffixed-x24 -ffixed-x25 -ffixed-x26 -ffixed-x27 -ffixed-x28 -ffixed-x30 -mgeneral-regs-only -fno-ipa-cp -fno-schedule-fusion -fno-peephole2 -fcall-saved-x29 -fdump-rtl-ira" } */ + +extern void abort (); + +int +dec (int a, int b) +{ + return a + b; +} + +int +cal (int a, int b) +{ + int sum1 = a * b; + int sum2 = a / b; + int sum = dec (sum1, sum2); + return a + b + sum + sum1 + sum2; +} + +int +main (int argc, char **argv) +{ + int ret = cal (2, 1); + + if (ret != 11) + abort (); + + return 0; +} + +/* { dg-final { scan-rtl-dump "assign reg 29" "ira" } } */