aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiufu Guo <guojiufu@linux.ibm.com>2020-02-17 10:48:39 +0800
committerJiufu Guo <guojiufu@linux.ibm.com>2020-02-17 10:48:39 +0800
commita8532e9927ad6e4bbedbb957b02ca413aedf9098 (patch)
tree69c9dbdafe0cc4d702a0f8104b1a592da0011e76
parentf0a33db5fb64f35a56e02e976920ee8400181719 (diff)
downloadgcc-a8532e9927ad6e4bbedbb957b02ca413aedf9098.zip
gcc-a8532e9927ad6e4bbedbb957b02ca413aedf9098.tar.gz
gcc-a8532e9927ad6e4bbedbb957b02ca413aedf9098.tar.bz2
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.
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/rs6000/rs6000.md4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/torture/stackalign/builtin-return-2.c40
4 files changed, 54 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index c7a551b..5357acf 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index 3da7b1e..ad88b67 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 f2566ad..83c581c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..7719109
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/stackalign/builtin-return-2.c
@@ -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;
+}
+