mirror of https://github.com/microsoft/clang.git
[OpenCL] Allow half type kernel argument when cl_khr_fp16 is enabled
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@281915 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d121635fd9
commit
13934c8542
|
@ -7526,7 +7526,7 @@ enum OpenCLParamType {
|
|||
RecordKernelParam
|
||||
};
|
||||
|
||||
static OpenCLParamType getOpenCLKernelParameterType(QualType PT) {
|
||||
static OpenCLParamType getOpenCLKernelParameterType(Sema &S, QualType PT) {
|
||||
if (PT->isPointerType()) {
|
||||
QualType PointeeType = PT->getPointeeType();
|
||||
if (PointeeType->isPointerType())
|
||||
|
@ -7547,7 +7547,10 @@ static OpenCLParamType getOpenCLKernelParameterType(QualType PT) {
|
|||
if (PT->isEventT())
|
||||
return InvalidKernelParam;
|
||||
|
||||
if (PT->isHalfType())
|
||||
// OpenCL extension spec v1.2 s9.5:
|
||||
// This extension adds support for half scalar and vector types as built-in
|
||||
// types that can be used for arithmetic operations, conversions etc.
|
||||
if (!S.getOpenCLOptions().cl_khr_fp16 && PT->isHalfType())
|
||||
return InvalidKernelParam;
|
||||
|
||||
if (PT->isRecordType())
|
||||
|
@ -7568,7 +7571,7 @@ static void checkIsValidOpenCLKernelParameter(
|
|||
if (ValidTypes.count(PT.getTypePtr()))
|
||||
return;
|
||||
|
||||
switch (getOpenCLKernelParameterType(PT)) {
|
||||
switch (getOpenCLKernelParameterType(S, PT)) {
|
||||
case PtrPtrKernelParam:
|
||||
// OpenCL v1.2 s6.9.a:
|
||||
// A kernel function argument cannot be declared as a
|
||||
|
@ -7595,7 +7598,10 @@ static void checkIsValidOpenCLKernelParameter(
|
|||
// OpenCL v1.2 s6.8 n:
|
||||
// A kernel function argument cannot be declared
|
||||
// of event_t type.
|
||||
S.Diag(Param->getLocation(), diag::err_bad_kernel_param_type) << PT;
|
||||
// Do not diagnose half type since it is diagnosed as invalid argument
|
||||
// type for any function elsewhere.
|
||||
if (!PT->isHalfType())
|
||||
S.Diag(Param->getLocation(), diag::err_bad_kernel_param_type) << PT;
|
||||
D.setInvalidType();
|
||||
return;
|
||||
|
||||
|
@ -7651,7 +7657,7 @@ static void checkIsValidOpenCLKernelParameter(
|
|||
if (ValidTypes.count(QT.getTypePtr()))
|
||||
continue;
|
||||
|
||||
OpenCLParamType ParamType = getOpenCLKernelParameterType(QT);
|
||||
OpenCLParamType ParamType = getOpenCLKernelParameterType(S, QT);
|
||||
if (ParamType == ValidKernelParam)
|
||||
continue;
|
||||
|
||||
|
|
|
@ -25,6 +25,9 @@ half half_disabled(half *p, // expected-error{{declaring function return value o
|
|||
return h;
|
||||
}
|
||||
|
||||
kernel void half_disabled_kernel(global half *p,
|
||||
half h); // expected-error{{declaring function parameter of type 'half' is not allowed; did you forget * ?}}
|
||||
|
||||
// Exactly the same as above but with the cl_khr_fp16 extension enabled.
|
||||
#pragma OPENCL EXTENSION cl_khr_fp16 : enable
|
||||
constant half a = 1.0h;
|
||||
|
@ -48,3 +51,7 @@ half half_enabled(half *p, half h)
|
|||
|
||||
return h;
|
||||
}
|
||||
|
||||
kernel void half_enabled_kernel(global half *p,
|
||||
half h);
|
||||
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
// RUN: %clang_cc1 -fsyntax-only -verify %s -triple spir-unknown-unknown
|
||||
|
||||
kernel void half_arg(half x) { } // expected-error{{declaring function parameter of type 'half' is not allowed; did you forget * ?}}
|
||||
|
||||
#pragma OPENCL EXTENSION cl_khr_fp16 : enable
|
||||
|
||||
|
||||
|
@ -11,7 +13,8 @@
|
|||
|
||||
kernel void bool_arg(bool x) { } // expected-error{{'bool' cannot be used as the type of a kernel parameter}}
|
||||
|
||||
kernel void half_arg(half x) { } // expected-error{{'half' cannot be used as the type of a kernel parameter}}
|
||||
// half kernel argument is allowed when cl_khr_fp16 is enabled.
|
||||
kernel void half_arg(half x) { }
|
||||
|
||||
typedef struct ContainsBool // expected-note{{within field of type 'ContainsBool' declared here}}
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue