From: Jakub Jelinek Date: Sat, 18 Feb 2006 18:58:42 +0000 (+0100) Subject: re PR middle-end/26334 (ICE in lhd_set_decl_assembler_name) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3f2de3dcf930e5fb85df3d6f89a6faac8d6c5367;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6bc87a08959..d2d83e5940f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2006-02-18 Jakub Jelinek + + 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 PR ada/13408 diff --git a/gcc/stmt.c b/gcc/stmt.c index be192169e00..38a7f909e1b 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 7040443cf2e..b0fc3536f7d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2006-02-18 Jakub Jelinek + + 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 * 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 00000000000..c447142bc55 --- /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 00000000000..b94cbd8c91d --- /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"); +}