Index: clang/lib/Basic/Targets/X86.cpp =================================================================== --- clang/lib/Basic/Targets/X86.cpp +++ clang/lib/Basic/Targets/X86.cpp @@ -1779,14 +1779,17 @@ LLVM_FALLTHROUGH; case 'v': case 'x': - if (SSELevel >= AVX512F) - // 512-bit zmm registers can be used if target supports AVX512F. - return Size <= 512U; - else if (SSELevel >= AVX) - // 256-bit ymm registers can be used if target supports AVX. - return Size <= 256U; - return Size <= 128U; - + return Size <= 512U; +// FIXME: We should check the size based on the SSE level, but that requires +// supporting the target attribute. The X86 backend seems to tolerate large +// sizes and will produce an error message. +// if (SSELevel >= AVX512F) +// // 512-bit zmm registers can be used if target supports AVX512F. +// return Size <= 512U; +// else if (SSELevel >= AVX) +// // 256-bit ymm registers can be used if target supports AVX. +// return Size <= 256U; +// return Size <= 128U; } return true; Index: clang/test/CodeGen/x86_32-inline-asm.c =================================================================== --- clang/test/CodeGen/x86_32-inline-asm.c +++ clang/test/CodeGen/x86_32-inline-asm.c @@ -46,7 +46,7 @@ __asm__ volatile("foo1 %0" : : "f" (val256)); // expected-error {{invalid input size for constraint 'f'}} __asm__ volatile("foo1 %0" : : "t" (val256)); // expected-error {{invalid input size for constraint 't'}} __asm__ volatile("foo1 %0" : : "u" (val256)); // expected-error {{invalid input size for constraint 'u'}} - __asm__ volatile("foo1 %0" : : "x" (val512)); // expected-error {{invalid input size for constraint 'x'}} + __asm__ volatile("foo1 %0" : : "x" (val512)); // No error. __asm__ volatile("foo1 %0" : "=R" (val)); // expected-error {{invalid output size for constraint '=R'}} __asm__ volatile("foo1 %0" : "=q" (val)); // expected-error {{invalid output size for constraint '=q'}} @@ -60,13 +60,8 @@ __asm__ volatile("foo1 %0" : "=A" (val128)); // expected-error {{invalid output size for constraint '=A'}} __asm__ volatile("foo1 %0" : "=t" (val256)); // expected-error {{invalid output size for constraint '=t'}} __asm__ volatile("foo1 %0" : "=u" (val256)); // expected-error {{invalid output size for constraint '=u'}} - __asm__ volatile("foo1 %0" : "=x" (val512)); // expected-error {{invalid output size for constraint '=x'}} + __asm__ volatile("foo1 %0" : "=x" (val512)); // No error. -#ifdef __AVX__ __asm__ volatile("foo1 %0" : : "x" (val256)); // No error. __asm__ volatile("foo1 %0" : "=x" (val256)); // No error. -#else - __asm__ volatile("foo1 %0" : : "x" (val256)); // expected-error {{invalid input size for constraint 'x'}} - __asm__ volatile("foo1 %0" : "=x" (val256)); // expected-error {{invalid output size for constraint '=x'}} -#endif } Index: clang/test/CodeGen/x86_64-PR42672.c =================================================================== --- clang/test/CodeGen/x86_64-PR42672.c +++ clang/test/CodeGen/x86_64-PR42672.c @@ -100,7 +100,7 @@ #endif } -// CHECK-IMPOSSIBLE_X: invalid output size for constraint +// CHECK-IMPOSSIBLE_X: impossible constraint in asm: can't store value into a register // http://crbug.com/999160 // Clang used to report the following message: