aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernd Schmidt <bernds@redhat.com>2016-01-07 12:17:39 +0000
committerBernd Schmidt <bernds@gcc.gnu.org>2016-01-07 12:17:39 +0000
commit7e33d4dc9e35aa31ecfde6ed68f8d5e66eb19446 (patch)
tree95a4fa39ad8cc714d4165a4489fe0289d2b92704
parentc6a0add9d0a23aaf7ba32ae4416da8170c4f0dce (diff)
downloadgcc-7e33d4dc9e35aa31ecfde6ed68f8d5e66eb19446.zip
gcc-7e33d4dc9e35aa31ecfde6ed68f8d5e66eb19446.tar.gz
gcc-7e33d4dc9e35aa31ecfde6ed68f8d5e66eb19446.tar.bz2
Fix SSA inconsistencies with invalid asm reg names (PR67639)
PR middle-end/67639 * varasm.c (make_decl_rtl): Mark invalid register vars as DECL_EXTERNAL. testsuite/ PR middle-end/67639 * c-c++-common/pr67639.c: New test. From-SVN: r232125
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/c-c++-common/pr67639.c8
-rw-r--r--gcc/varasm.c3
4 files changed, 20 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 62ad159..21a95fd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
2015-12-15 Bernd Schmidt <bschmidt@redhat.com>
+ PR middle-end/67639
+ * varasm.c (make_decl_rtl): Mark invalid register vars as
+ DECL_EXTERNAL.
+
PR rtl-optimization/66206
* bt-load.c (find_btr_use): Change first arg to be a pointer to an rtx.
All callers changed.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index e21b718..2989421 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-12-15 Bernd Schmidt <bschmidt@redhat.com>
+
+ PR middle-end/67639
+ * c-c++-common/pr67639.c: New test.
+
2016-01-07 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/69141
diff --git a/gcc/testsuite/c-c++-common/pr67639.c b/gcc/testsuite/c-c++-common/pr67639.c
new file mode 100644
index 0000000..aa19ba4
--- /dev/null
+++ b/gcc/testsuite/c-c++-common/pr67639.c
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+void
+foo (int p)
+{
+ int t;
+ register long x asm ("rhubarb") = p; /* { dg-error "register name" } */
+ __asm ("" : "=r" (t), "=r" (t), "=r" (t), "=r" (x) : "0" (x));
+}
diff --git a/gcc/varasm.c b/gcc/varasm.c
index e0c1fd8..3a3573e 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -1420,6 +1420,9 @@ make_decl_rtl (tree decl)
specifications. */
SET_DECL_ASSEMBLER_NAME (decl, NULL_TREE);
DECL_HARD_REGISTER (decl) = 0;
+ /* Also avoid SSA inconsistencies by pretending this is an external
+ decl now. */
+ DECL_EXTERNAL (decl) = 1;
return;
}
/* Now handle ordinary static variables and functions (in memory).