teak-llvm/clang/test/CodeGenCXX/x86_64-arguments-avx.cpp
Tim Northover c46827c7ed LLVM IR: Generate new-style byval-with-Type from Clang
LLVM IR recently added a Type parameter to the byval Attribute, so that
when pointers become opaque and no longer have an element type the
information will still be present in IR.

For now the Type parameter is optional (which is why Clang didn't need
this change at the time), but it will become mandatory soon.

llvm-svn: 362652
2019-06-05 21:12:14 +00:00

62 lines
1.2 KiB
C++

// 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;
};
// CHECK: define <4 x double> @_ZN5test14testENS_7PR22753E(<4 x double>
PR22753 test(PR22753 x) {
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;
}
}
namespace test3 {
union U {
__attribute__((__vector_size__(32))) float f1;
int f2;
};
// CHECK: define i32 @_ZN5test31fENS_1UE({{.*}}* byval({{.*}}) align 32
int f(U u) { return u.f2; }
}