r263795 - Add -fnative-half-arguments-and-returns

Jeroen Ketema via cfe-commits cfe-commits at lists.llvm.org
Tue May 17 04:59:16 PDT 2016


Hi,

The below commit is, as it enables half arguments and returns by default for OpenCL, while this is actually an extension that might not be supported on all platforms. I think that this part of the commit should be reverted:

> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Fri Mar 18 11:58:36 2016
> @@ -1434,6 +1434,7 @@ void CompilerInvocation::setLangDefaults
>     Opts.LaxVectorConversions = 0;
>     Opts.DefaultFPContract = 1;
>     Opts.NativeHalfType = 1;
> +    Opts.NativeHalfArgsAndReturns = 1;
>   }


Best,

 Jeroen


> On 18 Mar 2016, at 16:58, Pirama Arumuga Nainar via cfe-commits <cfe-commits at lists.llvm.org> wrote:
> 
> Author: pirama
> Date: Fri Mar 18 11:58:36 2016
> New Revision: 263795
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=263795&view=rev
> Log:
> Add -fnative-half-arguments-and-returns
> 
> Summary:
> r246764 handled __fp16 arguments and returns for AAPCS, but skipped this
> handling for OpenCL.  Simlar to OpenCL, RenderScript also handles __fp16
> type natively.
> 
> This patch adds the -fnative-half-arguments-and-returns command line
> flag to allow such languages to skip this coercion of __fp16.
> 
> Reviewers: srhines, olista01
> 
> Subscribers: cfe-commits
> 
> Differential Revision: http://reviews.llvm.org/D18138
> 
> Modified:
>    cfe/trunk/include/clang/Basic/LangOptions.def
>    cfe/trunk/include/clang/Driver/CC1Options.td
>    cfe/trunk/lib/CodeGen/TargetInfo.cpp
>    cfe/trunk/lib/Frontend/CompilerInvocation.cpp
>    cfe/trunk/test/CodeGen/arm-fp16-arguments.c
> 
> Modified: cfe/trunk/include/clang/Basic/LangOptions.def
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/LangOptions.def?rev=263795&r1=263794&r2=263795&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/LangOptions.def (original)
> +++ cfe/trunk/include/clang/Basic/LangOptions.def Fri Mar 18 11:58:36 2016
> @@ -163,6 +163,7 @@ LANGOPT(ShortEnums        , 1, 0, "short
> LANGOPT(OpenCL            , 1, 0, "OpenCL")
> LANGOPT(OpenCLVersion     , 32, 0, "OpenCL version")
> LANGOPT(NativeHalfType    , 1, 0, "Native half type support")
> +LANGOPT(NativeHalfArgsAndReturns, 1, 0, "Native half args and returns")
> LANGOPT(HalfArgsAndReturns, 1, 0, "half args and returns")
> LANGOPT(CUDA              , 1, 0, "CUDA")
> LANGOPT(OpenMP            , 1, 0, "OpenMP support")
> 
> Modified: cfe/trunk/include/clang/Driver/CC1Options.td
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Driver/CC1Options.td?rev=263795&r1=263794&r2=263795&view=diff
> ==============================================================================
> --- cfe/trunk/include/clang/Driver/CC1Options.td (original)
> +++ cfe/trunk/include/clang/Driver/CC1Options.td Fri Mar 18 11:58:36 2016
> @@ -603,6 +603,8 @@ def fno_rtti_data : Flag<["-"], "fno-rtt
>   HelpText<"Control emission of RTTI data">;
> def fnative_half_type: Flag<["-"], "fnative-half-type">,
>   HelpText<"Use the native half type for __fp16 instead of promoting to float">;
> +def fnative_half_arguments_and_returns : Flag<["-"], "fnative-half-arguments-and-returns">,
> +  HelpText<"Use the native __fp16 type for arguments and returns (and skip ABI-specific lowering)">;
> def fallow_half_arguments_and_returns : Flag<["-"], "fallow-half-arguments-and-returns">,
>   HelpText<"Allow function arguments and returns of type half">;
> 
> 
> Modified: cfe/trunk/lib/CodeGen/TargetInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/TargetInfo.cpp?rev=263795&r1=263794&r2=263795&view=diff
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/TargetInfo.cpp (original)
> +++ cfe/trunk/lib/CodeGen/TargetInfo.cpp Fri Mar 18 11:58:36 2016
> @@ -5106,7 +5106,7 @@ ABIArgInfo ARMABIInfo::classifyArgumentT
>   // __fp16 gets passed as if it were an int or float, but with the top 16 bits
>   // unspecified. This is not done for OpenCL as it handles the half type
>   // natively, and does not need to interwork with AAPCS code.
> -  if (Ty->isHalfType() && !getContext().getLangOpts().OpenCL) {
> +  if (Ty->isHalfType() && !getContext().getLangOpts().NativeHalfArgsAndReturns) {
>     llvm::Type *ResType = IsEffectivelyAAPCS_VFP ?
>       llvm::Type::getFloatTy(getVMContext()) :
>       llvm::Type::getInt32Ty(getVMContext());
> @@ -5298,7 +5298,7 @@ ABIArgInfo ARMABIInfo::classifyReturnTyp
>   // __fp16 gets returned as if it were an int or float, but with the top 16
>   // bits unspecified. This is not done for OpenCL as it handles the half type
>   // natively, and does not need to interwork with AAPCS code.
> -  if (RetTy->isHalfType() && !getContext().getLangOpts().OpenCL) {
> +  if (RetTy->isHalfType() && !getContext().getLangOpts().NativeHalfArgsAndReturns) {
>     llvm::Type *ResType = IsEffectivelyAAPCS_VFP ?
>       llvm::Type::getFloatTy(getVMContext()) :
>       llvm::Type::getInt32Ty(getVMContext());
> 
> Modified: cfe/trunk/lib/Frontend/CompilerInvocation.cpp
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Frontend/CompilerInvocation.cpp?rev=263795&r1=263794&r2=263795&view=diff
> ==============================================================================
> --- cfe/trunk/lib/Frontend/CompilerInvocation.cpp (original)
> +++ cfe/trunk/lib/Frontend/CompilerInvocation.cpp Fri Mar 18 11:58:36 2016
> @@ -1434,6 +1434,7 @@ void CompilerInvocation::setLangDefaults
>     Opts.LaxVectorConversions = 0;
>     Opts.DefaultFPContract = 1;
>     Opts.NativeHalfType = 1;
> +    Opts.NativeHalfArgsAndReturns = 1;
>   }
> 
>   Opts.CUDA = IK == IK_CUDA || IK == IK_PreprocessedCuda ||
> @@ -1795,7 +1796,11 @@ static void ParseLangArgs(LangOptions &O
>   Opts.ModuleFeatures = Args.getAllArgValues(OPT_fmodule_feature);
>   std::sort(Opts.ModuleFeatures.begin(), Opts.ModuleFeatures.end());
>   Opts.NativeHalfType |= Args.hasArg(OPT_fnative_half_type);
> -  Opts.HalfArgsAndReturns = Args.hasArg(OPT_fallow_half_arguments_and_returns);
> +  Opts.NativeHalfArgsAndReturns |= Args.hasArg(OPT_fnative_half_arguments_and_returns);
> +  // Enable HalfArgsAndReturns if present in Args or if NativeHalfArgsAndReturns
> +  // is enabled.
> +  Opts.HalfArgsAndReturns = Args.hasArg(OPT_fallow_half_arguments_and_returns)
> +                            | Opts.NativeHalfArgsAndReturns;
>   Opts.GNUAsm = !Args.hasArg(OPT_fno_gnu_inline_asm);
> 
>   // __declspec is enabled by default for the PS4 by the driver, and also
> 
> Modified: cfe/trunk/test/CodeGen/arm-fp16-arguments.c
> URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/arm-fp16-arguments.c?rev=263795&r1=263794&r2=263795&view=diff
> ==============================================================================
> --- cfe/trunk/test/CodeGen/arm-fp16-arguments.c (original)
> +++ cfe/trunk/test/CodeGen/arm-fp16-arguments.c Fri Mar 18 11:58:36 2016
> @@ -1,5 +1,6 @@
> // RUN: %clang_cc1 -triple armv7a--none-eabi -target-abi aapcs -mfloat-abi soft -fallow-half-arguments-and-returns -emit-llvm -o - -O1 %s | FileCheck %s --check-prefix=CHECK --check-prefix=SOFT
> // RUN: %clang_cc1 -triple armv7a--none-eabi -target-abi aapcs -mfloat-abi hard -fallow-half-arguments-and-returns -emit-llvm -o - -O1 %s | FileCheck %s --check-prefix=CHECK --check-prefix=HARD
> +// RUN: %clang_cc1 -triple armv7a--none-eabi -target-abi aapcs -mfloat-abi soft -fnative-half-arguments-and-returns -emit-llvm -o - -O1 %s | FileCheck %s --check-prefix=NATIVE
> 
> __fp16 g;
> 
> @@ -10,12 +11,17 @@ void t1(__fp16 a) { g = a; }
> // HARD: [[BITCAST:%.*]] = bitcast float [[PARAM]] to i32
> // HARD: [[TRUNC:%.*]] = trunc i32 [[BITCAST]] to i16
> // CHECK: store i16 [[TRUNC]], i16* bitcast (half* @g to i16*)
> +// NATIVE: define void @t1(half [[PARAM:%.*]])
> +// NATIVE: store half [[PARAM]], half* @g
> 
> __fp16 t2() { return g; }
> // SOFT: define i32 @t2()
> // HARD: define arm_aapcs_vfpcc float @t2()
> +// NATIVE: define half @t2()
> // CHECK: [[LOAD:%.*]] = load i16, i16* bitcast (half* @g to i16*)
> // CHECK: [[ZEXT:%.*]] = zext i16 [[LOAD]] to i32
> // SOFT: ret i32 [[ZEXT]]
> // HARD: [[BITCAST:%.*]] = bitcast i32 [[ZEXT]] to float
> // HARD: ret float [[BITCAST]]
> +// NATIVE: [[LOAD:%.*]] = load half, half* @g
> +// NATIVE: ret half [[LOAD]]



More information about the cfe-commits mailing list