diff options
author | Jakub Jelinek <jakub@redhat.com> | 2009-02-02 14:23:43 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2009-02-02 14:23:43 +0100 |
commit | eca72963aad838236301cfed220a41f8b4fa6b60 (patch) | |
tree | a1aa96b3278b1c873c7432d2ad53d27e983ec85a | |
parent | 43014633b0b9f0e3d2646b6c4ecd75d3830a18b2 (diff) | |
download | gcc-eca72963aad838236301cfed220a41f8b4fa6b60.zip gcc-eca72963aad838236301cfed220a41f8b4fa6b60.tar.gz gcc-eca72963aad838236301cfed220a41f8b4fa6b60.tar.bz2 |
re PR inline-asm/39058 (ICE with double in inline-asm)
PR inline-asm/39058
* recog.h (asm_operand_ok): Add constraints argument.
* recog.c (asm_operand_ok): Likewise. If it is set, for digits
recurse on matching constraint.
(check_asm_operands): Pass constraints as 3rd argument to
asm_operand_ok. Don't look up matching constraint here.
* stmt.c (expand_asm_operands): Pass NULL as 3rd argument
to asm_operand_ok.
* gcc.target/i386/pr39058.c: New test.
From-SVN: r143867
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/recog.c | 41 | ||||
-rw-r--r-- | gcc/recog.h | 4 | ||||
-rw-r--r-- | gcc/stmt.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr39058.c | 34 |
6 files changed, 78 insertions, 19 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4951744..a4c777c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +2009-02-02 Jakub Jelinek <jakub@redhat.com> + + PR inline-asm/39058 + * recog.h (asm_operand_ok): Add constraints argument. + * recog.c (asm_operand_ok): Likewise. If it is set, for digits + recurse on matching constraint. + (check_asm_operands): Pass constraints as 3rd argument to + asm_operand_ok. Don't look up matching constraint here. + * stmt.c (expand_asm_operands): Pass NULL as 3rd argument + to asm_operand_ok. + 2009-02-02 Ben Elliston <bje@au.ibm.com> * doc/tm.texi (Storage Layout): Fix TARGET_ALIGN_ANON_BITFIELD and diff --git a/gcc/recog.c b/gcc/recog.c index 0e2dd1b..540617d 100644 --- a/gcc/recog.c +++ b/gcc/recog.c @@ -1,6 +1,6 @@ /* Subroutines used by or related to instruction recognition. Copyright (C) 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998 - 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 + 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. This file is part of GCC. @@ -156,10 +156,7 @@ check_asm_operands (rtx x) const char *c = constraints[i]; if (c[0] == '%') c++; - if (ISDIGIT ((unsigned char) c[0]) && c[1] == '\0') - c = constraints[c[0] - '0']; - - if (! asm_operand_ok (operands[i], c)) + if (! asm_operand_ok (operands[i], c, constraints)) return 0; } @@ -1547,7 +1544,7 @@ decode_asm_operands (rtx body, rtx *operands, rtx **operand_locs, Return > 0 if ok, = 0 if bad, < 0 if inconclusive. */ int -asm_operand_ok (rtx op, const char *constraint) +asm_operand_ok (rtx op, const char *constraint, const char **constraints) { int result = 0; @@ -1575,15 +1572,29 @@ asm_operand_ok (rtx op, const char *constraint) case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': - /* For best results, our caller should have given us the - proper matching constraint, but we can't actually fail - the check if they didn't. Indicate that results are - inconclusive. */ - do - constraint++; - while (ISDIGIT (*constraint)); - if (! result) - result = -1; + /* If caller provided constraints pointer, look up + the maching constraint. Otherwise, our caller should have + given us the proper matching constraint, but we can't + actually fail the check if they didn't. Indicate that + results are inconclusive. */ + if (constraints) + { + char *end; + unsigned long match; + + match = strtoul (constraint, &end, 10); + if (!result) + result = asm_operand_ok (op, constraints[match], NULL); + constraint = (const char *) end; + } + else + { + do + constraint++; + while (ISDIGIT (*constraint)); + if (! result) + result = -1; + } continue; case 'p': diff --git a/gcc/recog.h b/gcc/recog.h index 9b73211..f2b1f6e 100644 --- a/gcc/recog.h +++ b/gcc/recog.h @@ -1,6 +1,6 @@ /* Declarations for interface to insn recognizer and insn-output.c. Copyright (C) 1987, 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, - 2005, 2006, 2007 Free Software Foundation, Inc. + 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. This file is part of GCC. @@ -72,7 +72,7 @@ struct operand_alternative extern void init_recog (void); extern void init_recog_no_volatile (void); extern int check_asm_operands (rtx); -extern int asm_operand_ok (rtx, const char *); +extern int asm_operand_ok (rtx, const char *, const char **); extern bool validate_change (rtx, rtx *, rtx, bool); extern bool validate_unshare_change (rtx, rtx *, rtx, bool); extern bool canonicalize_change_group (rtx insn, rtx x); @@ -1,6 +1,6 @@ /* Expands front end tree to back end RTL for GCC Copyright (C) 1987, 1988, 1989, 1992, 1993, 1994, 1995, 1996, 1997, - 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 + 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. This file is part of GCC. @@ -886,7 +886,7 @@ expand_asm_operands (tree string, tree outputs, tree inputs, else if (MEM_P (op)) op = validize_mem (op); - if (asm_operand_ok (op, constraint) <= 0) + if (asm_operand_ok (op, constraint, NULL) <= 0) { if (allows_reg && TYPE_MODE (type) != BLKmode) op = force_reg (TYPE_MODE (type), op); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c659971a..828af3f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -4,6 +4,9 @@ (check_effective_target_correct_iso_cpp_string_wchar_protos): New. * g++.dg/ext/builtin10.C: New test. + PR inline-asm/39058 + * gcc.target/i386/pr39058.c: New test. + 2009-02-02 Richard Guenther <rguenther@suse.de> PR tree-optimization/38937 diff --git a/gcc/testsuite/gcc.target/i386/pr39058.c b/gcc/testsuite/gcc.target/i386/pr39058.c new file mode 100644 index 0000000..2982e8d --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr39058.c @@ -0,0 +1,34 @@ +/* PR inline-asm/39058 */ +/* { dg-options "-O2" } */ + +double +f1 () +{ + double x; + asm ("" : "=r,r" (x) : "0,0" (x)); + return x; +} + +double +f2 () +{ + double x; + asm ("" : "=r" (x) : "0" (x)); + return x; +} + +double +f3 () +{ + double x, y; + asm ("" : "=r,r" (x), "=r,r" (y) : "%0,0" (x), "r,r" (0)); + return x; +} + +double +f4 () +{ + double x, y; + asm ("" : "=r" (x), "=r" (y) : "0" (x), "r" (0)); + return x; +} |