aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2006-02-18 19:58:42 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2006-02-18 19:58:42 +0100
commit3f2de3dcf930e5fb85df3d6f89a6faac8d6c5367 (patch)
treeecded0b3d9d01c7860ed19b11cbd0101a48394bd /gcc
parent3891cee2305bb50ede9598793afbedc761f6bcd7 (diff)
downloadgcc-3f2de3dcf930e5fb85df3d6f89a6faac8d6c5367.zip
gcc-3f2de3dcf930e5fb85df3d6f89a6faac8d6c5367.tar.gz
gcc-3f2de3dcf930e5fb85df3d6f89a6faac8d6c5367.tar.bz2
re PR middle-end/26334 (ICE in lhd_set_decl_assembler_name)
PR middle-end/26334 * stmt.c (decl_overlaps_hard_reg_set_p): Use DECL_HARD_REGISTER instead of DECL_REGISTER. * gcc.c-torture/compile/20060217-1.c: New test. * gcc.dg/20060218-1.c: New test. From-SVN: r111247
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/stmt.c6
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/20060217-1.c25
-rw-r--r--gcc/testsuite/gcc.dg/20060218-1.c8
5 files changed, 48 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6bc87a0..d2d83e5 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2006-02-18 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/26334
+ * stmt.c (decl_overlaps_hard_reg_set_p): Use DECL_HARD_REGISTER
+ instead of DECL_REGISTER.
+
2006-02-18 Olivier Hainque <hainque@adacore.com>
PR ada/13408
diff --git a/gcc/stmt.c b/gcc/stmt.c
index be19216..38a7f90 100644
--- a/gcc/stmt.c
+++ b/gcc/stmt.c
@@ -567,9 +567,9 @@ decl_overlaps_hard_reg_set_p (tree *declp, int *walk_subtrees ATTRIBUTE_UNUSED,
tree decl = *declp;
const HARD_REG_SET *regs = data;
- if (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == PARM_DECL)
+ if (TREE_CODE (decl) == VAR_DECL)
{
- if (DECL_REGISTER (decl)
+ if (DECL_HARD_REGISTER (decl)
&& REG_P (DECL_RTL (decl))
&& REGNO (DECL_RTL (decl)) < FIRST_PSEUDO_REGISTER)
{
@@ -585,7 +585,7 @@ decl_overlaps_hard_reg_set_p (tree *declp, int *walk_subtrees ATTRIBUTE_UNUSED,
}
walk_subtrees = 0;
}
- else if (TYPE_P (decl))
+ else if (TYPE_P (decl) || TREE_CODE (decl) == PARM_DECL)
walk_subtrees = 0;
return NULL_TREE;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 7040443..b0fc353 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2006-02-18 Jakub Jelinek <jakub@redhat.com>
+
+ PR middle-end/26334
+ * gcc.c-torture/compile/20060217-1.c: New test.
+ * gcc.dg/20060218-1.c: New test.
+
2006-02-18 Joseph S. Myers <joseph@codesourcery.com>
* gcc.dg/glibc-uclibc-1.c, gcc.dg/glibc-uclibc-2.c: New tests.
diff --git a/gcc/testsuite/gcc.c-torture/compile/20060217-1.c b/gcc/testsuite/gcc.c-torture/compile/20060217-1.c
new file mode 100644
index 0000000..c447142b
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/20060217-1.c
@@ -0,0 +1,25 @@
+/* PR middle-end/26334 */
+
+struct U
+{
+ unsigned int u[256];
+};
+
+struct S
+{
+ int u, v, w, x;
+ int s[255];
+};
+
+int
+foo (struct U *x, struct S *y)
+{
+ register int i;
+ for (i = 0; i < 255; i++)
+ {
+ unsigned int v;
+ __asm__ ("" : "=r" (v) : "0" (x->u[i + 1]) : "cc");
+ y->s[i] = v;
+ }
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.dg/20060218-1.c b/gcc/testsuite/gcc.dg/20060218-1.c
new file mode 100644
index 0000000..b94cbd8
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/20060218-1.c
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+
+void
+foo (void)
+{
+ register int cc __asm ("cc"); /* { dg-error "invalid register name" } */
+ __asm ("" : : "r" (cc) : "cc");
+}