r232631 - OpenCL: CL2.0 atomic types
NAKAMURA Takumi
geek4civic at gmail.com
Wed Mar 18 08:17:03 PDT 2015
I guess till the morning CST :) Appeased in r232638.
I suggest the testcase might be split to 32-bit and 64-bit.
2015-03-19 0:06 GMT+09:00 Anastasia Stulova <anastasia.stulova at arm.com>:
> Investigating the fix now.
>
> What's is the acceptable latency for repair?
>
> -----Original Message-----
> From: NAKAMURA Takumi [mailto:geek4civic at gmail.com]
> Sent: 18 March 2015 14:54
> To: Anastasia Stulova
> Cc: cfe-commits
> Subject: Re: r232631 - OpenCL: CL2.0 atomic types
>
> The test fails for targeting 32-bit i686-* and hexagon-*
>
> 2015-03-18 21:55 GMT+09:00 Anastasia Stulova <anastasia.stulova at arm.com>:
>> Author: stulova
>> Date: Wed Mar 18 07:55:29 2015
>> New Revision: 232631
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=232631&view=rev
>> Log:
>> OpenCL: CL2.0 atomic types
>>
>> OpenCL C Spec v2.0 Section 6.13.11
>>
>> - Made c11 _Atomic being not accepted for OpenCL
>>
>> - Implemented CL2.0 atomics by aliasing them to the corresponding c11
>> atomic types using implicit typedef
>>
>> - Added diagnostics for atomics Khronos extension enabling
>>
>>
>> Added:
>> cfe/trunk/test/Parser/opencl-atomics-cl20.cl
>> Modified:
>> cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>> cfe/trunk/include/clang/Basic/TokenKinds.def
>> cfe/trunk/lib/Basic/IdentifierTable.cpp
>> cfe/trunk/lib/Sema/Sema.cpp
>> cfe/trunk/lib/Sema/SemaType.cpp
>>
>> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Diag
>> nosticSemaKinds.td?rev=232631&r1=232630&r2=232631&view=diff
>> ======================================================================
>> ========
>> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
>> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Wed Mar 18
>> +++ 07:55:29 2015
>> @@ -7124,8 +7124,8 @@ def ext_c99_array_usage : Extension< def
>> err_c99_array_usage_cxx : Error<
>> "%select{qualifier in |static |}0array size %select{||'[*] '}0is a C99 "
>> "feature, not permitted in C++">;
>> -def err_double_requires_fp64 : Error<
>> - "use of type 'double' requires cl_khr_fp64 extension to be
>> enabled">;
>> + def err_type_requires_extension : Error< "use of type %0 requires
>> + %1 extension to be enabled">;
>> def err_int128_unsupported : Error<
>> "__int128 is not supported on this target">; def
>> err_nsconsumed_attribute_mismatch : Error<
>>
>> Modified: cfe/trunk/include/clang/Basic/TokenKinds.def
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/Toke
>> nKinds.def?rev=232631&r1=232630&r2=232631&view=diff
>> ======================================================================
>> ========
>> --- cfe/trunk/include/clang/Basic/TokenKinds.def (original)
>> +++ cfe/trunk/include/clang/Basic/TokenKinds.def Wed Mar 18 07:55:29
>> +++ 2015
>> @@ -228,6 +228,7 @@ PUNCTUATOR(greatergreatergreater, ">>>")
>> // KEYNOMS18 - This is a keyword that must never be enabled under
>> // MSVC <= v18.
>> // KEYOPENCL - This is a keyword in OpenCL
>> +// KEYNOOPENCL - This is a keyword that is not supported in OpenCL
>> // KEYALTIVEC - This is a keyword in AltiVec
>> // KEYBORLAND - This is a keyword if Borland extensions are enabled
>> // BOOLSUPPORT - This is a keyword if 'bool' is a built-in type
>> @@ -270,7 +271,7 @@ KEYWORD(volatile , KE
>> KEYWORD(while , KEYALL)
>> KEYWORD(_Alignas , KEYALL)
>> KEYWORD(_Alignof , KEYALL)
>> -KEYWORD(_Atomic , KEYALL|KEYNOMS18)
>> +KEYWORD(_Atomic , KEYALL|KEYNOMS18|KEYNOOPENCL)
>> KEYWORD(_Bool , KEYNOCXX)
>> KEYWORD(_Complex , KEYALL)
>> KEYWORD(_Generic , KEYALL)
>>
>> Modified: cfe/trunk/lib/Basic/IdentifierTable.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/IdentifierTabl
>> e.cpp?rev=232631&r1=232630&r2=232631&view=diff
>> ======================================================================
>> ========
>> --- cfe/trunk/lib/Basic/IdentifierTable.cpp (original)
>> +++ cfe/trunk/lib/Basic/IdentifierTable.cpp Wed Mar 18 07:55:29 2015
>> @@ -106,9 +106,11 @@ namespace {
>> KEYC11 = 0x400,
>> KEYARC = 0x800,
>> KEYNOMS18 = 0x01000,
>> - WCHARSUPPORT = 0x02000,
>> - HALFSUPPORT = 0x04000,
>> - KEYALL = (0xffff & ~KEYNOMS18) // Because KEYNOMS18 is used to exclude.
>> + KEYNOOPENCL = 0x02000,
>> + WCHARSUPPORT = 0x04000,
>> + HALFSUPPORT = 0x08000,
>> + KEYALL = (0xffff & ~KEYNOMS18 &
>> + ~KEYNOOPENCL) // KEYNOMS18 and KEYNOOPENCL are used to exclude.
>> };
>>
>> /// \brief How a keyword is treated in the selected standard.
>> @@ -156,7 +158,12 @@ static void AddKeyword(StringRef Keyword
>> // Don't add this keyword under MSVCCompat.
>> if (LangOpts.MSVCCompat && (Flags & KEYNOMS18) &&
>> !LangOpts.isCompatibleWithMSVC(19))
>> - return;
>> + return;
>> +
>> + // Don't add this keyword under OpenCL.
>> + if (LangOpts.OpenCL && (Flags & KEYNOOPENCL))
>> + return;
>> +
>> // Don't add this keyword if disabled in this language.
>> if (AddResult == KS_Disabled) return;
>>
>>
>> Modified: cfe/trunk/lib/Sema/Sema.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/Sema.cpp?rev=23
>> 2631&r1=232630&r2=232631&view=diff
>> ======================================================================
>> ========
>> --- cfe/trunk/lib/Sema/Sema.cpp (original)
>> +++ cfe/trunk/lib/Sema/Sema.cpp Wed Mar 18 07:55:29 2015
>> @@ -212,6 +212,29 @@ void Sema::Initialize() {
>> addImplicitTypedef("image3d_t", Context.OCLImage3dTy);
>> addImplicitTypedef("sampler_t", Context.OCLSamplerTy);
>> addImplicitTypedef("event_t", Context.OCLEventTy);
>> + if (getLangOpts().OpenCLVersion >= 200) {
>> + addImplicitTypedef("atomic_int", Context.getAtomicType(Context.IntTy));
>> + addImplicitTypedef("atomic_uint",
>> + Context.getAtomicType(Context.UnsignedIntTy));
>> + addImplicitTypedef("atomic_long", Context.getAtomicType(Context.LongTy));
>> + addImplicitTypedef("atomic_ulong",
>> + Context.getAtomicType(Context.UnsignedLongTy));
>> + addImplicitTypedef("atomic_float",
>> + Context.getAtomicType(Context.FloatTy));
>> + addImplicitTypedef("atomic_double",
>> + Context.getAtomicType(Context.DoubleTy));
>> + // OpenCLC v2.0, s6.13.11.6 requires that atomic_flag is implemented as
>> + // 32-bit integer and OpenCLC v2.0, s6.1.1 int is always 32-bit wide.
>> + addImplicitTypedef("atomic_flag", Context.getAtomicType(Context.IntTy));
>> + addImplicitTypedef("atomic_intptr_t",
>> + Context.getAtomicType(Context.getIntPtrType()));
>> + addImplicitTypedef("atomic_uintptr_t",
>> + Context.getAtomicType(Context.getUIntPtrType()));
>> + addImplicitTypedef("atomic_size_t",
>> + Context.getAtomicType(Context.getSizeType()));
>> + addImplicitTypedef("atomic_ptrdiff_t",
>> + Context.getAtomicType(Context.getPointerDiffType()));
>> + }
>> }
>>
>> DeclarationName BuiltinVaList =
>> &Context.Idents.get("__builtin_va_list");
>>
>> Modified: cfe/trunk/lib/Sema/SemaType.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?re
>> v=232631&r1=232630&r2=232631&view=diff
>> ======================================================================
>> ========
>> --- cfe/trunk/lib/Sema/SemaType.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaType.cpp Wed Mar 18 07:55:29 2015
>> @@ -871,7 +871,8 @@ static QualType ConvertDeclSpecToType(Ty
>> if (S.getLangOpts().OpenCL &&
>> !((S.getLangOpts().OpenCLVersion >= 120) ||
>> S.getOpenCLOptions().cl_khr_fp64)) {
>> - S.Diag(DS.getTypeSpecTypeLoc(), diag::err_double_requires_fp64);
>> + S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_requires_extension)
>> + << Result << "cl_khr_fp64";
>> declarator.setInvalidType(true);
>> }
>> break;
>> @@ -947,6 +948,30 @@ static QualType ConvertDeclSpecToType(Ty
>> << DS.getSourceRange();
>> declarator.setInvalidType(true);
>> }
>> + } else if (S.getLangOpts().OpenCL) {
>> + if (const AtomicType *AT = Result->getAs<AtomicType>()) {
>> + const BuiltinType *BT = AT->getValueType()->getAs<BuiltinType>();
>> + bool NoExtTypes = BT && (BT->getKind() == BuiltinType::Int ||
>> + BT->getKind() == BuiltinType::UInt ||
>> + BT->getKind() == BuiltinType::Float);
>> + if (!S.getOpenCLOptions().cl_khr_int64_base_atomics && !NoExtTypes) {
>> + S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_requires_extension)
>> + << Result << "cl_khr_int64_base_atomics";
>> + declarator.setInvalidType(true);
>> + }
>> + if (!S.getOpenCLOptions().cl_khr_int64_extended_atomics &&
>> + !NoExtTypes) {
>> + S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_requires_extension)
>> + << Result << "cl_khr_int64_extended_atomics";
>> + declarator.setInvalidType(true);
>> + }
>> + if (!S.getOpenCLOptions().cl_khr_fp64 && BT &&
>> + BT->getKind() == BuiltinType::Double) {
>> + S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_requires_extension)
>> + << Result << "cl_khr_fp64";
>> + declarator.setInvalidType(true);
>> + }
>> + }
>> }
>>
>> // TypeQuals handled by caller.
>>
>> Added: cfe/trunk/test/Parser/opencl-atomics-cl20.cl
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Parser/opencl-atomi
>> cs-cl20.cl?rev=232631&view=auto
>> ======================================================================
>> ========
>> --- cfe/trunk/test/Parser/opencl-atomics-cl20.cl (added)
>> +++ cfe/trunk/test/Parser/opencl-atomics-cl20.cl Wed Mar 18 07:55:29
>> +++ 2015
>> @@ -0,0 +1,56 @@
>> +// RUN: %clang_cc1 %s -verify -pedantic -fsyntax-only // RUN:
>> +%clang_cc1 %s -verify -fsyntax-only -cl-std=CL2.0 -DCL20 // RUN:
>> +%clang_cc1 %s -verify -fsyntax-only -cl-std=CL2.0 -DCL20 -DEXT
>> +
>> +#ifdef EXT
>> +#pragma OPENCL EXTENSION cl_khr_int64_base_atomics:enable #pragma
>> +OPENCL EXTENSION cl_khr_int64_extended_atomics:enable
>> +#pragma OPENCL EXTENSION cl_khr_fp64:enable #endif
>> +
>> +void atomic_types_test() {
>> +// OpenCL v2.0 s6.13.11.6 defines supported atomic types.
>> + atomic_int i;
>> + atomic_uint ui;
>> + atomic_long l;
>> + atomic_ulong ul;
>> + atomic_float f;
>> + atomic_double d;
>> + atomic_flag fl;
>> + atomic_intptr_t ip;
>> + atomic_uintptr_t uip;
>> + atomic_size_t s;
>> + atomic_ptrdiff_t pd;
>> +// OpenCL v2.0 s6.13.11.8, _Atomic type specifier and _Atomic type
>> +qualifier // are not supported by OpenCL.
>> + _Atomic int i; // expected-error {{use of undeclared identifier
>> +'_Atomic'}} } #ifndef CL20 // expected-error at -16 {{use of undeclared
>> +identifier 'atomic_int'}} // expected-error at -16 {{use of undeclared
>> +identifier 'atomic_uint'}} // expected-error at -16 {{use of undeclared
>> +identifier 'atomic_long'}} // expected-error at -16 {{use of undeclared
>> +identifier 'atomic_ulong'}} // expected-error at -16 {{use of undeclared
>> +identifier 'atomic_float'}} // expected-error at -16 {{use of undeclared
>> +identifier 'atomic_double'}} // expected-error at -16 {{use of
>> +undeclared identifier 'atomic_flag'}} // expected-error at -16 {{use of
>> +undeclared identifier 'atomic_intptr_t'}} // expected-error at -16 {{use
>> +of undeclared identifier 'atomic_uintptr_t'}} // expected-error at -16
>> +{{use of undeclared identifier 'atomic_size_t'}} //
>> +expected-error at -16 {{use of undeclared identifier
>> +'atomic_ptrdiff_t'}} #elif !EXT // expected-error at -26 {{use of type
>> +'atomic_long' (aka '_Atomic(long)') requires
>> +cl_khr_int64_base_atomics extension to be enabled}} //
>> +expected-error at -27 {{use of type 'atomic_long' (aka '_Atomic(long)')
>> +requires cl_khr_int64_extended_atomics extension to be enabled}} //
>> +expected-error at -27 {{use of type 'atomic_ulong' (aka
>> +'_Atomic(unsigned long)') requires cl_khr_int64_base_atomics
>> +extension to be enabled}} // expected-error at -28 {{use of type
>> +'atomic_ulong' (aka '_Atomic(unsigned long)') requires
>> +cl_khr_int64_extended_atomics extension to be enabled}} //
>> +expected-error at -27 {{use of type 'atomic_double' (aka
>> +'_Atomic(double)') requires cl_khr_int64_base_atomics extension to be
>> +enabled}} // expected-error at -28 {{use of type 'atomic_double' (aka
>> +'_Atomic(double)') requires cl_khr_int64_extended_atomics extension
>> +to be enabled}} // expected-error at -29 {{use of type 'atomic_double'
>> +(aka '_Atomic(double)') requires cl_khr_fp64 extension to be
>> +enabled}} // expected-error-re at -28 {{use of type 'atomic_intptr_t'
>> +(aka '_Atomic({{.+}})') requires cl_khr_int64_base_atomics extension
>> +to be enabled}} // expected-error-re at -29 {{use of type
>> +'atomic_intptr_t' (aka '_Atomic({{.+}})') requires
>> +cl_khr_int64_extended_atomics extension to be enabled}} //
>> +expected-error-re at -29 {{use of type 'atomic_uintptr_t' (aka
>> +'_Atomic({{.+}})') requires cl_khr_int64_base_atomics extension to be
>> +enabled}} // expected-error-re at -30 {{use of type 'atomic_uintptr_t'
>> +(aka '_Atomic({{.+}})') requires cl_khr_int64_extended_atomics
>> +extension to be enabled}} // expected-error-re at -30 {{use of type
>> +'atomic_size_t' (aka '_Atomic({{.+}})') requires
>> +cl_khr_int64_base_atomics extension to be enabled}} //
>> +expected-error-re at -31 {{use of type 'atomic_size_t' (aka
>> +'_Atomic({{.+}})') requires cl_khr_int64_extended_atomics extension
>> +to be enabled}} // expected-error-re at -31 {{use of type
>> +'atomic_ptrdiff_t' (aka '_Atomic({{.+}})') requires
>> +cl_khr_int64_base_atomics extension to be enabled}} //
>> +expected-error-re at -32 {{use of type 'atomic_ptrdiff_t' (aka
>> +'_Atomic({{.+}})') requires cl_khr_int64_extended_atomics extension
>> +to be enabled}} #endif
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
>
>
More information about the cfe-commits
mailing list