From 0ce89ea10d93a583854f02bc115e05cfd9d818e4 Mon Sep 17 00:00:00 2001 From: Jiufu Guo Date: Mon, 17 Feb 2020 10:48:39 +0800 Subject: [PATCH] rs6000: mark clobber for registers changed by untpyed_call 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-26 Jiufu Guo PR target/93047 * config/rs6000/rs6000.md (untyped_call): Add emit_clobber. gcc/testsuite 2020-02-26 Jiufu Guo PR target/93047 * gcc.dg/torture/stackalign/builtin-return-2.c: New test case. --- gcc/ChangeLog | 5 +++ gcc/config/rs6000/rs6000.md | 4 ++ gcc/testsuite/ChangeLog | 5 +++ .../torture/stackalign/builtin-return-2.c | 40 +++++++++++++++++++ 4 files changed, 54 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/torture/stackalign/builtin-return-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index cf37d814a66b..fedf2aa77d53 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2020-02-26 Jiufu Guo + + PR target/93047 + * config/rs6000/rs6000.md (untyped_call): Add emit_clobber. + 2020-02-26 Jakub Jelinek PR tree-optimization/93820 diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index 32da805a32db..a768f5dd511e 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -10655,6 +10655,10 @@ 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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 100489e1201c..31c7e4dc7a85 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-02-26 Jiufu Guo + + PR target/93047 + * gcc.dg/torture/stackalign/builtin-return-2.c: New test case. + 2020-02-26 Jakub Jelinek PR tree-optimization/93820 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 index 000000000000..771910971d60 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/stackalign/builtin-return-2.c @@ -0,0 +1,40 @@ +/* PR target/93047 */ +/* Originator: Andrew Church */ +/* { 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; +} + -- 2.47.2