This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix check_asm_operands (PR inline-asm/39058)
- From: Richard Guenther <richard dot guenther at gmail dot com>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Mon, 2 Feb 2009 14:19:42 +0100
- Subject: Re: [PATCH] Fix check_asm_operands (PR inline-asm/39058)
- References: <20090202131101.GN5690@tyan-ft48-01.lab.bos.redhat.com>
On Mon, Feb 2, 2009 at 2:11 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> check_asm_operands doesn't check operands with matching constraints,
> unless the constraint is "%N" or "N" for N [0-9]. E.g.
> "0,0" or "15" constraints are not checked at all.
> Fixed by looking up the matching constraint in asm_operand_ok rather
> than in the caller if the caller provided constraints array to
> it.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux.
> Ok for trunk?
Ok.
Thanks,
Richard.
> 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.
>
> * gcc.target/i386/pr39058.c: New test.
>
> --- gcc/recog.h.jj 2008-10-23 13:21:40.000000000 +0200
> +++ gcc/recog.h 2009-02-02 11:40:33.000000000 +0100
> @@ -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);
> --- gcc/recog.c.jj 2008-12-19 10:19:36.000000000 +0100
> +++ gcc/recog.c 2009-02-02 11:49:57.000000000 +0100
> @@ -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 *oper
> 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 *cons
>
> 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':
> --- gcc/stmt.c.jj 2008-10-23 13:21:41.000000000 +0200
> +++ gcc/stmt.c 2009-02-02 11:39:33.000000000 +0100
> @@ -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 o
> 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);
> --- gcc/testsuite/gcc.target/i386/pr39058.c.jj 2009-02-02 11:48:18.000000000 +0100
> +++ gcc/testsuite/gcc.target/i386/pr39058.c 2009-02-02 11:47:48.000000000 +0100
> @@ -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;
> +}
>
> Jakub
>