Skip to content

Commit 1d90753

Browse files
committed
Implement UseNativeLowPrecision shader flag analysis
1 parent c482c96 commit 1d90753

File tree

3 files changed

+18
-0
lines changed

3 files changed

+18
-0
lines changed

clang/lib/CodeGen/CGHLSLRuntime.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,10 +282,13 @@ void CGHLSLRuntime::addHLSLBufferLayoutType(const RecordType *StructType,
282282

283283
void CGHLSLRuntime::finishCodeGen() {
284284
auto &TargetOpts = CGM.getTarget().getTargetOpts();
285+
auto &LangOpts = CGM.getLangOpts();
285286
llvm::Module &M = CGM.getModule();
286287
Triple T(M.getTargetTriple());
287288
if (T.getArch() == Triple::ArchType::dxil)
288289
addDxilValVersion(TargetOpts.DxilValidatorVersion, M);
290+
if (LangOpts.NativeHalfType)
291+
M.setModuleFlag(llvm::Module::ModFlagBehavior::Error, "dx.nativelowprec", 1);
289292

290293
generateGlobalCtorDtorCalls();
291294
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// RUN: %clang_cc1 -fnative-half-type -finclude-default-header -triple dxil-pc-shadermodel6.3-library -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s --check-prefix=FLAG
2+
// RUN: %clang_cc1 -finclude-default-header -triple dxil-pc-shadermodel6.3-library -emit-llvm -disable-llvm-passes -o - %s | FileCheck %s --check-prefix=NOFLAG
3+
4+
// NOTE: -enable-16bit-types is a DXCFlag that aliases -fnative-half-type
5+
6+
// FLAG-DAG: ![[NLP:.*]] = !{i32 1, !"dx.nativelowprec", i32 1}
7+
// FLAG-DAG: !llvm.module.flags = !{{{.*}}![[NLP]]{{.*}}}
8+
9+
// NOFLAG-NOT: dx.nativelowprec

llvm/lib/Target/DirectX/DXILShaderFlags.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,12 @@ void ModuleShaderFlags::initialize(Module &M, DXILResourceTypeMap &DRTM,
188188
continue;
189189
}
190190

191+
// Set UseNativeLowPrecision using dx.nativelowprec module metadata
192+
if (auto *NativeLowPrec = mdconst::extract_or_null<ConstantInt>(
193+
M.getModuleFlag("dx.nativelowprec")))
194+
if (NativeLowPrec->getValue() != 0)
195+
SCCSF.UseNativeLowPrecision = true;
196+
191197
ComputedShaderFlags CSF;
192198
for (const auto &BB : *F)
193199
for (const auto &I : BB)

0 commit comments

Comments
 (0)