Set TARGET_OMIT_STRUCT_RETURN_REG to true
authorRamana Radhakrishnan <ramana.radhakrishnan@arm.com>
Fri, 13 May 2016 09:23:28 +0000 (09:23 +0000)
committerRamana Radhakrishnan <ramana@gcc.gnu.org>
Fri, 13 May 2016 09:23:28 +0000 (09:23 +0000)
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
gcc/config/aarch64/aarch64.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/aarch64/struct_return.c [new file with mode: 0644]

index 93fa74308c9a52679a4bbcdbf7a0677b026ca90a..87f5eaff15b7952417cf2f0e3ee87193924f6edc 100644 (file)
@@ -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
index 999549426e6b13bc952b5b3acc0c54ad7e978aab..7e0e3b9a62157cba92c42651763f6cd2954bd33f 100644 (file)
@@ -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"
index fd0702b157cdc19fcabf66b9d187fa11bfc08d35..333bec6c5462fdcf89149e4cf0ae1111df3ab715 100644 (file)
@@ -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 (file)
index 0000000..6d90b7e
--- /dev/null
@@ -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" } } */