From 7e33d4dc9e35aa31ecfde6ed68f8d5e66eb19446 Mon Sep 17 00:00:00 2001 From: Bernd Schmidt Date: Thu, 7 Jan 2016 12:17:39 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 4 ++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/c-c++-common/pr67639.c | 8 ++++++++ gcc/varasm.c | 3 +++ 4 files changed, 20 insertions(+) create mode 100644 gcc/testsuite/c-c++-common/pr67639.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 62ad1590969..21a95fd1ca4 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2015-12-15 Bernd Schmidt + 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 e21b7188c4f..29894213bcc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-12-15 Bernd Schmidt + + PR middle-end/67639 + * c-c++-common/pr67639.c: New test. + 2016-01-07 Jakub Jelinek 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 00000000000..aa19ba4eda3 --- /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 e0c1fd89f26..3a3573e5395 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).