On 11/7/18 11:36 AM, Jeff Law wrote: > OK with this change. Before I commit, how about I add the following test cases to test both valid and invalid asm constraints? I think I have the reg numbers for the other architectures defined correctly.
Peter gcc/testsuite/ PR rtl-optimization/87600 * gcc.dg/pr87600.h: New. * gcc.dg/pr87600-1.c: Likewise. * gcc.dg/pr87600-2.c: Likewise. Index: gcc/testsuite/gcc.dg/pr87600.h =================================================================== --- gcc/testsuite/gcc.dg/pr87600.h (nonexistent) +++ gcc/testsuite/gcc.dg/pr87600.h (working copy) @@ -0,0 +1,19 @@ +#if defined (__aarch64__) +# define REG1 "x0" +# define REG2 "x1" +#elif defined (__arm__) +# define REG1 "r0" +# define REG2 "r1" +#elif defined (__i386__) +# define REG1 "%eax" +# define REG2 "%edx" +#elif defined (__powerpc__) +# define REG1 "r3" +# define REG2 "r4" +#elif defined (__s390__) +# define REG1 "0" +# define REG2 "1" +#elif defined (__x86_64__) +# define REG1 "rax" +# define REG2 "rdx" +#endif Index: gcc/testsuite/gcc.dg/pr87600-1.c =================================================================== --- gcc/testsuite/gcc.dg/pr87600-1.c (nonexistent) +++ gcc/testsuite/gcc.dg/pr87600-1.c (working copy) @@ -0,0 +1,52 @@ +/* PR rtl-optimization/87600 */ +/* { dg-do compile { target aarch64*-*-* arm*-*-* i?86-*-* powerpc*-*-* s390*-*-* x86_64-*-* } } */ +/* { dg-options "-O2" } */ + +#include "pr87600.h" + +/* The following are all valid uses of local register variables. */ + +long +test0 (long arg) +{ + register long var asm (REG1); + asm ("blah %0 %1" : "+&r" (var) : "r" (arg)); + return var; +} + +long +test1 (long arg0, long arg1) +{ + register long var asm (REG1); + asm ("blah %0, %1, %2" : "=&r" (var) : "r" (arg0), "0" (arg1)); + return var + arg1; +} + +long +test2 (void) +{ + register long var1 asm (REG1); + register long var2 asm (REG1); + asm ("blah %0 %1" : "=&r" (var1) : "0" (var2)); + return var1; +} + +long +test3 (void) +{ + register long var1 asm (REG1); + register long var2 asm (REG2); + long var3; + asm ("blah %0 %1" : "=&r" (var1), "=r" (var3) : "1" (var2)); + return var1 + var3; +} + +long +test4 (void) +{ + register long var1 asm (REG1); + register long var2 asm (REG2); + register long var3 asm (REG2); + asm ("blah %0 %1" : "=&r" (var1), "=r" (var2) : "1" (var3)); + return var1; +} Index: gcc/testsuite/gcc.dg/pr87600-2.c =================================================================== --- gcc/testsuite/gcc.dg/pr87600-2.c (nonexistent) +++ gcc/testsuite/gcc.dg/pr87600-2.c (working copy) @@ -0,0 +1,44 @@ +/* PR rtl-optimization/87600 */ +/* { dg-do compile { target aarch64*-*-* arm*-*-* i?86-*-* powerpc*-*-* s390*-*-* x86_64-*-* } } */ +/* { dg-options "-O2" } */ + +#include "pr87600.h" + +/* The following are all invalid uses of local register variables. */ + +long +test0 (void) +{ + register long var1 asm (REG1); + register long var2 asm (REG1); + asm ("blah %0 %1" : "=r" (var1), "=r" (var2)); /* { dg-error "invalid hard register usage between output operands" } */ + return var1; +} + +long +test1 (void) +{ + register long var1 asm (REG1); + register long var2 asm (REG2); + asm ("blah %0 %1" : "=r" (var1) : "0" (var2)); /* { dg-error "invalid hard register usage between output operand and matching constraint operand" } */ + return var1; +} + +long +test2 (void) +{ + register long var1 asm (REG1); + register long var2 asm (REG1); + asm ("blah %0 %1" : "=&r" (var1) : "r" (var2)); /* { dg-error "invalid hard register usage between earlyclobber operand and input operand" } */ + return var1; +} + +long +test3 (void) +{ + register long var1 asm (REG1); + register long var2 asm (REG1); + long var3; + asm ("blah %0 %1" : "=&r" (var1), "=r" (var3) : "1" (var2)); /* { dg-error "invalid hard register usage between earlyclobber operand and input operand" } */ + return var1 + var3; +}