recog.c (verfiy_changes): Disallow renaming of hard regs in inline asms for register asm ("") declarations.
2009-03-09 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> * recog.c (verfiy_changes): Disallow renaming of hard regs in inline asms for register asm ("") declarations. 2009-03-09 Andreas Krebbel <Andreas.Krebbel@de.ibm.com> * gcc.target/s390/20090223-1.c: New testcase. From-SVN: r144726
This commit is contained in:
parent
1803581d76
commit
929b7fc3c0
@ -1,3 +1,8 @@
|
||||
2009-03-09 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
|
||||
|
||||
* recog.c (verfiy_changes): Disallow renaming of hard regs in
|
||||
inline asms for register asm ("") declarations.
|
||||
|
||||
2009-03-09 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* fold-const.c (fold_unary): Fix comment.
|
||||
|
10
gcc/recog.c
10
gcc/recog.c
@ -379,6 +379,16 @@ verify_changes (int num)
|
||||
if (! memory_address_p (GET_MODE (object), XEXP (object, 0)))
|
||||
break;
|
||||
}
|
||||
else if (REG_P (changes[i].old)
|
||||
&& asm_noperands (PATTERN (object)) > 0
|
||||
&& REG_EXPR (changes[i].old) != NULL_TREE
|
||||
&& DECL_ASSEMBLER_NAME_SET_P (REG_EXPR (changes[i].old))
|
||||
&& DECL_REGISTER (REG_EXPR (changes[i].old)))
|
||||
{
|
||||
/* Don't allow changes of hard register operands to inline
|
||||
assemblies if they have been defined as register asm ("x"). */
|
||||
break;
|
||||
}
|
||||
else if (insn_invalid_p (object))
|
||||
{
|
||||
rtx pat = PATTERN (object);
|
||||
|
@ -1,3 +1,7 @@
|
||||
2009-03-09 Andreas Krebbel <Andreas.Krebbel@de.ibm.com>
|
||||
|
||||
* gcc.target/s390/20090223-1.c: New testcase.
|
||||
|
||||
2009-03-08 Jerry DeLisle <jvdelisle@gcc.gnu.org>
|
||||
|
||||
PR libfortran/39402
|
||||
|
60
gcc/testsuite/gcc.target/s390/20090223-1.c
Normal file
60
gcc/testsuite/gcc.target/s390/20090223-1.c
Normal file
@ -0,0 +1,60 @@
|
||||
/* The RTL loop optimizer used to replace the output register of the
|
||||
inline assembly with a pseudo although the variable is declared as
|
||||
register asm ("0"). */
|
||||
|
||||
/* { dg-do run } */
|
||||
/* { dg-options "-O2" } */
|
||||
|
||||
extern void abort (void);
|
||||
|
||||
static unsigned char __attribute__ ((always_inline))
|
||||
mytoupper (unsigned char c)
|
||||
{
|
||||
if (c >= 'a' && c <= 'z')
|
||||
c -= 'a' - 'A';
|
||||
return c;
|
||||
}
|
||||
|
||||
static unsigned long __attribute__ ((always_inline))
|
||||
strlen (const char *s)
|
||||
{
|
||||
register unsigned long r0 asm ("0");
|
||||
const char *tmp = s;
|
||||
|
||||
asm (
|
||||
#ifdef __s390x__
|
||||
" lghi %0, 0\n"
|
||||
#else
|
||||
" lhi %0, 0\n"
|
||||
#endif
|
||||
"0:srst %0,%1\n"
|
||||
" jo 0b"
|
||||
: "=d" (r0), "+a" (tmp)
|
||||
:
|
||||
:"cc");
|
||||
return r0 - (unsigned long) s;
|
||||
}
|
||||
|
||||
char boot_command_line[] = "this is a test";
|
||||
|
||||
void __attribute__ ((noinline))
|
||||
foo (char *str)
|
||||
{
|
||||
if (strcmp (str, "THIS IS A TEST") != 0)
|
||||
abort ();
|
||||
}
|
||||
|
||||
int
|
||||
main ()
|
||||
{
|
||||
char upper_command_line[1024];
|
||||
int i;
|
||||
|
||||
for (i = 0; i < strlen (boot_command_line); i++)
|
||||
upper_command_line[i] = mytoupper (boot_command_line[i]);
|
||||
|
||||
upper_command_line[strlen (boot_command_line)] = 0;
|
||||
foo (upper_command_line);
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue
Block a user