mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-02-09 10:55:03 +00:00
[OpenCL] Correct ndrange_t implementation
Removed ndrange_t as Clang builtin type and added as a struct type in the OpenCL header. Use type name to do the Sema checking in enqueue_kernel and modify IR generation accordingly. Review: D28058 Patch by Dmitry Borisenkov! llvm-svn: 295311
This commit is contained in:
parent
b1701e0b05
commit
58984e7087
@ -976,7 +976,7 @@ public:
|
||||
CanQualType SingletonId;
|
||||
#include "clang/Basic/OpenCLImageTypes.def"
|
||||
CanQualType OCLSamplerTy, OCLEventTy, OCLClkEventTy;
|
||||
CanQualType OCLQueueTy, OCLNDRangeTy, OCLReserveIDTy;
|
||||
CanQualType OCLQueueTy, OCLReserveIDTy;
|
||||
CanQualType OMPArraySectionTy;
|
||||
|
||||
// Types for deductions in C++0x [stmt.ranged]'s desugaring. Built on demand.
|
||||
|
@ -169,9 +169,6 @@ BUILTIN_TYPE(OCLClkEvent, OCLClkEventTy)
|
||||
// OpenCL queue_t.
|
||||
BUILTIN_TYPE(OCLQueue, OCLQueueTy)
|
||||
|
||||
// OpenCL ndrange_t.
|
||||
BUILTIN_TYPE(OCLNDRange, OCLNDRangeTy)
|
||||
|
||||
// OpenCL reserve_id_t.
|
||||
BUILTIN_TYPE(OCLReserveID, OCLReserveIDTy)
|
||||
|
||||
|
@ -1744,7 +1744,6 @@ public:
|
||||
bool isEventT() const; // OpenCL event_t
|
||||
bool isClkEventT() const; // OpenCL clk_event_t
|
||||
bool isQueueT() const; // OpenCL queue_t
|
||||
bool isNDRangeT() const; // OpenCL ndrange_t
|
||||
bool isReserveIDT() const; // OpenCL reserve_id_t
|
||||
|
||||
bool isPipeType() const; // OpenCL pipe type
|
||||
@ -5801,10 +5800,6 @@ inline bool Type::isQueueT() const {
|
||||
return isSpecificBuiltinType(BuiltinType::OCLQueue);
|
||||
}
|
||||
|
||||
inline bool Type::isNDRangeT() const {
|
||||
return isSpecificBuiltinType(BuiltinType::OCLNDRange);
|
||||
}
|
||||
|
||||
inline bool Type::isReserveIDT() const {
|
||||
return isSpecificBuiltinType(BuiltinType::OCLReserveID);
|
||||
}
|
||||
@ -5822,7 +5817,7 @@ inline bool Type::isPipeType() const {
|
||||
|
||||
inline bool Type::isOpenCLSpecificType() const {
|
||||
return isSamplerT() || isEventT() || isImageType() || isClkEventT() ||
|
||||
isQueueT() || isNDRangeT() || isReserveIDT() || isPipeType();
|
||||
isQueueT() || isReserveIDT() || isPipeType();
|
||||
}
|
||||
|
||||
inline bool Type::isTemplateTypeParmType() const {
|
||||
|
@ -803,14 +803,12 @@ namespace clang {
|
||||
PREDEF_TYPE_SAMPLER_ID = 39,
|
||||
/// \brief OpenCL queue type.
|
||||
PREDEF_TYPE_QUEUE_ID = 40,
|
||||
/// \brief OpenCL ndrange type.
|
||||
PREDEF_TYPE_NDRANGE_ID = 41,
|
||||
/// \brief OpenCL reserve_id type.
|
||||
PREDEF_TYPE_RESERVE_ID_ID = 42,
|
||||
PREDEF_TYPE_RESERVE_ID_ID = 41,
|
||||
/// \brief The placeholder type for OpenMP array section.
|
||||
PREDEF_TYPE_OMP_ARRAY_SECTION = 43,
|
||||
PREDEF_TYPE_OMP_ARRAY_SECTION = 42,
|
||||
/// \brief The '__float128' type
|
||||
PREDEF_TYPE_FLOAT128_ID = 44,
|
||||
PREDEF_TYPE_FLOAT128_ID = 43,
|
||||
/// \brief OpenCL image types with auto numeration
|
||||
#define IMAGE_TYPE(ImgType, Id, SingletonId, Access, Suffix) \
|
||||
PREDEF_TYPE_##Id##_ID,
|
||||
|
@ -1167,7 +1167,6 @@ void ASTContext::InitBuiltinTypes(const TargetInfo &Target,
|
||||
InitBuiltinType(OCLEventTy, BuiltinType::OCLEvent);
|
||||
InitBuiltinType(OCLClkEventTy, BuiltinType::OCLClkEvent);
|
||||
InitBuiltinType(OCLQueueTy, BuiltinType::OCLQueue);
|
||||
InitBuiltinType(OCLNDRangeTy, BuiltinType::OCLNDRange);
|
||||
InitBuiltinType(OCLReserveIDTy, BuiltinType::OCLReserveID);
|
||||
}
|
||||
|
||||
@ -1775,7 +1774,6 @@ TypeInfo ASTContext::getTypeInfoImpl(const Type *T) const {
|
||||
case BuiltinType::OCLEvent:
|
||||
case BuiltinType::OCLClkEvent:
|
||||
case BuiltinType::OCLQueue:
|
||||
case BuiltinType::OCLNDRange:
|
||||
case BuiltinType::OCLReserveID:
|
||||
// Currently these types are pointers to opaque types.
|
||||
Width = Target->getPointerWidth(0);
|
||||
@ -5945,7 +5943,6 @@ static char getObjCEncodingForPrimitiveKind(const ASTContext *C,
|
||||
case BuiltinType::OCLEvent:
|
||||
case BuiltinType::OCLClkEvent:
|
||||
case BuiltinType::OCLQueue:
|
||||
case BuiltinType::OCLNDRange:
|
||||
case BuiltinType::OCLReserveID:
|
||||
case BuiltinType::OCLSampler:
|
||||
case BuiltinType::Dependent:
|
||||
|
@ -7089,7 +7089,6 @@ static int EvaluateBuiltinClassifyType(const CallExpr *E,
|
||||
case BuiltinType::OCLEvent:
|
||||
case BuiltinType::OCLClkEvent:
|
||||
case BuiltinType::OCLQueue:
|
||||
case BuiltinType::OCLNDRange:
|
||||
case BuiltinType::OCLReserveID:
|
||||
case BuiltinType::Dependent:
|
||||
llvm_unreachable("CallExpr::isBuiltinClassifyType(): unimplemented type");
|
||||
|
@ -2500,9 +2500,6 @@ void CXXNameMangler::mangleType(const BuiltinType *T) {
|
||||
case BuiltinType::OCLQueue:
|
||||
Out << "9ocl_queue";
|
||||
break;
|
||||
case BuiltinType::OCLNDRange:
|
||||
Out << "11ocl_ndrange";
|
||||
break;
|
||||
case BuiltinType::OCLReserveID:
|
||||
Out << "13ocl_reserveid";
|
||||
break;
|
||||
|
@ -1800,10 +1800,6 @@ void MicrosoftCXXNameMangler::mangleType(const BuiltinType *T, Qualifiers,
|
||||
Out << "PA";
|
||||
mangleArtificalTagType(TTK_Struct, "ocl_queue");
|
||||
break;
|
||||
case BuiltinType::OCLNDRange:
|
||||
Out << "PA";
|
||||
mangleArtificalTagType(TTK_Struct, "ocl_ndrange");
|
||||
break;
|
||||
case BuiltinType::OCLReserveID:
|
||||
Out << "PA";
|
||||
mangleArtificalTagType(TTK_Struct, "ocl_reserveid");
|
||||
|
@ -453,7 +453,6 @@ NSAPI::getNSNumberFactoryMethodKind(QualType T) const {
|
||||
case BuiltinType::OCLEvent:
|
||||
case BuiltinType::OCLClkEvent:
|
||||
case BuiltinType::OCLQueue:
|
||||
case BuiltinType::OCLNDRange:
|
||||
case BuiltinType::OCLReserveID:
|
||||
case BuiltinType::BoundMember:
|
||||
case BuiltinType::Dependent:
|
||||
|
@ -2648,8 +2648,6 @@ StringRef BuiltinType::getName(const PrintingPolicy &Policy) const {
|
||||
return "clk_event_t";
|
||||
case OCLQueue:
|
||||
return "queue_t";
|
||||
case OCLNDRange:
|
||||
return "ndrange_t";
|
||||
case OCLReserveID:
|
||||
return "reserve_id_t";
|
||||
case OMPArraySection:
|
||||
@ -3661,7 +3659,6 @@ bool Type::canHaveNullability() const {
|
||||
case BuiltinType::OCLEvent:
|
||||
case BuiltinType::OCLClkEvent:
|
||||
case BuiltinType::OCLQueue:
|
||||
case BuiltinType::OCLNDRange:
|
||||
case BuiltinType::OCLReserveID:
|
||||
case BuiltinType::BuiltinFn:
|
||||
case BuiltinType::NullPtr:
|
||||
|
@ -340,7 +340,6 @@ TypeSpecifierType BuiltinTypeLoc::getWrittenTypeSpec() const {
|
||||
case BuiltinType::OCLEvent:
|
||||
case BuiltinType::OCLClkEvent:
|
||||
case BuiltinType::OCLQueue:
|
||||
case BuiltinType::OCLNDRange:
|
||||
case BuiltinType::OCLReserveID:
|
||||
case BuiltinType::BuiltinFn:
|
||||
case BuiltinType::OMPArraySection:
|
||||
|
@ -2529,13 +2529,14 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
|
||||
unsigned NumArgs = E->getNumArgs();
|
||||
|
||||
llvm::Type *QueueTy = ConvertType(getContext().OCLQueueTy);
|
||||
llvm::Type *RangeTy = ConvertType(getContext().OCLNDRangeTy);
|
||||
llvm::Type *GenericVoidPtrTy = Builder.getInt8PtrTy(
|
||||
getContext().getTargetAddressSpace(LangAS::opencl_generic));
|
||||
|
||||
llvm::Value *Queue = EmitScalarExpr(E->getArg(0));
|
||||
llvm::Value *Flags = EmitScalarExpr(E->getArg(1));
|
||||
llvm::Value *Range = EmitScalarExpr(E->getArg(2));
|
||||
LValue NDRangeL = EmitAggExprToLValue(E->getArg(2));
|
||||
llvm::Value *Range = NDRangeL.getAddress().getPointer();
|
||||
llvm::Type *RangeTy = NDRangeL.getAddress().getType();
|
||||
|
||||
if (NumArgs == 4) {
|
||||
// The most basic form of the call with parameters:
|
||||
@ -2548,8 +2549,16 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
|
||||
llvm::Value *Block = Builder.CreatePointerCast(
|
||||
EmitScalarExpr(E->getArg(3)), GenericVoidPtrTy);
|
||||
|
||||
return RValue::get(Builder.CreateCall(
|
||||
CGM.CreateRuntimeFunction(FTy, Name), {Queue, Flags, Range, Block}));
|
||||
AttrBuilder B;
|
||||
B.addAttribute(Attribute::ByVal);
|
||||
AttributeSet ByValAttrSet =
|
||||
AttributeSet::get(CGM.getModule().getContext(), 3U, B);
|
||||
|
||||
auto RTCall =
|
||||
Builder.CreateCall(CGM.CreateRuntimeFunction(FTy, Name, ByValAttrSet),
|
||||
{Queue, Flags, Range, Block});
|
||||
RTCall->setAttributes(ByValAttrSet);
|
||||
return RValue::get(RTCall);
|
||||
}
|
||||
assert(NumArgs >= 5 && "Invalid enqueue_kernel signature");
|
||||
|
||||
|
@ -582,8 +582,6 @@ llvm::DIType *CGDebugInfo::CreateType(const BuiltinType *BT) {
|
||||
return getOrCreateStructPtrType("opencl_clk_event_t", OCLClkEventDITy);
|
||||
case BuiltinType::OCLQueue:
|
||||
return getOrCreateStructPtrType("opencl_queue_t", OCLQueueDITy);
|
||||
case BuiltinType::OCLNDRange:
|
||||
return getOrCreateStructPtrType("opencl_ndrange_t", OCLNDRangeDITy);
|
||||
case BuiltinType::OCLReserveID:
|
||||
return getOrCreateStructPtrType("opencl_reserve_id_t", OCLReserveIDDITy);
|
||||
|
||||
|
@ -58,9 +58,6 @@ llvm::Type *CGOpenCLRuntime::convertOpenCLSpecificType(const Type *T) {
|
||||
case BuiltinType::OCLQueue:
|
||||
return llvm::PointerType::get(
|
||||
llvm::StructType::create(Ctx, "opencl.queue_t"), 0);
|
||||
case BuiltinType::OCLNDRange:
|
||||
return llvm::PointerType::get(
|
||||
llvm::StructType::create(Ctx, "opencl.ndrange_t"), 0);
|
||||
case BuiltinType::OCLReserveID:
|
||||
return llvm::PointerType::get(
|
||||
llvm::StructType::create(Ctx, "opencl.reserve_id_t"), 0);
|
||||
|
@ -472,7 +472,6 @@ llvm::Type *CodeGenTypes::ConvertType(QualType T) {
|
||||
case BuiltinType::OCLEvent:
|
||||
case BuiltinType::OCLClkEvent:
|
||||
case BuiltinType::OCLQueue:
|
||||
case BuiltinType::OCLNDRange:
|
||||
case BuiltinType::OCLReserveID:
|
||||
ResultType = CGM.getOpenCLRuntime().convertOpenCLSpecificType(Ty);
|
||||
break;
|
||||
|
@ -2637,7 +2637,6 @@ static bool TypeInfoIsInStandardLibrary(const BuiltinType *Ty) {
|
||||
case BuiltinType::OCLEvent:
|
||||
case BuiltinType::OCLClkEvent:
|
||||
case BuiltinType::OCLQueue:
|
||||
case BuiltinType::OCLNDRange:
|
||||
case BuiltinType::OCLReserveID:
|
||||
return false;
|
||||
|
||||
|
@ -16748,16 +16748,12 @@ typedef int clk_profiling_info;
|
||||
|
||||
#define MAX_WORK_DIM 3
|
||||
|
||||
// ToDo: Remove definition of ndrange_t in Clang as an opaque type and add back
|
||||
// the following ndrange_t definition.
|
||||
#if 0
|
||||
typedef struct {
|
||||
unsigned int workDimension;
|
||||
size_t globalWorkOffset[MAX_WORK_DIM];
|
||||
size_t globalWorkSize[MAX_WORK_DIM];
|
||||
size_t localWorkSize[MAX_WORK_DIM];
|
||||
} ndrange_t;
|
||||
#endif
|
||||
|
||||
ndrange_t __ovld ndrange_1D(size_t);
|
||||
ndrange_t __ovld ndrange_1D(size_t, size_t);
|
||||
|
@ -654,7 +654,6 @@ void USRGenerator::VisitType(QualType T) {
|
||||
case BuiltinType::OCLEvent:
|
||||
case BuiltinType::OCLClkEvent:
|
||||
case BuiltinType::OCLQueue:
|
||||
case BuiltinType::OCLNDRange:
|
||||
case BuiltinType::OCLReserveID:
|
||||
case BuiltinType::OCLSampler:
|
||||
IgnoreResults = true;
|
||||
|
@ -217,7 +217,6 @@ void Sema::Initialize() {
|
||||
if (getLangOpts().OpenCLVersion >= 200) {
|
||||
addImplicitTypedef("clk_event_t", Context.OCLClkEventTy);
|
||||
addImplicitTypedef("queue_t", Context.OCLQueueTy);
|
||||
addImplicitTypedef("ndrange_t", Context.OCLNDRangeTy);
|
||||
addImplicitTypedef("reserve_id_t", Context.OCLReserveIDTy);
|
||||
addImplicitTypedef("atomic_int", Context.getAtomicType(Context.IntTy));
|
||||
addImplicitTypedef("atomic_uint",
|
||||
|
@ -408,10 +408,10 @@ static bool SemaOpenCLBuiltinEnqueueKernel(Sema &S, CallExpr *TheCall) {
|
||||
}
|
||||
|
||||
// Third argument is always an ndrange_t type.
|
||||
if (!Arg2->getType()->isNDRangeT()) {
|
||||
if (Arg2->getType().getAsString() != "ndrange_t") {
|
||||
S.Diag(TheCall->getArg(2)->getLocStart(),
|
||||
diag::err_opencl_enqueue_kernel_expected_type)
|
||||
<< S.Context.OCLNDRangeTy;
|
||||
<< "'ndrange_t'";
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -147,9 +147,6 @@ serialization::TypeIdxFromBuiltin(const BuiltinType *BT) {
|
||||
case BuiltinType::OCLQueue:
|
||||
ID = PREDEF_TYPE_QUEUE_ID;
|
||||
break;
|
||||
case BuiltinType::OCLNDRange:
|
||||
ID = PREDEF_TYPE_NDRANGE_ID;
|
||||
break;
|
||||
case BuiltinType::OCLReserveID:
|
||||
ID = PREDEF_TYPE_RESERVE_ID_ID;
|
||||
break;
|
||||
|
@ -6378,9 +6378,6 @@ QualType ASTReader::GetType(TypeID ID) {
|
||||
case PREDEF_TYPE_QUEUE_ID:
|
||||
T = Context.OCLQueueTy;
|
||||
break;
|
||||
case PREDEF_TYPE_NDRANGE_ID:
|
||||
T = Context.OCLNDRangeTy;
|
||||
break;
|
||||
case PREDEF_TYPE_RESERVE_ID_ID:
|
||||
T = Context.OCLReserveIDTy;
|
||||
break;
|
||||
|
@ -2,6 +2,8 @@
|
||||
// RUN: %clang_cc1 %s -cl-std=CL2.0 -ffake-address-space-map -O0 -emit-llvm -o - -triple "spir64-unknown-unknown" | FileCheck %s --check-prefix=COMMON --check-prefix=B64
|
||||
|
||||
typedef void (^bl_t)(local void *);
|
||||
typedef struct {int a;} ndrange_t;
|
||||
|
||||
// N.B. The check here only exists to set BL_GLOBAL
|
||||
// COMMON: @block_G = addrspace(1) constant void (i8 addrspace(3)*) addrspace(4)* addrspacecast (void (i8 addrspace(3)*) addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* [[BL_GLOBAL:@__block_literal_global(\.[0-9]+)?]] to void (i8 addrspace(3)*) addrspace(1)*) to void (i8 addrspace(3)*) addrspace(4)*)
|
||||
const bl_t block_G = (bl_t) ^ (local void *a) {};
|
||||
@ -11,7 +13,7 @@ kernel void device_side_enqueue(global int *a, global int *b, int i) {
|
||||
queue_t default_queue;
|
||||
// COMMON: %flags = alloca i32
|
||||
unsigned flags = 0;
|
||||
// COMMON: %ndrange = alloca %opencl.ndrange_t*
|
||||
// COMMON: %ndrange = alloca %struct.ndrange_t
|
||||
ndrange_t ndrange;
|
||||
// COMMON: %clk_event = alloca %opencl.clk_event_t*
|
||||
clk_event_t clk_event;
|
||||
@ -20,12 +22,12 @@ kernel void device_side_enqueue(global int *a, global int *b, int i) {
|
||||
// COMMON: %event_wait_list2 = alloca [1 x %opencl.clk_event_t*]
|
||||
clk_event_t event_wait_list2[] = {clk_event};
|
||||
|
||||
// COMMON: [[NDR:%[a-z0-9]+]] = alloca %struct.ndrange_t, align 4
|
||||
// COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t{{.*}}*, %opencl.queue_t{{.*}}** %default_queue
|
||||
// COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags
|
||||
// COMMON: [[NDR:%[0-9]+]] = load %opencl.ndrange_t*, %opencl.ndrange_t** %ndrange
|
||||
// COMMON: [[BL:%[0-9]+]] = bitcast <{ i8*, i32, i32, i8*, %struct.__block_descriptor addrspace(2)*, i32{{.*}}, i32{{.*}}, i32{{.*}} }>* %block to void ()*
|
||||
// COMMON: [[BL_I8:%[0-9]+]] = addrspacecast void ()* [[BL]] to i8 addrspace(4)*
|
||||
// COMMON: call i32 @__enqueue_kernel_basic(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %opencl.ndrange_t* [[NDR]], i8 addrspace(4)* [[BL_I8]])
|
||||
// COMMON: call i32 @__enqueue_kernel_basic(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* byval [[NDR]]{{(.[0-9]+)?}}, i8 addrspace(4)* [[BL_I8]])
|
||||
enqueue_kernel(default_queue, flags, ndrange,
|
||||
^(void) {
|
||||
a[i] = b[i];
|
||||
@ -33,12 +35,11 @@ kernel void device_side_enqueue(global int *a, global int *b, int i) {
|
||||
|
||||
// COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t{{.*}}*, %opencl.queue_t{{.*}}** %default_queue
|
||||
// COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags
|
||||
// COMMON: [[NDR:%[0-9]+]] = load %opencl.ndrange_t*, %opencl.ndrange_t** %ndrange
|
||||
// COMMON: [[WAIT_EVNT:%[0-9]+]] = addrspacecast %opencl.clk_event_t{{.*}}** %event_wait_list to %opencl.clk_event_t{{.*}}* addrspace(4)*
|
||||
// COMMON: [[EVNT:%[0-9]+]] = addrspacecast %opencl.clk_event_t{{.*}}** %clk_event to %opencl.clk_event_t{{.*}}* addrspace(4)*
|
||||
// COMMON: [[BL:%[0-9]+]] = bitcast <{ i8*, i32, i32, i8*, %struct.__block_descriptor addrspace(2)*, i32{{.*}}, i32{{.*}}, i32{{.*}} }>* %block3 to void ()*
|
||||
// COMMON: [[BL_I8:%[0-9]+]] = addrspacecast void ()* [[BL]] to i8 addrspace(4)*
|
||||
// COMMON: call i32 @__enqueue_kernel_basic_events(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %opencl.ndrange_t* {{.*}}, i32 2, %opencl.clk_event_t{{.*}}* addrspace(4)* [[WAIT_EVNT]], %opencl.clk_event_t{{.*}}* addrspace(4)* [[EVNT]], i8 addrspace(4)* [[BL_I8]])
|
||||
// COMMON: call i32 @__enqueue_kernel_basic_events(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* {{.*}}, i32 2, %opencl.clk_event_t{{.*}}* addrspace(4)* [[WAIT_EVNT]], %opencl.clk_event_t{{.*}}* addrspace(4)* [[EVNT]], i8 addrspace(4)* [[BL_I8]])
|
||||
enqueue_kernel(default_queue, flags, ndrange, 2, &event_wait_list, &clk_event,
|
||||
^(void) {
|
||||
a[i] = b[i];
|
||||
@ -46,9 +47,8 @@ kernel void device_side_enqueue(global int *a, global int *b, int i) {
|
||||
|
||||
// COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t{{.*}}*, %opencl.queue_t{{.*}}** %default_queue
|
||||
// COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags
|
||||
// COMMON: [[NDR:%[0-9]+]] = load %opencl.ndrange_t*, %opencl.ndrange_t** %ndrange
|
||||
// B32: call i32 (%opencl.queue_t{{.*}}*, i32, %opencl.ndrange_t*, i8 addrspace(4)*, i32, ...) @__enqueue_kernel_vaargs(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %opencl.ndrange_t* [[NDR]], i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* @__block_literal_global{{(.[0-9]+)?}} to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i32 256)
|
||||
// B64: call i32 (%opencl.queue_t{{.*}}*, i32, %opencl.ndrange_t*, i8 addrspace(4)*, i32, ...) @__enqueue_kernel_vaargs(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %opencl.ndrange_t* [[NDR]], i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* @__block_literal_global{{(.[0-9]+)?}} to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i64 256)
|
||||
// B32: call i32 (%opencl.queue_t{{.*}}*, i32, %struct.ndrange_t*, i8 addrspace(4)*, i32, ...) @__enqueue_kernel_vaargs(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* [[NDR]]{{(.[0-9]+)?}}, i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* @__block_literal_global{{(.[0-9]+)?}} to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i32 256)
|
||||
// B64: call i32 (%opencl.queue_t{{.*}}*, i32, %struct.ndrange_t*, i8 addrspace(4)*, i32, ...) @__enqueue_kernel_vaargs(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* [[NDR]]{{(.[0-9]+)?}}, i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* @__block_literal_global{{(.[0-9]+)?}} to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i64 256)
|
||||
enqueue_kernel(default_queue, flags, ndrange,
|
||||
^(local void *p) {
|
||||
return;
|
||||
@ -57,11 +57,10 @@ kernel void device_side_enqueue(global int *a, global int *b, int i) {
|
||||
char c;
|
||||
// COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t{{.*}}*, %opencl.queue_t{{.*}}** %default_queue
|
||||
// COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags
|
||||
// COMMON: [[NDR:%[0-9]+]] = load %opencl.ndrange_t*, %opencl.ndrange_t** %ndrange
|
||||
// B32: [[SIZE:%[0-9]+]] = zext i8 {{%[0-9]+}} to i32
|
||||
// B32: call i32 (%opencl.queue_t{{.*}}*, i32, %opencl.ndrange_t*, i8 addrspace(4)*, i32, ...) @__enqueue_kernel_vaargs(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %opencl.ndrange_t* [[NDR]], i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* @__block_literal_global{{(.[0-9]+)?}} to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i32 [[SIZE]])
|
||||
// B32: call i32 (%opencl.queue_t{{.*}}*, i32, %struct.ndrange_t*, i8 addrspace(4)*, i32, ...) @__enqueue_kernel_vaargs(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* [[NDR]]{{(.[0-9]+)?}}, i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* @__block_literal_global{{(.[0-9]+)?}} to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i32 [[SIZE]])
|
||||
// B64: [[SIZE:%[0-9]+]] = zext i8 {{%[0-9]+}} to i64
|
||||
// B64: call i32 (%opencl.queue_t{{.*}}*, i32, %opencl.ndrange_t*, i8 addrspace(4)*, i32, ...) @__enqueue_kernel_vaargs(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %opencl.ndrange_t* [[NDR]], i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* @__block_literal_global{{(.[0-9]+)?}} to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i64 [[SIZE]])
|
||||
// B64: call i32 (%opencl.queue_t{{.*}}*, i32, %struct.ndrange_t*, i8 addrspace(4)*, i32, ...) @__enqueue_kernel_vaargs(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* [[NDR]]{{(.[0-9]+)?}}, i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* @__block_literal_global{{(.[0-9]+)?}} to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i64 [[SIZE]])
|
||||
enqueue_kernel(default_queue, flags, ndrange,
|
||||
^(local void *p) {
|
||||
return;
|
||||
@ -70,12 +69,11 @@ kernel void device_side_enqueue(global int *a, global int *b, int i) {
|
||||
|
||||
// COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t{{.*}}*, %opencl.queue_t{{.*}}** %default_queue
|
||||
// COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags
|
||||
// COMMON: [[NDR:%[0-9]+]] = load %opencl.ndrange_t*, %opencl.ndrange_t** %ndrange
|
||||
// COMMON: [[AD:%arraydecay[0-9]*]] = getelementptr inbounds [1 x %opencl.clk_event_t*], [1 x %opencl.clk_event_t*]* %event_wait_list2, i32 0, i32 0
|
||||
// COMMON: [[WAIT_EVNT:%[0-9]+]] = addrspacecast %opencl.clk_event_t{{.*}}** [[AD]] to %opencl.clk_event_t{{.*}}* addrspace(4)*
|
||||
// COMMON: [[EVNT:%[0-9]+]] = addrspacecast %opencl.clk_event_t{{.*}}** %clk_event to %opencl.clk_event_t{{.*}}* addrspace(4)*
|
||||
// B32: call i32 (%opencl.queue_t{{.*}}*, i32, %opencl.ndrange_t*, i32, %opencl.clk_event_t{{.*}}* addrspace(4)*, %opencl.clk_event_t{{.*}}* addrspace(4)*, i8 addrspace(4)*, i32, ...) @__enqueue_kernel_events_vaargs(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %opencl.ndrange_t* {{.*}}, i32 2, %opencl.clk_event_t{{.*}} [[WAIT_EVNT]], %opencl.clk_event_t{{.*}} [[EVNT]], i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* @__block_literal_global{{(.[0-9]+)?}} to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i32 256)
|
||||
// B64: call i32 (%opencl.queue_t{{.*}}*, i32, %opencl.ndrange_t*, i32, %opencl.clk_event_t{{.*}}* addrspace(4)*, %opencl.clk_event_t{{.*}}* addrspace(4)*, i8 addrspace(4)*, i32, ...) @__enqueue_kernel_events_vaargs(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %opencl.ndrange_t* {{.*}}, i32 2, %opencl.clk_event_t{{.*}} [[WAIT_EVNT]], %opencl.clk_event_t{{.*}} [[EVNT]], i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* @__block_literal_global{{(.[0-9]+)?}} to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i64 256)
|
||||
// B32: call i32 (%opencl.queue_t{{.*}}*, i32, %struct.ndrange_t*, i32, %opencl.clk_event_t{{.*}}* addrspace(4)*, %opencl.clk_event_t{{.*}}* addrspace(4)*, i8 addrspace(4)*, i32, ...) @__enqueue_kernel_events_vaargs(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* {{.*}}, i32 2, %opencl.clk_event_t{{.*}} [[WAIT_EVNT]], %opencl.clk_event_t{{.*}} [[EVNT]], i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* @__block_literal_global{{(.[0-9]+)?}} to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i32 256)
|
||||
// B64: call i32 (%opencl.queue_t{{.*}}*, i32, %struct.ndrange_t*, i32, %opencl.clk_event_t{{.*}}* addrspace(4)*, %opencl.clk_event_t{{.*}}* addrspace(4)*, i8 addrspace(4)*, i32, ...) @__enqueue_kernel_events_vaargs(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* {{.*}}, i32 2, %opencl.clk_event_t{{.*}} [[WAIT_EVNT]], %opencl.clk_event_t{{.*}} [[EVNT]], i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* @__block_literal_global{{(.[0-9]+)?}} to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i64 256)
|
||||
enqueue_kernel(default_queue, flags, ndrange, 2, event_wait_list2, &clk_event,
|
||||
^(local void *p) {
|
||||
return;
|
||||
@ -84,14 +82,13 @@ kernel void device_side_enqueue(global int *a, global int *b, int i) {
|
||||
|
||||
// COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t{{.*}}*, %opencl.queue_t{{.*}}** %default_queue
|
||||
// COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags
|
||||
// COMMON: [[NDR:%[0-9]+]] = load %opencl.ndrange_t*, %opencl.ndrange_t** %ndrange
|
||||
// COMMON: [[AD:%arraydecay[0-9]*]] = getelementptr inbounds [1 x %opencl.clk_event_t*], [1 x %opencl.clk_event_t*]* %event_wait_list2, i32 0, i32 0
|
||||
// COMMON: [[WAIT_EVNT:%[0-9]+]] = addrspacecast %opencl.clk_event_t{{.*}}** [[AD]] to %opencl.clk_event_t{{.*}}* addrspace(4)*
|
||||
// COMMON: [[EVNT:%[0-9]+]] = addrspacecast %opencl.clk_event_t{{.*}}** %clk_event to %opencl.clk_event_t{{.*}}* addrspace(4)*
|
||||
// B32: [[SIZE:%[0-9]+]] = zext i8 {{%[0-9]+}} to i32
|
||||
// B32: call i32 (%opencl.queue_t{{.*}}*, i32, %opencl.ndrange_t*, i32, %opencl.clk_event_t{{.*}}* addrspace(4)*, %opencl.clk_event_t{{.*}}* addrspace(4)*, i8 addrspace(4)*, i32, ...) @__enqueue_kernel_events_vaargs(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %opencl.ndrange_t* {{.*}}, i32 2, %opencl.clk_event_t{{.*}}* addrspace(4)* [[WAIT_EVNT]], %opencl.clk_event_t{{.*}}* addrspace(4)* [[EVNT]], i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* @__block_literal_global{{(.[0-9]+)?}} to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i32 [[SIZE]])
|
||||
// B32: call i32 (%opencl.queue_t{{.*}}*, i32, %struct.ndrange_t*, i32, %opencl.clk_event_t{{.*}}* addrspace(4)*, %opencl.clk_event_t{{.*}}* addrspace(4)*, i8 addrspace(4)*, i32, ...) @__enqueue_kernel_events_vaargs(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* {{.*}}, i32 2, %opencl.clk_event_t{{.*}}* addrspace(4)* [[WAIT_EVNT]], %opencl.clk_event_t{{.*}}* addrspace(4)* [[EVNT]], i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* @__block_literal_global{{(.[0-9]+)?}} to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i32 [[SIZE]])
|
||||
// B64: [[SIZE:%[0-9]+]] = zext i8 {{%[0-9]+}} to i64
|
||||
// B64: call i32 (%opencl.queue_t{{.*}}*, i32, %opencl.ndrange_t*, i32, %opencl.clk_event_t{{.*}}* addrspace(4)*, %opencl.clk_event_t{{.*}}* addrspace(4)*, i8 addrspace(4)*, i32, ...) @__enqueue_kernel_events_vaargs(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %opencl.ndrange_t* {{.*}}, i32 2, %opencl.clk_event_t{{.*}}* addrspace(4)* [[WAIT_EVNT]], %opencl.clk_event_t{{.*}}* addrspace(4)* [[EVNT]], i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* @__block_literal_global{{(.[0-9]+)?}} to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i64 [[SIZE]])
|
||||
// B64: call i32 (%opencl.queue_t{{.*}}*, i32, %struct.ndrange_t*, i32, %opencl.clk_event_t{{.*}}* addrspace(4)*, %opencl.clk_event_t{{.*}}* addrspace(4)*, i8 addrspace(4)*, i32, ...) @__enqueue_kernel_events_vaargs(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* {{.*}}, i32 2, %opencl.clk_event_t{{.*}}* addrspace(4)* [[WAIT_EVNT]], %opencl.clk_event_t{{.*}}* addrspace(4)* [[EVNT]], i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* @__block_literal_global{{(.[0-9]+)?}} to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i64 [[SIZE]])
|
||||
enqueue_kernel(default_queue, flags, ndrange, 2, event_wait_list2, &clk_event,
|
||||
^(local void *p) {
|
||||
return;
|
||||
@ -101,11 +98,10 @@ kernel void device_side_enqueue(global int *a, global int *b, int i) {
|
||||
long l;
|
||||
// COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t{{.*}}*, %opencl.queue_t{{.*}}** %default_queue
|
||||
// COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags
|
||||
// COMMON: [[NDR:%[0-9]+]] = load %opencl.ndrange_t*, %opencl.ndrange_t** %ndrange
|
||||
// B32: [[SIZE:%[0-9]+]] = trunc i64 {{%[0-9]+}} to i32
|
||||
// B32: call i32 (%opencl.queue_t{{.*}}*, i32, %opencl.ndrange_t*, i8 addrspace(4)*, i32, ...) @__enqueue_kernel_vaargs(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %opencl.ndrange_t* [[NDR]], i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* @__block_literal_global{{(.[0-9]+)?}} to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i32 [[SIZE]])
|
||||
// B32: call i32 (%opencl.queue_t{{.*}}*, i32, %struct.ndrange_t*, i8 addrspace(4)*, i32, ...) @__enqueue_kernel_vaargs(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* [[NDR]]{{(.[0-9]+)?}}, i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* @__block_literal_global{{(.[0-9]+)?}} to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i32 [[SIZE]])
|
||||
// B64: [[SIZE:%[0-9]+]] = load i64, i64* %l
|
||||
// B64: call i32 (%opencl.queue_t{{.*}}*, i32, %opencl.ndrange_t*, i8 addrspace(4)*, i32, ...) @__enqueue_kernel_vaargs(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %opencl.ndrange_t* [[NDR]], i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* @__block_literal_global{{(.[0-9]+)?}} to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i64 [[SIZE]])
|
||||
// B64: call i32 (%opencl.queue_t{{.*}}*, i32, %struct.ndrange_t*, i8 addrspace(4)*, i32, ...) @__enqueue_kernel_vaargs(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* [[NDR]]{{(.[0-9]+)?}}, i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* @__block_literal_global{{(.[0-9]+)?}} to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i64 [[SIZE]])
|
||||
enqueue_kernel(default_queue, flags, ndrange,
|
||||
^(local void *p) {
|
||||
return;
|
||||
@ -114,9 +110,8 @@ kernel void device_side_enqueue(global int *a, global int *b, int i) {
|
||||
|
||||
// COMMON: [[DEF_Q:%[0-9]+]] = load %opencl.queue_t*, %opencl.queue_t** %default_queue
|
||||
// COMMON: [[FLAGS:%[0-9]+]] = load i32, i32* %flags
|
||||
// COMMON: [[NDR:%[0-9]+]] = load %opencl.ndrange_t*, %opencl.ndrange_t** %ndrange
|
||||
// B32: call i32 (%opencl.queue_t{{.*}}*, i32, %opencl.ndrange_t*, i8 addrspace(4)*, i32, ...) @__enqueue_kernel_vaargs(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %opencl.ndrange_t* [[NDR]], i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* @__block_literal_global{{(.[0-9]+)?}} to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i32 0)
|
||||
// B64: call i32 (%opencl.queue_t{{.*}}*, i32, %opencl.ndrange_t*, i8 addrspace(4)*, i32, ...) @__enqueue_kernel_vaargs(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %opencl.ndrange_t* [[NDR]], i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* @__block_literal_global{{(.[0-9]+)?}} to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i64 4294967296)
|
||||
// B32: call i32 (%opencl.queue_t{{.*}}*, i32, %struct.ndrange_t*, i8 addrspace(4)*, i32, ...) @__enqueue_kernel_vaargs(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* [[NDR]]{{(.[0-9]+)?}}, i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* @__block_literal_global{{(.[0-9]+)?}} to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i32 0)
|
||||
// B64: call i32 (%opencl.queue_t{{.*}}*, i32, %struct.ndrange_t*, i8 addrspace(4)*, i32, ...) @__enqueue_kernel_vaargs(%opencl.queue_t{{.*}}* [[DEF_Q]], i32 [[FLAGS]], %struct.ndrange_t* [[NDR]]{{(.[0-9]+)?}}, i8 addrspace(4)* addrspacecast (i8 addrspace(1)* bitcast ({ i8**, i32, i32, i8*, %struct.__block_descriptor addrspace(2)* } addrspace(1)* @__block_literal_global{{(.[0-9]+)?}} to i8 addrspace(1)*) to i8 addrspace(4)*), i32 1, i64 4294967296)
|
||||
enqueue_kernel(default_queue, flags, ndrange,
|
||||
^(local void *p) {
|
||||
return;
|
||||
|
@ -1,5 +1,5 @@
|
||||
// RUN: %clang_cc1 -triple spir-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s | FileCheck %s
|
||||
// RUN: %clang_cc1 -triple spir-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.1| FileCheck %s
|
||||
// RUN: %clang_cc1 -O0 -triple spir-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s| FileCheck %s
|
||||
// RUN: %clang_cc1 -O0 -triple spir-unknown-unknown -internal-isystem ../../lib/Headers -include opencl-c.h -emit-llvm -o - %s -cl-std=CL1.1| FileCheck %s
|
||||
|
||||
// Test including the default header as a module.
|
||||
// The module should be compiled only once and loaded from cache afterwards.
|
||||
@ -25,26 +25,28 @@
|
||||
|
||||
// ===
|
||||
// Compile for OpenCL 2.0 for the first time. The module should change.
|
||||
// RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm -o - -cl-std=CL2.0 -finclude-default-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -fdisable-module-hash -ftime-report %s 2>&1 | FileCheck --check-prefix=CHECK20 --check-prefix=CHECK-MOD %s
|
||||
// RUN: %clang_cc1 -triple spir-unknown-unknown -O0 -emit-llvm -o - -cl-std=CL2.0 -finclude-default-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -fdisable-module-hash -ftime-report %s 2>&1 | FileCheck --check-prefix=CHECK20 --check-prefix=CHECK-MOD %s
|
||||
// RUN: not diff %t/1_0.pcm %t/opencl_c.pcm
|
||||
// RUN: chmod u-w %t/opencl_c.pcm
|
||||
|
||||
// ===
|
||||
// Compile for OpenCL 2.0 for the second time. The module should not change.
|
||||
// RUN: %clang_cc1 -triple spir-unknown-unknown -emit-llvm -o - -cl-std=CL2.0 -finclude-default-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -fdisable-module-hash -ftime-report %s 2>&1 | FileCheck --check-prefix=CHECK20 --check-prefix=CHECK-MOD %s
|
||||
// RUN: %clang_cc1 -triple spir-unknown-unknown -O0 -emit-llvm -o - -cl-std=CL2.0 -finclude-default-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -fdisable-module-hash -ftime-report %s 2>&1 | FileCheck --check-prefix=CHECK20 --check-prefix=CHECK-MOD %s
|
||||
|
||||
// Check cached module works for different OpenCL versions.
|
||||
// RUN: rm -rf %t
|
||||
// RUN: mkdir -p %t
|
||||
// RUN: %clang_cc1 -triple spir64-unknown-unknown -emit-llvm -o - -cl-std=CL1.2 -finclude-default-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -ftime-report %s 2>&1 | FileCheck --check-prefix=CHECK --check-prefix=CHECK-MOD %s
|
||||
// RUN: %clang_cc1 -triple amdgcn--amdhsa -emit-llvm -o - -cl-std=CL2.0 -finclude-default-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -ftime-report %s 2>&1 | FileCheck --check-prefix=CHECK20 --check-prefix=CHECK-MOD %s
|
||||
// RUN: %clang_cc1 -triple amdgcn--amdhsa -O0 -emit-llvm -o - -cl-std=CL2.0 -finclude-default-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -ftime-report %s 2>&1 | FileCheck --check-prefix=CHECK20 --check-prefix=CHECK-MOD %s
|
||||
// RUN: chmod u-w %t
|
||||
// RUN: %clang_cc1 -triple spir64-unknown-unknown -emit-llvm -o - -cl-std=CL1.2 -finclude-default-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -ftime-report %s 2>&1 | FileCheck --check-prefix=CHECK --check-prefix=CHECK-MOD %s
|
||||
// RUN: %clang_cc1 -triple amdgcn--amdhsa -emit-llvm -o - -cl-std=CL2.0 -finclude-default-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -ftime-report %s 2>&1 | FileCheck --check-prefix=CHECK20 --check-prefix=CHECK-MOD %s
|
||||
// RUN: %clang_cc1 -triple amdgcn--amdhsa -O0 -emit-llvm -o - -cl-std=CL2.0 -finclude-default-header -fmodules -fimplicit-module-maps -fmodules-cache-path=%t -ftime-report %s 2>&1 | FileCheck --check-prefix=CHECK20 --check-prefix=CHECK-MOD %s
|
||||
// RUN: chmod u+w %t
|
||||
|
||||
// Verify that called builtins occur in the generated IR.
|
||||
|
||||
// CHECK-NOT: ndrange_t
|
||||
// CHECK20: ndrange_t
|
||||
// CHECK: _Z16convert_char_rtec
|
||||
// CHECK-NOT: _Z3ctzc
|
||||
// CHECK20: _Z3ctzc
|
||||
@ -52,11 +54,9 @@
|
||||
char f(char x) {
|
||||
#if __OPENCL_C_VERSION__ != CL_VERSION_2_0
|
||||
return convert_char_rte(x);
|
||||
#ifdef NO_HEADER
|
||||
//expected-warning@-2{{implicit declaration of function 'convert_char_rte' is invalid in C99}}
|
||||
#endif //NO_HEADER
|
||||
|
||||
#else //__OPENCL_C_VERSION__
|
||||
ndrange_t t;
|
||||
return ctz(x);
|
||||
#endif //__OPENCL_C_VERSION__
|
||||
}
|
||||
|
@ -32,9 +32,6 @@ typedef clk_event_t clkevt_t;
|
||||
// queue_t
|
||||
typedef queue_t q_t;
|
||||
|
||||
// ndrange_t
|
||||
typedef ndrange_t range_t;
|
||||
|
||||
// reserve_id_t
|
||||
typedef reserve_id_t reserveid_t;
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
// RUN: %clang_cc1 %s -cl-std=CL2.0 -triple "spir-unknown-unknown" -verify -pedantic -fsyntax-only -DB32
|
||||
// RUN: %clang_cc1 %s -cl-std=CL2.0 -triple "spir64-unknown-unknown" -verify -pedantic -fsyntax-only -Wconversion -DWCONV
|
||||
|
||||
typedef struct {int a;} ndrange_t;
|
||||
// Diagnostic tests for different overloads of enqueue_kernel from Table 6.13.17.1 of OpenCL 2.0 Spec.
|
||||
kernel void enqueue_kernel_tests() {
|
||||
queue_t default_queue;
|
||||
|
@ -1493,7 +1493,6 @@ bool CursorVisitor::VisitBuiltinTypeLoc(BuiltinTypeLoc TL) {
|
||||
case BuiltinType::OCLEvent:
|
||||
case BuiltinType::OCLClkEvent:
|
||||
case BuiltinType::OCLQueue:
|
||||
case BuiltinType::OCLNDRange:
|
||||
case BuiltinType::OCLReserveID:
|
||||
#define BUILTIN_TYPE(Id, SingletonId)
|
||||
#define SIGNED_TYPE(Id, SingletonId) case BuiltinType::Id:
|
||||
|
Loading…
x
Reference in New Issue
Block a user