This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix check_asm_operands (PR inline-asm/39058)


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
>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]