aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2020-12-13 17:08:08 +0100
committerJakub Jelinek <jakub@redhat.com>2020-12-13 17:08:08 +0100
commitd88e2cb54914cf8aa0ae68ca75dc45237acfcef0 (patch)
tree4bf7aac7518e05f8e01249158089a9b4b5b30a52 /gcc/testsuite
parent3b8a82f97dd48e153ce93b317c44254839e11461 (diff)
downloadgcc-d88e2cb54914cf8aa0ae68ca75dc45237acfcef0.zip
gcc-d88e2cb54914cf8aa0ae68ca75dc45237acfcef0.tar.gz
gcc-d88e2cb54914cf8aa0ae68ca75dc45237acfcef0.tar.bz2
varasm: Reject soft frame or arg pointer registers for register vars [PR92469]
The following patch rejects frame, argp and retarg registers (unless they are equal to hard frame pointer registers or if they aren't eliminable) from local or global register vars. These are just internal implementation details eliminated later into hard frame pointer or stack pointer and using them as register variable leads to numerous ICEs. 2020-12-13 Jakub Jelinek <jakub@redhat.com> PR target/92469 * varasm.c (eliminable_regno_p): New function. (make_decl_rtl): Reject asm vars for frame and argp if they are different from hard frame pointer. * gcc.target/i386/pr92469.c: New test. * gcc.target/i386/pr79804.c: Adjust expected diagnostics. * gcc.target/i386/pr88178.c: Expect an error.
Diffstat (limited to 'gcc/testsuite')
-rw-r--r--gcc/testsuite/gcc.target/i386/pr79804.c6
-rw-r--r--gcc/testsuite/gcc.target/i386/pr88178.c2
-rw-r--r--gcc/testsuite/gcc.target/i386/pr92469.c24
3 files changed, 28 insertions, 4 deletions
diff --git a/gcc/testsuite/gcc.target/i386/pr79804.c b/gcc/testsuite/gcc.target/i386/pr79804.c
index 08d1a3e..fcfcef7 100644
--- a/gcc/testsuite/gcc.target/i386/pr79804.c
+++ b/gcc/testsuite/gcc.target/i386/pr79804.c
@@ -4,7 +4,7 @@
void foo (void)
{
- register int r19 asm ("19");
+ register int r19 asm ("19"); /* { dg-error "register specified for 'r19' is an internal GCC implementation detail" } */
- asm volatile ("# %0" : "=r"(r19)); /* { dg-error "invalid use of register" } */
-} /* { dg-error "cannot be used in 'asm' here" } */
+ asm volatile ("# %0" : "=r"(r19));
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr88178.c b/gcc/testsuite/gcc.target/i386/pr88178.c
index a5fbd35..622e1c2 100644
--- a/gcc/testsuite/gcc.target/i386/pr88178.c
+++ b/gcc/testsuite/gcc.target/i386/pr88178.c
@@ -4,5 +4,5 @@
void foo (void)
{
- register int r19 asm ("19");
+ register int r19 asm ("19"); /* { dg-error "register specified for 'r19' is an internal GCC implementation detail" } */
}
diff --git a/gcc/testsuite/gcc.target/i386/pr92469.c b/gcc/testsuite/gcc.target/i386/pr92469.c
new file mode 100644
index 0000000..8cff36b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr92469.c
@@ -0,0 +1,24 @@
+/* PR target/92469 */
+/* { dg-do compile } */
+/* { dg-options "-O0" } */
+
+void
+foo (void)
+{
+ register int x asm ("frame"); /* { dg-error "register specified for 'x' is an internal GCC implementation detail" } */
+ int y = x;
+}
+
+void
+bar (void)
+{
+ register int x asm ("19"); /* { dg-error "register specified for 'x' is an internal GCC implementation detail" } */
+ int y = x;
+}
+
+void
+baz (void)
+{
+ register int x asm ("argp"); /* { dg-error "register specified for 'x' is an internal GCC implementation detail" } */
+ int y = x;
+}