From 43203dea1afa87140a0f045f2c2182943247065f Mon Sep 17 00:00:00 2001 From: Ramana Radhakrishnan Date: Fri, 13 May 2016 09:23:28 +0000 Subject: [PATCH] Set TARGET_OMIT_STRUCT_RETURN_REG to true The reason this caught my eye on aarch64 is because the return value register (x0) is not identical to the register in which the hidden parameter for AArch64 is set (x8). Thus setting this to true seems to be quite reasonable and shaves off 100 odd mov x0, x8's from cc1 in a bootstrap build. I don't expect this to make a huge impact on performance but as they say every little counts. The AAPCS64 is quite explicit about not requiring that the contents of x8 be kept live. Bootstrapped and regression tested on aarch64. Ok to apply ? Ramana gcc/ * config/aarch64/aarch64.c (TARGET_OMIT_STRUCT_RETURN_REG): Set to true. gcc/testsuite * gcc.target/aarch64/struct_return.c: New test. From-SVN: r236197 --- gcc/ChangeLog | 5 +++ gcc/config/aarch64/aarch64.c | 3 ++ gcc/testsuite/ChangeLog | 4 +++ .../gcc.target/aarch64/struct_return.c | 31 +++++++++++++++++++ 4 files changed, 43 insertions(+) create mode 100644 gcc/testsuite/gcc.target/aarch64/struct_return.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 93fa74308c9..87f5eaff15b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2016-05-13 Ramana Radhakrishnan + + * config/aarch64/aarch64.c (TARGET_OMIT_STRUCT_RETURN_REG): Set + to true. + 2016-05-13 Rainer Orth PR target/71080 diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 999549426e6..7e0e3b9a621 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 fd0702b157c..333bec6c546 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2016-05-13 Ramana Radhakrishnan + + * gcc.target/aarch64/struct_return.c: New test. + 2016-05-12 Marek Polacek 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 00000000000..6d90b7e5953 --- /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" } } */ -- 2.30.2