rs6000: mark clobber for registers changed by untpyed_call
authorJiufu Guo <guojiufu@linux.ibm.com>
Mon, 17 Feb 2020 02:48:39 +0000 (10:48 +0800)
committerJiufu Guo <guojiufu@linux.ibm.com>
Mon, 17 Feb 2020 02:48:39 +0000 (10:48 +0800)
As PR93047 said, __builtin_apply/__builtin_return does not work well with
-frename-registers.  This is caused by return register(e.g. r3) is used to
rename another register, before return register is stored to stack.
This patch fix this issue by emitting clobber for those egisters which
maybe changed by untyped call.

gcc/
2020-02-17  Jiufu Guo  <guojiufu@linux.ibm.com>

PR target/93047
* config/rs6000/rs6000.md (untyped_call): Add emit_clobber.

gcc/testsuite
2020-02-17  Jiufu Guo  <guojiufu@linux.ibm.com>

PR target/93047
* gcc.dg/torture/stackalign/builtin-return-2.c: New test case.

gcc/ChangeLog
gcc/config/rs6000/rs6000.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/stackalign/builtin-return-2.c [new file with mode: 0644]

index c7a551b489631423c2863fdbfde365a575114dd4..5357acf060b8c9e4d451be9c1c7845fe5b502674 100644 (file)
@@ -1,3 +1,8 @@
+2020-02-17  Jiufu Guo  <guojiufu@linux.ibm.com>
+
+       PR target/93047
+       * config/rs6000/rs6000.md (untyped_call): Add emit_clobber.
+
 2020-02-16  Uroš Bizjak  <ubizjak@gmail.com>
 
        PR target/93743
index 3da7b1ed9c2a9a25afdb7bc81f530ef08b21e6d1..ad88b6783af9612ab61190ad73449ea5f206bb3d 100644 (file)
 
   emit_call_insn (gen_call (operands[0], const0_rtx, const0_rtx));
 
+  for (int i = 0; i < XVECLEN (operands[2], 0); i++)
+    emit_clobber (SET_SRC (XVECEXP (operands[2], 0, i)));
+  emit_insn (gen_blockage ());
+
   for (i = 0; i < XVECLEN (operands[2], 0); i++)
     {
       rtx set = XVECEXP (operands[2], 0, i);
index f2566ad9844f673cae40e6cf50c6cc30f78539cf..83c581c4e0c7592757adeaec1a62a4f70bac58b1 100644 (file)
@@ -1,3 +1,8 @@
+2020-02-17  Jiufu Guo  <guojiufu@linux.ibm.com>
+
+       PR target/93047
+       * gcc.dg/torture/stackalign/builtin-return-2.c: New test case.
+
 2020-02-16  Uroš Bizjak  <ubizjak@gmail.com>
 
        PR target/93743
diff --git a/gcc/testsuite/gcc.dg/torture/stackalign/builtin-return-2.c b/gcc/testsuite/gcc.dg/torture/stackalign/builtin-return-2.c
new file mode 100644 (file)
index 0000000..7719109
--- /dev/null
@@ -0,0 +1,40 @@
+/* PR target/93047 */
+/* Originator: Andrew Church <gcczilla@achurch.org> */
+/* { dg-do run } */
+/* { dg-additional-options "-O3 -frename-registers" } */
+/* { dg-require-effective-target untyped_assembly } */
+
+#ifdef __MMIX__
+/* No parameters on stack for bar.  */
+#define STACK_ARGUMENTS_SIZE 0
+#else
+#define STACK_ARGUMENTS_SIZE 64
+#endif
+
+extern void abort(void);
+
+int foo(int n)
+{
+  return n+1;
+}
+
+int bar(int n)
+{
+  __builtin_return(__builtin_apply((void (*)(void))foo, __builtin_apply_args(),
+                                  STACK_ARGUMENTS_SIZE));
+}
+
+int main(void)
+{
+  /* Allocate 64 bytes on the stack to make sure that __builtin_apply
+     can read at least 64 bytes above the return address.  */
+  char dummy[64];
+
+  __asm__ ("" : : "" (dummy));
+
+  if (bar(1) != 2)
+    abort();
+
+  return 0;
+}
+