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