Index: cfe/trunk/lib/CodeGen/TargetInfo.cpp =================================================================== --- cfe/trunk/lib/CodeGen/TargetInfo.cpp +++ cfe/trunk/lib/CodeGen/TargetInfo.cpp @@ -2227,9 +2227,16 @@ Ty = QualType(InnerTy, 0); llvm::Type *IRType = CGT.ConvertType(Ty); - assert(isa(IRType) && - "Trying to return a non-vector type in a vector register!"); - return IRType; + if(isa(IRType)) + return IRType; + + // We couldn't find the preferred IR vector type for 'Ty'. + uint64_t Size = getContext().getTypeSize(Ty); + assert((Size == 128 || Size == 256) && "Invalid type found!"); + + // Return a LLVM IR vector type based on the size of 'Ty'. + return llvm::VectorType::get(llvm::Type::getDoubleTy(getVMContext()), + Size / 64); } /// BitsContainNoUserData - Return true if the specified [start,end) bit range Index: cfe/trunk/test/CodeGenCXX/x86_64-arguments-avx.cpp =================================================================== --- cfe/trunk/test/CodeGenCXX/x86_64-arguments-avx.cpp +++ cfe/trunk/test/CodeGenCXX/x86_64-arguments-avx.cpp @@ -13,3 +13,40 @@ return x; } } + +namespace test2 { +typedef double __m128d __attribute__((__vector_size__(16))); +typedef float __m128 __attribute__((__vector_size__(16))); +typedef double __m256d __attribute__((__vector_size__(32))); +typedef float __m256 __attribute__((__vector_size__(32))); + +union U1 { + __m128 v1; + __m128d v2; +}; + +union UU1 { + union U1; + __m128d v3; +}; + +// CHECK: define <2 x double> @_ZN5test27PR23082ENS_3UU1E(<2 x double> +UU1 PR23082(UU1 x) { + return x; +} + +union U2 { + __m256 v1; + __m256d v2; +}; + +union UU2 { + union U2; + __m256d v3; +}; + +// CHECK: define <4 x double> @_ZN5test27PR23082ENS_3UU2E(<4 x double> +UU2 PR23082(UU2 x) { + return x; +} +}