// RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -target-feature +avx512fp16 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-C
// RUN: %clang_cc1 -triple x86_64-linux -emit-llvm -target-feature +avx512fp16 -x c++ -std=c++11 < %s | FileCheck %s --check-prefixes=CHECK,CHECK-CPP
struct half1 {
_Float16 a;
};
struct half1 h1(_Float16 a) {
// CHECK: define{{.*}}half @
struct half1 x;
x.a = a;
return x;
}
struct half2 {
_Float16 a;
_Float16 b;
};
struct half2 h2(_Float16 a, _Float16 b) {
// CHECK: define{{.*}}<2 x half> @
struct half2 x;
x.a = a;
x.b = b;
return x;
}
struct half3 {
_Float16 a;
_Float16 b;
_Float16 c;
};
struct half3 h3(_Float16 a, _Float16 b, _Float16 c) {
// CHECK: define{{.*}}<4 x half> @
struct half3 x;
x.a = a;
x.b = b;
x.c = c;
return x;
}
struct half4 {
_Float16 a;
_Float16 b;
_Float16 c;
_Float16 d;
};
struct half4 h4(_Float16 a, _Float16 b, _Float16 c, _Float16 d) {
// CHECK: define{{.*}}<4 x half> @
struct half4 x;
x.a = a;
x.b = b;
x.c = c;
x.d = d;
return x;
}
struct floathalf {
float a;
_Float16 b;
};
struct floathalf fh(float a, _Float16 b) {
// CHECK: define{{.*}}<4 x half> @
struct floathalf x;
x.a = a;
x.b = b;
return x;
}
struct floathalf2 {
float a;
_Float16 b;
_Float16 c;
};
struct floathalf2 fh2(float a, _Float16 b, _Float16 c) {
// CHECK: define{{.*}}<4 x half> @
struct floathalf2 x;
x.a = a;
x.b = b;
x.c = c;
return x;
}
struct halffloat {
_Float16 a;
float b;
};
struct halffloat hf(_Float16 a, float b) {
// CHECK: define{{.*}}<4 x half> @
struct halffloat x;
x.a = a;
x.b = b;
return x;
}
struct half2float {
_Float16 a;
_Float16 b;
float c;
};
struct half2float h2f(_Float16 a, _Float16 b, float c) {
// CHECK: define{{.*}}<4 x half> @
struct half2float x;
x.a = a;
x.b = b;
x.c = c;
return x;
}
struct floathalf3 {
float a;
_Float16 b;
_Float16 c;
_Float16 d;
};
struct floathalf3 fh3(float a, _Float16 b, _Float16 c, _Float16 d) {
// CHECK: define{{.*}}{ <4 x half>, half } @
struct floathalf3 x;
x.a = a;
x.b = b;
x.c = c;
x.d = d;
return x;
}
struct half5 {
_Float16 a;
_Float16 b;
_Float16 c;
_Float16 d;
_Float16 e;
};
struct half5 h5(_Float16 a, _Float16 b, _Float16 c, _Float16 d, _Float16 e) {
// CHECK: define{{.*}}{ <4 x half>, half } @
struct half5 x;
x.a = a;
x.b = b;
x.c = c;
x.d = d;
x.e = e;
return x;
}
struct float2 {
struct {} s;
float a;
float b;
};
float pr51813(struct float2 s) {
// CHECK-C: define{{.*}} @pr51813(<2 x float>
// CHECK-CPP: define{{.*}} @_Z7pr518136float2(double {{.*}}, float
return s.a;
}
struct float3 {
float a;
struct {} s;
float b;
};
float pr51813_2(struct float3 s) {
// CHECK-C: define{{.*}} @pr51813_2(<2 x float>
// CHECK-CPP: define{{.*}} @_Z9pr51813_26float3(double {{.*}}, float
return s.a;
}
struct shalf2 {
struct {} s;
_Float16 a;
_Float16 b;
};
_Float16 sf2(struct shalf2 s) {
// CHECK-C: define{{.*}} @sf2(<2 x half>
// CHECK-CPP: define{{.*}} @_Z3sf26shalf2(double {{.*}}
return s.a;
};
struct halfs2 {
_Float16 a;
struct {} s1;
_Float16 b;
struct {} s2;
};
_Float16 fs2(struct shalf2 s) {
// CHECK-C: define{{.*}} @fs2(<2 x half>
// CHECK-CPP: define{{.*}} @_Z3fs26shalf2(double {{.*}}
return s.a;
};
struct fsd {
float a;
struct {};
double b;
};
struct fsd pr52011(void) {
// CHECK: define{{.*}} { float, double } @
}
struct hsd {
_Float16 a;
struct {};
double b;
};
struct hsd pr52011_2(void) {
// CHECK: define{{.*}} { half, double } @
}
struct hsf {
_Float16 a;
struct {};
float b;
};
struct hsf pr52011_3(void) {
// CHECK: define{{.*}} <4 x half> @
}
struct fds {
float a;
double b;
struct {};
};
struct fds pr52011_4(void) {
// CHECK-C: define{{.*}} { float, double } @pr52011_4
// CHECK-CPP: define{{.*}} void @_Z9pr52011_4v({{.*}} sret
}