Commit eca72963 by Jakub Jelinek Committed by Jakub Jelinek

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
parent 43014633
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
......
/* 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':
......
/* 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);
......
/* 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);
......
......@@ -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
......
/* 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;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment