diff options
| -rw-r--r-- | gcc/ChangeLog | 5 | ||||
| -rw-r--r-- | gcc/config/aarch64/aarch64.c | 3 | ||||
| -rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
| -rw-r--r-- | gcc/testsuite/gcc.target/aarch64/struct_return.c | 31 |
4 files changed, 43 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 93fa743..87f5eaf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2016-05-13 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com> + + * config/aarch64/aarch64.c (TARGET_OMIT_STRUCT_RETURN_REG): Set + to true. + 2016-05-13 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> PR target/71080 diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 9995494..7e0e3b9 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -14232,6 +14232,9 @@ aarch64_optab_supported_p (int op, machine_mode, machine_mode, #undef TARGET_OPTAB_SUPPORTED_P #define TARGET_OPTAB_SUPPORTED_P aarch64_optab_supported_p +#undef TARGET_OMIT_STRUCT_RETURN_REG +#define TARGET_OMIT_STRUCT_RETURN_REG true + struct gcc_target targetm = TARGET_INITIALIZER; #include "gt-aarch64.h" diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fd0702b..333bec6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-05-13 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com> + + * gcc.target/aarch64/struct_return.c: New test. + 2016-05-12 Marek Polacek <polacek@redhat.com> PR c/70756 diff --git a/gcc/testsuite/gcc.target/aarch64/struct_return.c b/gcc/testsuite/gcc.target/aarch64/struct_return.c new file mode 100644 index 0000000..6d90b7e --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/struct_return.c @@ -0,0 +1,31 @@ +/* Test the absence of a spurious move from x8 to x0 for functions + return structures. */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +struct s +{ + long x; + long y; + long z; +}; + +struct s __attribute__((noinline)) +foo (long a, long d, long c) +{ + struct s b; + b.x = a; + b.y = d; + b.z = c; + return b; +} + +int +main (void) +{ + struct s x; + x = foo ( 10, 20, 30); + return x.x + x.y + x.z; +} + +/* { dg-final { scan-assembler-not "mov\tx0, x8" } } */ |
