Commit a8532e99 by Jiufu Guo

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  <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.
parent f0a33db5
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> 2020-02-16 Uroš Bizjak <ubizjak@gmail.com>
PR target/93743 PR target/93743
......
...@@ -10870,6 +10870,10 @@ ...@@ -10870,6 +10870,10 @@
emit_call_insn (gen_call (operands[0], const0_rtx, const0_rtx)); 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++) for (i = 0; i < XVECLEN (operands[2], 0); i++)
{ {
rtx set = XVECEXP (operands[2], 0, i); rtx set = XVECEXP (operands[2], 0, i);
......
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> 2020-02-16 Uroš Bizjak <ubizjak@gmail.com>
PR target/93743 PR target/93743
......
/* 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment