From: Jiufu Guo Date: Mon, 17 Feb 2020 02:48:39 +0000 (+0800) Subject: rs6000: mark clobber for registers changed by untpyed_call X-Git-Tag: basepoints/gcc-11~1414 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a8532e9927ad6e4bbedbb957b02ca413aedf9098;p=thirdparty%2Fgcc.git 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-17 Jiufu Guo PR target/93047 * config/rs6000/rs6000.md (untyped_call): Add emit_clobber. gcc/testsuite 2020-02-17 Jiufu Guo PR target/93047 * gcc.dg/torture/stackalign/builtin-return-2.c: New test case. --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c7a551b48963..5357acf060b8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2020-02-17 Jiufu Guo + + PR target/93047 + * config/rs6000/rs6000.md (untyped_call): Add emit_clobber. + 2020-02-16 Uroš Bizjak PR target/93743 diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index 3da7b1ed9c2a..ad88b6783af9 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -10870,6 +10870,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 f2566ad9844f..83c581c4e0c7 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2020-02-17 Jiufu Guo + + PR target/93047 + * gcc.dg/torture/stackalign/builtin-return-2.c: New test case. + 2020-02-16 Uroš Bizjak 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 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; +} +