r352221 - Disable _Float16 for non ARM/SPIR Targets

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Mon Jan 28 06:07:40 PST 2019


Merged together with r352222 to 8.0 in r352363.

On Fri, Jan 25, 2019 at 9:27 AM Erich Keane via cfe-commits
<cfe-commits at lists.llvm.org> wrote:
>
> Author: erichkeane
> Date: Fri Jan 25 09:27:57 2019
> New Revision: 352221
>
> URL: http://llvm.org/viewvc/llvm-project?rev=352221&view=rev
> Log:
> Disable _Float16 for non ARM/SPIR Targets
>
> As Discussed here:
> http://lists.llvm.org/pipermail/llvm-dev/2019-January/129543.html
>
> There are problems exposing the _Float16 type on architectures that
> haven't defined the ABI/ISel for the type yet, so we're temporarily
> disabling the type and making it opt-in.
>
> Differential Revision: https://reviews.llvm.org/D57188
>
> Change-Id: I5db7366dedf1deb9485adb8948b1deb7e612a736
>
> Added:
>     cfe/trunk/test/Sema/Float16.c   (with props)
> Modified:
>     cfe/trunk/docs/LanguageExtensions.rst
>     cfe/trunk/include/clang/Basic/TargetInfo.h
>     cfe/trunk/lib/Basic/TargetInfo.cpp
>     cfe/trunk/lib/Basic/Targets/AArch64.cpp
>     cfe/trunk/lib/Basic/Targets/ARM.cpp
>     cfe/trunk/lib/Basic/Targets/SPIR.h
>     cfe/trunk/lib/Sema/SemaType.cpp
>     cfe/trunk/test/AST/float16.cpp
>     cfe/trunk/test/CodeGenCXX/float16-declarations.cpp
>     cfe/trunk/test/CodeGenCXX/mangle-ms.cpp
>     cfe/trunk/test/Lexer/half-literal.cpp
>
> Modified: cfe/trunk/docs/LanguageExtensions.rst
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/docs/LanguageExtensions.rst?rev=352221&r1=352220&r2=352221&view=diff
> ==============================================================================
> --- cfe/trunk/docs/LanguageExtensions.rst (original)
> +++ cfe/trunk/docs/LanguageExtensions.rst Fri Jan 25 09:27:57 2019
> @@ -474,44 +474,58 @@ Half-Precision Floating Point
>  =============================
>
>  Clang supports two half-precision (16-bit) floating point types: ``__fp16`` and
> -``_Float16``. ``__fp16`` is defined in the ARM C Language Extensions (`ACLE
> -<http://infocenter.arm.com/help/topic/com.arm.doc.ihi0053d/IHI0053D_acle_2_1.pdf>`_)
> -and ``_Float16`` in ISO/IEC TS 18661-3:2015.
> -
> -``__fp16`` is a storage and interchange format only. This means that values of
> -``__fp16`` promote to (at least) float when used in arithmetic operations.
> -There are two ``__fp16`` formats. Clang supports the IEEE 754-2008 format and
> -not the ARM alternative format.
> -
> -ISO/IEC TS 18661-3:2015 defines C support for additional floating point types.
> -``_FloatN`` is defined as a binary floating type, where the N suffix denotes
> -the number of bits and is 16, 32, 64, or greater and equal to 128 and a
> -multiple of 32. Clang supports ``_Float16``. The difference from ``__fp16`` is
> -that arithmetic on ``_Float16`` is performed in half-precision, thus it is not
> -a storage-only format. ``_Float16`` is available as a source language type in
> -both C and C++ mode.
> -
> -It is recommended that portable code use the ``_Float16`` type because
> -``__fp16`` is an ARM C-Language Extension (ACLE), whereas ``_Float16`` is
> -defined by the C standards committee, so using ``_Float16`` will not prevent
> -code from being ported to architectures other than Arm.  Also, ``_Float16``
> -arithmetic and operations will directly map on half-precision instructions when
> -they are available (e.g. Armv8.2-A), avoiding conversions to/from
> -single-precision, and thus will result in more performant code. If
> -half-precision instructions are unavailable, values will be promoted to
> -single-precision, similar to the semantics of ``__fp16`` except that the
> -results will be stored in single-precision.
> -
> -In an arithmetic operation where one operand is of ``__fp16`` type and the
> -other is of ``_Float16`` type, the ``_Float16`` type is first converted to
> -``__fp16`` type and then the operation is completed as if both operands were of
> -``__fp16`` type.
> -
> -To define a ``_Float16`` literal, suffix ``f16`` can be appended to the compile-time
> -constant declaration. There is no default argument promotion for ``_Float16``; this
> -applies to the standard floating types only. As a consequence, for example, an
> -explicit cast is required for printing a ``_Float16`` value (there is no string
> -format specifier for ``_Float16``).
> +``_Float16``.  These types are supported in all language modes.
> +
> +``__fp16`` is supported on every target, as it is purely a storage format; see below.
> +``_Float16`` is currently only supported on the following targets, with further
> +targets pending ABI standardization:
> +- 32-bit ARM
> +- 64-bit ARM (AArch64)
> +- SPIR
> +``_Float16`` will be supported on more targets as they define ABIs for it.
> +
> +``__fp16`` is a storage and interchange format only.  This means that values of
> +``__fp16`` are immediately promoted to (at least) ``float`` when used in arithmetic
> +operations, so that e.g. the result of adding two ``__fp16`` values has type ``float``.
> +The behavior of ``__fp16`` is specified by the ARM C Language Extensions (`ACLE <http://infocenter.arm.com/help/topic/com.arm.doc.ihi0053d/IHI0053D_acle_2_1.pdf>`_).
> +Clang uses the ``binary16`` format from IEEE 754-2008 for ``__fp16``, not the ARM
> +alternative format.
> +
> +``_Float16`` is an extended floating-point type.  This means that, just like arithmetic on
> +``float`` or ``double``, arithmetic on ``_Float16`` operands is formally performed in the
> +``_Float16`` type, so that e.g. the result of adding two ``_Float16`` values has type
> +``_Float16``.  The behavior of ``_Float16`` is specified by ISO/IEC TS 18661-3:2015
> +("Floating-point extensions for C").  As with ``__fp16``, Clang uses the ``binary16``
> +format from IEEE 754-2008 for ``_Float16``.
> +
> +``_Float16`` arithmetic will be performed using native half-precision support
> +when available on the target (e.g. on ARMv8.2a); otherwise it will be performed
> +at a higher precision (currently always ``float``) and then truncated down to
> +``_Float16``.  Note that C and C++ allow intermediate floating-point operands
> +of an expression to be computed with greater precision than is expressible in
> +their type, so Clang may avoid intermediate truncations in certain cases; this may
> +lead to results that are inconsistent with native arithmetic.
> +
> +It is recommended that portable code use ``_Float16`` instead of ``__fp16``,
> +as it has been defined by the C standards committee and has behavior that is
> +more familiar to most programmers.
> +
> +Because ``__fp16`` operands are always immediately promoted to ``float``, the
> +common real type of ``__fp16`` and ``_Float16`` for the purposes of the usual
> +arithmetic conversions is ``float``.
> +
> +A literal can be given ``_Float16`` type using the suffix ``f16``; for example:
> +```
> +  3.14f16
> +  ```
> +
> +Because default argument promotion only applies to the standard floating-point
> +types, ``_Float16`` values are not promoted to ``double`` when passed as variadic
> +or untyped arguments.  As a consequence, some caution must be taken when using
> +certain library facilities with ``_Float16``; for example, there is no ``printf`` format
> +specifier for ``_Float16``, and (unlike ``float``) it will not be implicitly promoted to
> +``double`` when passed to ``printf``, so the programmer must explicitly cast it to
> +``double`` before using it with an ``%f`` or similar specifier.
>
>  Messages on ``deprecated`` and ``unavailable`` Attributes
>  =========================================================
>
> Modified: cfe/trunk/include/clang/Basic/TargetInfo.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/TargetInfo.h?rev=352221&r1=352220&r2=352221&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/TargetInfo.h (original)
> +++ cfe/trunk/include/clang/Basic/TargetInfo.h Fri Jan 25 09:27:57 2019
> @@ -63,6 +63,7 @@ protected:
>    bool HasLegalHalfType; // True if the backend supports operations on the half
>                           // LLVM IR type.
>    bool HasFloat128;
> +  bool HasFloat16;
>    unsigned char PointerWidth, PointerAlign;
>    unsigned char BoolWidth, BoolAlign;
>    unsigned char IntWidth, IntAlign;
> @@ -516,6 +517,9 @@ public:
>    /// Determine whether the __float128 type is supported on this target.
>    virtual bool hasFloat128Type() const { return HasFloat128; }
>
> +  /// Determine whether the _Float16 type is supported on this target.
> +  virtual bool hasFloat16Type() const { return HasFloat16; }
> +
>    /// Return the alignment that is suitable for storing any
>    /// object with a fundamental alignment requirement.
>    unsigned getSuitableAlign() const { return SuitableAlign; }
>
> Modified: cfe/trunk/lib/Basic/TargetInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/TargetInfo.cpp?rev=352221&r1=352220&r2=352221&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Basic/TargetInfo.cpp (original)
> +++ cfe/trunk/lib/Basic/TargetInfo.cpp Fri Jan 25 09:27:57 2019
> @@ -34,6 +34,7 @@ TargetInfo::TargetInfo(const llvm::Tripl
>    NoAsmVariants = false;
>    HasLegalHalfType = false;
>    HasFloat128 = false;
> +  HasFloat16 = false;
>    PointerWidth = PointerAlign = 32;
>    BoolWidth = BoolAlign = 8;
>    IntWidth = IntAlign = 32;
>
> Modified: cfe/trunk/lib/Basic/Targets/AArch64.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets/AArch64.cpp?rev=352221&r1=352220&r2=352221&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Basic/Targets/AArch64.cpp (original)
> +++ cfe/trunk/lib/Basic/Targets/AArch64.cpp Fri Jan 25 09:27:57 2019
> @@ -49,6 +49,7 @@ AArch64TargetInfo::AArch64TargetInfo(con
>
>    // All AArch64 implementations support ARMv8 FP, which makes half a legal type.
>    HasLegalHalfType = true;
> +  HasFloat16 = true;
>
>    LongWidth = LongAlign = PointerWidth = PointerAlign = 64;
>    MaxVectorAlign = 128;
>
> Modified: cfe/trunk/lib/Basic/Targets/ARM.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets/ARM.cpp?rev=352221&r1=352220&r2=352221&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Basic/Targets/ARM.cpp (original)
> +++ cfe/trunk/lib/Basic/Targets/ARM.cpp Fri Jan 25 09:27:57 2019
> @@ -396,6 +396,7 @@ bool ARMTargetInfo::handleTargetFeatures
>    SoftFloat = SoftFloatABI = false;
>    HWDiv = 0;
>    DotProd = 0;
> +  HasFloat16 = true;
>
>    // This does not diagnose illegal cases like having both
>    // "+vfpv2" and "+vfpv3" or having "+neon" and "+fp-only-sp".
>
> Modified: cfe/trunk/lib/Basic/Targets/SPIR.h
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Basic/Targets/SPIR.h?rev=352221&r1=352220&r2=352221&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Basic/Targets/SPIR.h (original)
> +++ cfe/trunk/lib/Basic/Targets/SPIR.h Fri Jan 25 09:27:57 2019
> @@ -47,6 +47,7 @@ public:
>      AddrSpaceMap = &SPIRAddrSpaceMap;
>      UseAddrSpaceMapMangling = true;
>      HasLegalHalfType = true;
> +    HasFloat16 = true;
>      // Define available target features
>      // These must be defined in sorted order!
>      NoAsmVariants = true;
>
> Modified: cfe/trunk/lib/Sema/SemaType.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=352221&r1=352220&r2=352221&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaType.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaType.cpp Fri Jan 25 09:27:57 2019
> @@ -1441,7 +1441,12 @@ static QualType ConvertDeclSpecToType(Ty
>      else
>        Result = Context.Int128Ty;
>      break;
> -  case DeclSpec::TST_float16: Result = Context.Float16Ty; break;
> +  case DeclSpec::TST_float16:
> +    if (!S.Context.getTargetInfo().hasFloat16Type())
> +      S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_unsupported)
> +        << "_Float16";
> +    Result = Context.Float16Ty;
> +    break;
>    case DeclSpec::TST_half:    Result = Context.HalfTy; break;
>    case DeclSpec::TST_float:   Result = Context.FloatTy; break;
>    case DeclSpec::TST_double:
>
> Modified: cfe/trunk/test/AST/float16.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/AST/float16.cpp?rev=352221&r1=352220&r2=352221&view=diff
> ==============================================================================
> --- cfe/trunk/test/AST/float16.cpp (original)
> +++ cfe/trunk/test/AST/float16.cpp Fri Jan 25 09:27:57 2019
> @@ -1,5 +1,5 @@
> -// RUN: %clang_cc1 -std=c++11 -ast-dump %s | FileCheck %s --strict-whitespace
> -// RUN: %clang_cc1 -std=c++11 -ast-dump -fnative-half-type %s | FileCheck %s --check-prefix=CHECK-NATIVE --strict-whitespace
> +// RUN: %clang_cc1 -std=c++11 -ast-dump -triple aarch64-linux-gnu %s | FileCheck %s --strict-whitespace
> +// RUN: %clang_cc1 -std=c++11 -ast-dump -triple aarch64-linux-gnu -fnative-half-type %s | FileCheck %s --check-prefix=CHECK-NATIVE --strict-whitespace
>
>  /*  Various contexts where type _Float16 can appear. */
>
>
> Modified: cfe/trunk/test/CodeGenCXX/float16-declarations.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/float16-declarations.cpp?rev=352221&r1=352220&r2=352221&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/float16-declarations.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/float16-declarations.cpp Fri Jan 25 09:27:57 2019
> @@ -1,5 +1,4 @@
>  // RUN: %clang -std=c++11 --target=aarch64-arm--eabi -S -emit-llvm %s -o - | FileCheck %s  --check-prefix=CHECK --check-prefix=CHECK-AARCH64
> -// RUN: %clang -std=c++11 --target=x86_64 -S -emit-llvm %s -o - | FileCheck %s  --check-prefix=CHECK --check-prefix=CHECK-X86
>
>  /*  Various contexts where type _Float16 can appear. */
>
> @@ -15,7 +14,6 @@ namespace {
>
>    _Float16 arr1n[10];
>  // CHECK-AARCH64-DAG: @_ZN12_GLOBAL__N_15arr1nE = internal global [10 x half] zeroinitializer, align 2
> -// CHECK-X86-DAG:     @_ZN12_GLOBAL__N_15arr1nE = internal global [10 x half] zeroinitializer, align 16
>
>    _Float16 arr2n[] = { 1.2, 3.0, 3.e4 };
>  // CHECK-DAG: @_ZN12_GLOBAL__N_15arr2nE = internal global [3 x half] [half 0xH3CCD, half 0xH4200, half 0xH7753], align 2
> @@ -30,14 +28,12 @@ namespace {
>
>  _Float16 f1f;
>  // CHECK-AARCH64-DAG: @f1f = dso_local global half 0xH0000, align 2
> -// CHECK-X86-DAG: @f1f = dso_local global half 0xH0000, align 2
>
>  _Float16 f2f = 32.4;
>  // CHECK-DAG: @f2f = dso_local global half 0xH500D, align 2
>
>  _Float16 arr1f[10];
>  // CHECK-AARCH64-DAG: @arr1f = dso_local global [10 x half] zeroinitializer, align 2
> -// CHECK-X86-DAG: @arr1f = dso_local global [10 x half] zeroinitializer, align 16
>
>  _Float16 arr2f[] = { -1.2, -3.0, -3.e4 };
>  // CHECK-DAG: @arr2f = dso_local global [3 x half] [half 0xHBCCD, half 0xHC200, half 0xHF753], align 2
> @@ -137,8 +133,6 @@ int main(void) {
>    long double cvtld = f2n;
>  //CHECK-AARCh64-DAG: [[H2LD:%[a-z0-9]+]] = fpext half {{%[0-9]+}} to fp128
>  //CHECK-AARCh64-DAG: store fp128 [[H2LD]], fp128* %{{.*}}, align 16
> -//CHECK-X86-DAG:     [[H2LD:%[a-z0-9]+]] = fpext half {{%[0-9]+}} to x86_fp80
> -//CHECK-X86-DAG:     store x86_fp80 [[H2LD]], x86_fp80* %{{.*}}, align 16
>
>    _Float16 f2h = 42.0f;
>  //CHECK-DAG: store half 0xH5140, half* %{{.*}}, align 2
>
> Modified: cfe/trunk/test/CodeGenCXX/mangle-ms.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle-ms.cpp?rev=352221&r1=352220&r2=352221&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/mangle-ms.cpp (original)
> +++ cfe/trunk/test/CodeGenCXX/mangle-ms.cpp Fri Jan 25 09:27:57 2019
> @@ -1,5 +1,6 @@
>  // RUN: %clang_cc1 -fblocks -emit-llvm %s -o - -triple=i386-pc-win32 -std=c++98 | FileCheck %s
>  // RUN: %clang_cc1 -fblocks -emit-llvm %s -o - -triple=x86_64-pc-win32 -std=c++98| FileCheck -check-prefix X64 %s
> +// RUN: %clang_cc1 -fblocks -emit-llvm %s -o - -triple=aarch64-pc-win32 -std=c++98 -DARM | FileCheck -check-prefixes=X64,ARM %s
>
>  int a;
>  // CHECK-DAG: @"?a@@3HA"
> @@ -466,10 +467,12 @@ namespace Complex {
>  // CHECK-DAG: define dso_local void @"?f at Complex@@YAXU?$_Complex at H@__clang@@@Z"(
>  void f(_Complex int) {}
>  }
> +#ifdef ARM
>  namespace Float16 {
> -// CHECK-DAG: define dso_local void @"?f at Float16@@YAXU_Float16 at __clang@@@Z"(
> +// ARM-DAG: define dso_local void @"?f at Float16@@YAXU_Float16 at __clang@@@Z"(
>  void f(_Float16) {}
>  }
> +#endif // ARM
>
>  namespace PR26029 {
>  template <class>
>
> Modified: cfe/trunk/test/Lexer/half-literal.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Lexer/half-literal.cpp?rev=352221&r1=352220&r2=352221&view=diff
> ==============================================================================
> --- cfe/trunk/test/Lexer/half-literal.cpp (original)
> +++ cfe/trunk/test/Lexer/half-literal.cpp Fri Jan 25 09:27:57 2019
> @@ -1,4 +1,4 @@
> -// RUN: %clang_cc1 -fsyntax-only -verify -pedantic %s
> +// RUN: %clang_cc1 -fsyntax-only -verify -pedantic -triple aarch64-linux-gnu %s
>  float a = 1.0h; // expected-error{{no matching literal operator for call to 'operator""h' with argument of type 'long double' or 'const char *', and no matching literal operator template}}
>  float b = 1.0H; // expected-error{{invalid suffix 'H' on floating constant}}
>
>
> Added: cfe/trunk/test/Sema/Float16.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Sema/Float16.c?rev=352221&view=auto
> ==============================================================================
> --- cfe/trunk/test/Sema/Float16.c (added)
> +++ cfe/trunk/test/Sema/Float16.c Fri Jan 25 09:27:57 2019
> @@ -0,0 +1,11 @@
> +// RUN: %clang_cc1 -fsyntax-only -verify -triple x86_64-linux-pc %s
> +// RUN: %clang_cc1 -fsyntax-only -verify -triple spir-unknown-unknown %s -DHAVE
> +// RUN: %clang_cc1 -fsyntax-only -verify -triple armv7a-linux-gnu %s -DHAVE
> +// RUN: %clang_cc1 -fsyntax-only -verify -triple aarch64-linux-gnu %s -DHAVE
> +
> +#ifdef HAVE
> +// expected-no-diagnostics
> +#else
> +// expected-error at +2{{_Float16 is not supported on this target}}
> +#endif // HAVE
> +_Float16 f;
>
> Propchange: cfe/trunk/test/Sema/Float16.c
> ------------------------------------------------------------------------------
>     svn:eol-style = native
>
> Propchange: cfe/trunk/test/Sema/Float16.c
> ------------------------------------------------------------------------------
>     svn:keywords = "Author Date Id Rev URL"
>
> Propchange: cfe/trunk/test/Sema/Float16.c
> ------------------------------------------------------------------------------
>     svn:mime-type = text/plain
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list