diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -6736,6 +6736,8 @@ def dxc_Group : OptionGroup<"">, Flags<[DXCOption]>, HelpText<"dxc compatibility options">; +class DXCFlag : Option<["/", "-"], name, KIND_FLAG>, + Group, Flags<[DXCOption, NoXarchOption]>; class DXCJoinedOrSeparate : Option<["/", "-"], name, KIND_JOINED_OR_SEPARATE>, Group, Flags<[DXCOption, NoXarchOption]>; @@ -6760,3 +6762,8 @@ "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, + HelpText<"Enable 16-bit types and disable min precision types." + "Available in HLSL 2018 and shader model 6.2.">; +def fcgl : DXCFlag<"fcgl">, + HelpText<"Generate high-level code only. Without any dxil related passes.">; diff --git a/clang/lib/Basic/LangOptions.cpp b/clang/lib/Basic/LangOptions.cpp --- a/clang/lib/Basic/LangOptions.cpp +++ b/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) { diff --git a/clang/lib/Basic/Targets/DirectX.h b/clang/lib/Basic/Targets/DirectX.h --- a/clang/lib/Basic/Targets/DirectX.h +++ b/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; diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3470,11 +3470,14 @@ 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_S, options::OPT_emit_llvm, + 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, diff --git a/clang/lib/Driver/ToolChains/HLSL.cpp b/clang/lib/Driver/ToolChains/HLSL.cpp --- a/clang/lib/Driver/ToolChains/HLSL.cpp +++ b/clang/lib/Driver/ToolChains/HLSL.cpp @@ -169,6 +169,13 @@ if (!isLegalValidatorVersion(ValVerStr, getDriver())) continue; } + if (A->getOption().getID() == options::OPT_fcgl) { + // Translate fcgl into -S -emit-llvm. + DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_S)); + DAL->AddFlagArg(nullptr, Opts.getOption(options::OPT_emit_llvm)); + A->claim(); + continue; + } DAL->append(A); } // Add default validator version if not set. @@ -179,5 +186,7 @@ Opts.getOption(options::OPT_dxil_validator_version), DefaultValidatorVer); } + // FIXME: add validation for enable_16bit_types should be after HLSL 2018 and + // shader model 6.2. return DAL; } diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp --- a/clang/lib/Sema/SemaType.cpp +++ b/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) diff --git a/clang/test/CodeGenHLSL/half.hlsl b/clang/test/CodeGenHLSL/half.hlsl new file mode 100644 --- /dev/null +++ b/clang/test/CodeGenHLSL/half.hlsl @@ -0,0 +1,15 @@ +// RUN: %clang_dxc -Tlib_6_7 -fcgl -Fo - %s | FileCheck %s --check-prefix=FLOAT +// RUN: %clang_dxc -Tlib_6_7 -enable-16bit-types -fcgl -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; +}