2015-03-03 00:09:24 +08:00
|
|
|
// RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm -o - %s -target-feature +avx | FileCheck %s
|
|
|
|
|
|
|
|
namespace test1 {
|
|
|
|
typedef double __m256d __attribute__((__vector_size__(32)));
|
|
|
|
|
|
|
|
class PR22753 {
|
|
|
|
public:
|
|
|
|
__m256d data;
|
|
|
|
};
|
|
|
|
|
2020-02-04 02:09:39 +08:00
|
|
|
// CHECK: define <4 x double> @_ZN5test14testENS_7PR22753E(<4 x double>
|
2015-03-03 00:09:24 +08:00
|
|
|
PR22753 test(PR22753 x) {
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
}
|
[x86-64 ABI] Fix for PR23082: an assertion failure when passing/returning a wrapper union in a full YMM register.
This patch fixes an assertion failure in method
'X86_64ABIInfo::GetByteVectorType'.
Method 'GetByteVectorType' (in TargetInfo.cpp) is responsible
for mapping a QualType 'Ty' (for an argument or return value) to an LLVM IR
type that, according to the ABI, must be passed in a XMM/YMM vector register.
When selecting the IR vector type, method 'GetByteVectorType' always tries to
choose the "best" IR vector type for the 'Ty' in input. In particular, if Ty
is a wrapper structure, it keeps unwrapping it until it finds a vector type VTy.
That VTy is the "preferred IR type".
However, function 'isSingleElementStructure' (used to unwrap structures) does
not know how to look through union types. So, before this patch, if Ty was in
a nest of wrapper structures with at least two union types, we would have
triggered an assertion failure (added at revision 230971).
With this patch, if method 'GetByteVectorType' fails to find the preferred
vector type, we just return a valid (although potentially 'less friendly')
vector type based on the type size. So, rather than asserting on an 'unexpected'
'Ty' in input, we conservatively return vector type <2 x double> if Ty is 16
bytes, or <4 x double> if Ty is 32 bytes.
Differential Revision: http://reviews.llvm.org/D10190
llvm-svn: 238861
2015-06-03 03:34:40 +08:00
|
|
|
|
|
|
|
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;
|
|
|
|
};
|
|
|
|
|
2020-02-04 02:09:39 +08:00
|
|
|
// CHECK: define <2 x double> @_ZN5test27PR23082ENS_3UU1E(<2 x double>
|
[x86-64 ABI] Fix for PR23082: an assertion failure when passing/returning a wrapper union in a full YMM register.
This patch fixes an assertion failure in method
'X86_64ABIInfo::GetByteVectorType'.
Method 'GetByteVectorType' (in TargetInfo.cpp) is responsible
for mapping a QualType 'Ty' (for an argument or return value) to an LLVM IR
type that, according to the ABI, must be passed in a XMM/YMM vector register.
When selecting the IR vector type, method 'GetByteVectorType' always tries to
choose the "best" IR vector type for the 'Ty' in input. In particular, if Ty
is a wrapper structure, it keeps unwrapping it until it finds a vector type VTy.
That VTy is the "preferred IR type".
However, function 'isSingleElementStructure' (used to unwrap structures) does
not know how to look through union types. So, before this patch, if Ty was in
a nest of wrapper structures with at least two union types, we would have
triggered an assertion failure (added at revision 230971).
With this patch, if method 'GetByteVectorType' fails to find the preferred
vector type, we just return a valid (although potentially 'less friendly')
vector type based on the type size. So, rather than asserting on an 'unexpected'
'Ty' in input, we conservatively return vector type <2 x double> if Ty is 16
bytes, or <4 x double> if Ty is 32 bytes.
Differential Revision: http://reviews.llvm.org/D10190
llvm-svn: 238861
2015-06-03 03:34:40 +08:00
|
|
|
UU1 PR23082(UU1 x) {
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
|
|
|
|
union U2 {
|
|
|
|
__m256 v1;
|
|
|
|
__m256d v2;
|
|
|
|
};
|
|
|
|
|
|
|
|
union UU2 {
|
|
|
|
union U2;
|
|
|
|
__m256d v3;
|
|
|
|
};
|
|
|
|
|
2020-02-04 02:09:39 +08:00
|
|
|
// CHECK: define <4 x double> @_ZN5test27PR23082ENS_3UU2E(<4 x double>
|
[x86-64 ABI] Fix for PR23082: an assertion failure when passing/returning a wrapper union in a full YMM register.
This patch fixes an assertion failure in method
'X86_64ABIInfo::GetByteVectorType'.
Method 'GetByteVectorType' (in TargetInfo.cpp) is responsible
for mapping a QualType 'Ty' (for an argument or return value) to an LLVM IR
type that, according to the ABI, must be passed in a XMM/YMM vector register.
When selecting the IR vector type, method 'GetByteVectorType' always tries to
choose the "best" IR vector type for the 'Ty' in input. In particular, if Ty
is a wrapper structure, it keeps unwrapping it until it finds a vector type VTy.
That VTy is the "preferred IR type".
However, function 'isSingleElementStructure' (used to unwrap structures) does
not know how to look through union types. So, before this patch, if Ty was in
a nest of wrapper structures with at least two union types, we would have
triggered an assertion failure (added at revision 230971).
With this patch, if method 'GetByteVectorType' fails to find the preferred
vector type, we just return a valid (although potentially 'less friendly')
vector type based on the type size. So, rather than asserting on an 'unexpected'
'Ty' in input, we conservatively return vector type <2 x double> if Ty is 16
bytes, or <4 x double> if Ty is 32 bytes.
Differential Revision: http://reviews.llvm.org/D10190
llvm-svn: 238861
2015-06-03 03:34:40 +08:00
|
|
|
UU2 PR23082(UU2 x) {
|
|
|
|
return x;
|
|
|
|
}
|
|
|
|
}
|
2015-07-08 13:07:05 +08:00
|
|
|
|
|
|
|
namespace test3 {
|
|
|
|
union U {
|
|
|
|
__attribute__((__vector_size__(32))) float f1;
|
|
|
|
int f2;
|
|
|
|
};
|
2020-02-04 02:09:39 +08:00
|
|
|
// CHECK: define i32 @_ZN5test31fENS_1UE({{.*}}* byval({{.*}}) align 32
|
2015-07-08 13:07:05 +08:00
|
|
|
int f(U u) { return u.f2; }
|
|
|
|
}
|