python3kgae created this revision. python3kgae added reviewers: Anastasia, aaron.ballman, beanz, pow2clk. Herald added a subscriber: dexonsmith. Herald added a project: All. python3kgae requested review of this revision. Herald added subscribers: cfe-commits, MaskRay. Herald added a project: clang.
HLSL supports half type. When enable-16bit-types is not set, half will be treated as float. When enable-16bit-types is set, half will be treated like real 16bit float type and map to llvm half type. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D124790 Files: clang/include/clang/Driver/Options.td clang/lib/Basic/LangOptions.cpp clang/lib/Basic/Targets/DirectX.h clang/lib/Driver/ToolChains/Clang.cpp clang/lib/Sema/SemaType.cpp clang/test/CodeGenHLSL/half.hlsl
Index: clang/test/CodeGenHLSL/half.hlsl =================================================================== --- /dev/null +++ clang/test/CodeGenHLSL/half.hlsl @@ -0,0 +1,15 @@ +// RUN: %clang_dxc -Tlib_6_7 -Fo - %s | FileCheck %s --check-prefix=FLOAT +// RUN: %clang_dxc -Tlib_6_7 -enable-16bit-types -Fo - %s | FileCheck %s --check-prefix=HALF + +// Make sure use float when not enable-16bit-types. +// FLOAT:define float @_Z3fooff(float %{{.*}}, float %{{.*}}) +// FLOAT-NOT:half +// FLOAT:ret float % + +// Make sure use half when enable-16bit-types. +// HALF:define half @_Z3fooDhDh(half %{{.*}}, half %{{.*}}) +// HALF-NOT:float +// HALF:ret half % +half foo(half a, half b) { + return a+b; +} Index: clang/lib/Sema/SemaType.cpp =================================================================== --- clang/lib/Sema/SemaType.cpp +++ clang/lib/Sema/SemaType.cpp @@ -1509,7 +1509,13 @@ << "_Float16"; Result = Context.Float16Ty; break; - case DeclSpec::TST_half: Result = Context.HalfTy; break; + case DeclSpec::TST_half: + // For HLSL, when not enable native half type, half will be treat as float. + if (S.getLangOpts().HLSL && !S.getLangOpts().NativeHalfType) + Result = Context.FloatTy; + else + Result = Context.HalfTy; + break; case DeclSpec::TST_BFloat16: if (!S.Context.getTargetInfo().hasBFloat16Type()) S.Diag(DS.getTypeSpecTypeLoc(), diag::err_type_unsupported) Index: clang/lib/Driver/ToolChains/Clang.cpp =================================================================== --- clang/lib/Driver/ToolChains/Clang.cpp +++ clang/lib/Driver/ToolChains/Clang.cpp @@ -3470,11 +3470,13 @@ static void RenderHLSLOptions(const ArgList &Args, ArgStringList &CmdArgs, types::ID InputType) { - const unsigned ForwardedArguments[] = {options::OPT_dxil_validator_version}; + const unsigned ForwardedArguments[] = {options::OPT_dxil_validator_version, + options::OPT_fnative_half_type}; for (const auto &Arg : ForwardedArguments) if (const auto *A = Args.getLastArg(Arg)) A->renderAsInput(Args, CmdArgs); + CmdArgs.push_back("-fallow-half-arguments-and-returns"); } static void RenderARCMigrateToolOptions(const Driver &D, const ArgList &Args, Index: clang/lib/Basic/Targets/DirectX.h =================================================================== --- clang/lib/Basic/Targets/DirectX.h +++ clang/lib/Basic/Targets/DirectX.h @@ -58,7 +58,7 @@ resetDataLayout("e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-f32:" "32-f64:64-n8:16:32:64"); } - + bool useFP16ConversionIntrinsics() const override { return false; } void getTargetDefines(const LangOptions &Opts, MacroBuilder &Builder) const override; Index: clang/lib/Basic/LangOptions.cpp =================================================================== --- clang/lib/Basic/LangOptions.cpp +++ clang/lib/Basic/LangOptions.cpp @@ -194,8 +194,8 @@ // OpenCL, C++ and C2x have bool, true, false keywords. Opts.Bool = Opts.OpenCL || Opts.CPlusPlus || Opts.C2x; - // OpenCL has half keyword - Opts.Half = Opts.OpenCL; + // OpenCL and HLSL have half keyword + Opts.Half = Opts.OpenCL || Opts.HLSL; } FPOptions FPOptions::defaultWithoutTrailingStorage(const LangOptions &LO) { Index: clang/include/clang/Driver/Options.td =================================================================== --- clang/include/clang/Driver/Options.td +++ clang/include/clang/Driver/Options.td @@ -6736,6 +6736,8 @@ def dxc_Group : OptionGroup<"<clang-dxc options>">, Flags<[DXCOption]>, HelpText<"dxc compatibility options">; +class DXCFlag<string name> : Option<["/", "-"], name, KIND_FLAG>, + Group<dxc_Group>, Flags<[DXCOption, NoXarchOption]>; class DXCJoinedOrSeparate<string name> : Option<["/", "-"], name, KIND_JOINED_OR_SEPARATE>, Group<dxc_Group>, Flags<[DXCOption, NoXarchOption]>; @@ -6760,3 +6762,6 @@ "lib_6_3, lib_6_4, lib_6_5, lib_6_6, lib_6_7, lib_6_x," "ms_6_5, ms_6_6, ms_6_7," "as_6_5, as_6_6, as_6_7">; +def enable_16bit_types : DXCFlag<"enable-16bit-types">, Alias<fnative_half_type>, + HelpText<"Enable 16bit types and disable min precision types." + "Available in HLSL 2018 and shader model 6.2">;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits