re PR middle-end/26334 (ICE in lhd_set_decl_assembler_name)
authorJakub Jelinek <jakub@redhat.com>
Sat, 18 Feb 2006 18:58:42 +0000 (19:58 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Sat, 18 Feb 2006 18:58:42 +0000 (19:58 +0100)
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

gcc/ChangeLog
gcc/stmt.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20060217-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/20060218-1.c [new file with mode: 0644]

index 6bc87a089595891596a2b61aada9de5adc85a9fe..d2d83e5940f5c1de9054eddcb078f31c42ae0efe 100644 (file)
@@ -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
index be192169e004358c331a4708e02e40d177a5972d..38a7f909e1b282bf028b05f91836d49cde80175c 100644 (file)
@@ -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;
 }
index 7040443cf2e01a101deb5d6b328aac8e021f52d8..b0fc3536f7d083d5fe7a937bbb0a36509faf816b 100644 (file)
@@ -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 (file)
index 0000000..c447142
--- /dev/null
@@ -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 (file)
index 0000000..b94cbd8
--- /dev/null
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+
+void
+foo (void)
+{
+  register int cc __asm ("cc"); /* { dg-error "invalid register name" } */
+  __asm ("" : : "r" (cc) : "cc");
+}