Skip to content

Commit 77f72ac

Browse files
committed
[HLSL] Enable half type for hlsl.
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. Also change CXXABI to Microsoft to match dxc behavior. The mangle name for half is "$f16@" when half is treat as native half type and "$halff@" when treat as float. In AST, half is still half. The special thing is done at clang codeGen, when NativeHalfType is false, half will translated into float. Reviewed By: aaron.ballman Differential Revision: https://reviews.llvm.org/D124790
1 parent a2c1f7c commit 77f72ac

File tree

9 files changed

+68
-29
lines changed

9 files changed

+68
-29
lines changed

clang/include/clang/Driver/Options.td

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6850,3 +6850,6 @@ def emit_pristine_llvm : DXCFlag<"emit-pristine-llvm">,
68506850
HelpText<"Emit pristine LLVM IR from the frontend by not running any LLVM passes at all."
68516851
"Same as -S + -emit-llvm + -disable-llvm-passes.">;
68526852
def fcgl : DXCFlag<"fcgl">, Alias<emit_pristine_llvm>;
6853+
def enable_16bit_types : DXCFlag<"enable-16bit-types">, Alias<fnative_half_type>,
6854+
HelpText<"Enable 16-bit types and disable min precision types."
6855+
"Available in HLSL 2018 and shader model 6.2.">;

clang/lib/AST/ASTContext.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1707,8 +1707,17 @@ const llvm::fltSemantics &ASTContext::getFloatTypeSemantics(QualType T) const {
17071707
case BuiltinType::BFloat16:
17081708
return Target->getBFloat16Format();
17091709
case BuiltinType::Float16:
1710-
case BuiltinType::Half:
17111710
return Target->getHalfFormat();
1711+
case BuiltinType::Half:
1712+
// For HLSL, when the native half type is disabled, half will be treat as
1713+
// float.
1714+
if (getLangOpts().HLSL)
1715+
if (getLangOpts().NativeHalfType)
1716+
return Target->getHalfFormat();
1717+
else
1718+
return Target->getFloatFormat();
1719+
else
1720+
return Target->getHalfFormat();
17121721
case BuiltinType::Float: return Target->getFloatFormat();
17131722
case BuiltinType::Double: return Target->getDoubleFormat();
17141723
case BuiltinType::Ibm128:

clang/lib/AST/MicrosoftMangle.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2461,7 +2461,12 @@ void MicrosoftCXXNameMangler::mangleType(const BuiltinType *T, Qualifiers,
24612461
break;
24622462

24632463
case BuiltinType::Half:
2464-
mangleArtificialTagType(TTK_Struct, "_Half", {"__clang"});
2464+
if (!getASTContext().getLangOpts().HLSL)
2465+
mangleArtificialTagType(TTK_Struct, "_Half", {"__clang"});
2466+
else if (getASTContext().getLangOpts().NativeHalfType)
2467+
Out << "$f16@";
2468+
else
2469+
Out << "$halff@";
24652470
break;
24662471

24672472
#define SVE_TYPE(Name, Id, SingletonId) \

clang/lib/Basic/LangOptions.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,8 @@ void LangOptions::setLangDefaults(LangOptions &Opts, Language Lang,
195195
// OpenCL, C++ and C2x have bool, true, false keywords.
196196
Opts.Bool = Opts.OpenCL || Opts.CPlusPlus || Opts.C2x;
197197

198-
// OpenCL has half keyword
199-
Opts.Half = Opts.OpenCL;
198+
// OpenCL and HLSL have half keyword
199+
Opts.Half = Opts.OpenCL || Opts.HLSL;
200200
}
201201

202202
FPOptions FPOptions::defaultWithoutTrailingStorage(const LangOptions &LO) {

clang/lib/Basic/Targets/DirectX.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,9 @@ class LLVM_LIBRARY_VISIBILITY DirectXTargetInfo : public TargetInfo {
5757
NoAsmVariants = true;
5858
resetDataLayout("e-m:e-p:32:32-i1:32-i8:8-i16:16-i32:32-i64:64-f16:16-f32:"
5959
"32-f64:64-n8:16:32:64");
60+
TheCXXABI.set(TargetCXXABI::Microsoft);
6061
}
61-
62+
bool useFP16ConversionIntrinsics() const override { return false; }
6263
void getTargetDefines(const LangOptions &Opts,
6364
MacroBuilder &Builder) const override;
6465

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3479,16 +3479,20 @@ static void RenderOpenCLOptions(const ArgList &Args, ArgStringList &CmdArgs,
34793479

34803480
static void RenderHLSLOptions(const ArgList &Args, ArgStringList &CmdArgs,
34813481
types::ID InputType) {
3482-
const unsigned ForwardedArguments[] = {
3483-
options::OPT_dxil_validator_version, options::OPT_D, options::OPT_S,
3484-
options::OPT_emit_llvm, options::OPT_disable_llvm_passes};
3482+
const unsigned ForwardedArguments[] = {options::OPT_dxil_validator_version,
3483+
options::OPT_D,
3484+
options::OPT_S,
3485+
options::OPT_emit_llvm,
3486+
options::OPT_disable_llvm_passes,
3487+
options::OPT_fnative_half_type};
34853488

34863489
for (const auto &Arg : ForwardedArguments)
34873490
if (const auto *A = Args.getLastArg(Arg))
34883491
A->renderAsInput(Args, CmdArgs);
34893492
// Add the default headers if dxc_no_stdinc is not set.
34903493
if (!Args.hasArg(options::OPT_dxc_no_stdinc))
34913494
CmdArgs.push_back("-finclude-default-header");
3495+
CmdArgs.push_back("-fallow-half-arguments-and-returns");
34923496
}
34933497

34943498
static void RenderARCMigrateToolOptions(const Driver &D, const ArgList &Args,

clang/lib/Driver/ToolChains/HLSL.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,5 +177,7 @@ HLSLToolChain::TranslateArgs(const DerivedArgList &Args, StringRef BoundArch,
177177
Opts.getOption(options::OPT_dxil_validator_version),
178178
DefaultValidatorVer);
179179
}
180+
// FIXME: add validation for enable_16bit_types should be after HLSL 2018 and
181+
// shader model 6.2.
180182
return DAL;
181183
}

clang/test/CodeGenHLSL/basic_types.hlsl

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,27 @@
22

33
// FIXME: check 16bit types once enable-16bit-types is ready.
44

5-
// CHECK:@uint_Val = global i32 0, align 4
6-
// CHECK:@uint64_t_Val = global i64 0, align 8
7-
// CHECK:@int64_t_Val = global i64 0, align 8
8-
// CHECK:@int2_Val = global <2 x i32> zeroinitializer, align 8
9-
// CHECK:@int3_Val = global <3 x i32> zeroinitializer, align 16
10-
// CHECK:@int4_Val = global <4 x i32> zeroinitializer, align 16
11-
// CHECK:@uint2_Val = global <2 x i32> zeroinitializer, align 8
12-
// CHECK:@uint3_Val = global <3 x i32> zeroinitializer, align 16
13-
// CHECK:@uint4_Val = global <4 x i32> zeroinitializer, align 16
14-
// CHECK:@int64_t2_Val = global <2 x i64> zeroinitializer, align 16
15-
// CHECK:@int64_t3_Val = global <3 x i64> zeroinitializer, align 32
16-
// CHECK:@int64_t4_Val = global <4 x i64> zeroinitializer, align 32
17-
// CHECK:@uint64_t2_Val = global <2 x i64> zeroinitializer, align 16
18-
// CHECK:@uint64_t3_Val = global <3 x i64> zeroinitializer, align 32
19-
// CHECK:@uint64_t4_Val = global <4 x i64> zeroinitializer, align 32
20-
// CHECK:@float2_Val = global <2 x float> zeroinitializer, align 8
21-
// CHECK:@float3_Val = global <3 x float> zeroinitializer, align 16
22-
// CHECK:@float4_Val = global <4 x float> zeroinitializer, align 16
23-
// CHECK:@double2_Val = global <2 x double> zeroinitializer, align 16
24-
// CHECK:@double3_Val = global <3 x double> zeroinitializer, align 32
25-
// CHECK:@double4_Val = global <4 x double> zeroinitializer, align 32
5+
// CHECK:"?uint_Val@@3IA" = global i32 0, align 4
6+
// CHECK:"?uint64_t_Val@@3KA" = global i64 0, align 8
7+
// CHECK:"?int64_t_Val@@3JA" = global i64 0, align 8
8+
// CHECK:"?int2_Val@@3T?$__vector@H$01@__clang@@A" = global <2 x i32> zeroinitializer, align 8
9+
// CHECK:"?int3_Val@@3T?$__vector@H$02@__clang@@A" = global <3 x i32> zeroinitializer, align 16
10+
// CHECK:"?int4_Val@@3T?$__vector@H$03@__clang@@A" = global <4 x i32> zeroinitializer, align 16
11+
// CHECK:"?uint2_Val@@3T?$__vector@I$01@__clang@@A" = global <2 x i32> zeroinitializer, align 8
12+
// CHECK:"?uint3_Val@@3T?$__vector@I$02@__clang@@A" = global <3 x i32> zeroinitializer, align 16
13+
// CHECK:"?uint4_Val@@3T?$__vector@I$03@__clang@@A" = global <4 x i32> zeroinitializer, align 16
14+
// CHECK:"?int64_t2_Val@@3T?$__vector@J$01@__clang@@A" = global <2 x i64> zeroinitializer, align 16
15+
// CHECK:"?int64_t3_Val@@3T?$__vector@J$02@__clang@@A" = global <3 x i64> zeroinitializer, align 32
16+
// CHECK:"?int64_t4_Val@@3T?$__vector@J$03@__clang@@A" = global <4 x i64> zeroinitializer, align 32
17+
// CHECK:"?uint64_t2_Val@@3T?$__vector@K$01@__clang@@A" = global <2 x i64> zeroinitializer, align 16
18+
// CHECK:"?uint64_t3_Val@@3T?$__vector@K$02@__clang@@A" = global <3 x i64> zeroinitializer, align 32
19+
// CHECK:"?uint64_t4_Val@@3T?$__vector@K$03@__clang@@A" = global <4 x i64> zeroinitializer, align 32
20+
// CHECK:"?float2_Val@@3T?$__vector@M$01@__clang@@A" = global <2 x float> zeroinitializer, align 8
21+
// CHECK:"?float3_Val@@3T?$__vector@M$02@__clang@@A" = global <3 x float> zeroinitializer, align 16
22+
// CHECK:"?float4_Val@@3T?$__vector@M$03@__clang@@A" = global <4 x float> zeroinitializer, align 16
23+
// CHECK:"?double2_Val@@3T?$__vector@N$01@__clang@@A" = global <2 x double> zeroinitializer, align 16
24+
// CHECK:"?double3_Val@@3T?$__vector@N$02@__clang@@A" = global <3 x double> zeroinitializer, align 32
25+
// CHECK:"?double4_Val@@3T?$__vector@N$03@__clang@@A" = global <4 x double> zeroinitializer, align 32
2626

2727
#define TYPE_DECL(T) T T##_Val
2828

clang/test/CodeGenHLSL/half.hlsl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
// RUN: %clang_dxc -Tlib_6_7 -fcgl -Fo - %s | FileCheck %s --check-prefix=FLOAT
2+
// RUN: %clang_dxc -Tlib_6_7 -enable-16bit-types -fcgl -Fo - %s | FileCheck %s --check-prefix=HALF
3+
4+
// Make sure use float when not enable-16bit-types.
5+
// FLOAT:define {{.*}}float @"?foo@@YA$halff@$halff@0@Z"(float{{[^,]+}}, float{{[^,)]+}})
6+
// FLOAT-NOT:half
7+
// FLOAT:ret float %
8+
9+
// Make sure use half when enable-16bit-types.
10+
// HALF:define {{.*}}half @"?foo@@YA$f16@$f16@0@Z"(half{{[^,]+}}, half{{[^,)]+}})
11+
// HALF-NOT:float
12+
// HALF:ret half %
13+
half foo(half a, half b) {
14+
return a+b;
15+
}

0 commit comments

Comments
 (0)