Author: Deric C. Date: 2025-04-10T16:06:48-07:00 New Revision: 727f3921e7af7a4b0f1e59635ebb99a52bd173c3
URL: https://github.com/llvm/llvm-project/commit/727f3921e7af7a4b0f1e59635ebb99a52bd173c3 DIFF: https://github.com/llvm/llvm-project/commit/727f3921e7af7a4b0f1e59635ebb99a52bd173c3.diff LOG: [DirectX] Implement Shader Flags Analysis for ResMayNotAlias (#131070) Fixes #112270 Completed ACs: - `-res-may-alias` clang-dxc command-line option added - It inserts and sets a module metadata flag `dx.resmayalias` to 1 - Shader flag set appropriately: - The flag IS NOT set if DXIL Version <= 1.6 OR the command-line option `-res-may-alias` is specified - Otherwise the flag IS set when: - DXIL Version > 1.7 AND function uses UAVs, OR - DXIL Version <= 1.7 AND UAVs present globally - Add tests - Tests for Shader Models 6.6, 6.7, and 6.8 corresponding to DXIL Versions 1.6, 1.7, and 1.8 - Tests (`res-may-alias-0.ll`/`res-may-alias-1.ll`) for when the module metadata flag `dx.resmayalias` is set to 0 or 1 respectively - A frontend test (`res-may-alias.hlsl`) for testing that that the command-line option `-res-may-alias` inserts `dx.resmayalias` module metadata correctly Added: clang/test/CodeGenHLSL/res-may-alias.hlsl llvm/test/CodeGen/DirectX/ShaderFlags/res-may-alias-0.ll llvm/test/CodeGen/DirectX/ShaderFlags/res-may-alias-1.ll llvm/test/CodeGen/DirectX/ShaderFlags/res-may-not-alias-shadermodel6.6.ll llvm/test/CodeGen/DirectX/ShaderFlags/res-may-not-alias-shadermodel6.7.ll llvm/test/CodeGen/DirectX/ShaderFlags/res-may-not-alias-shadermodel6.8.ll Modified: clang/include/clang/Basic/CodeGenOptions.def clang/include/clang/Driver/Options.td clang/lib/CodeGen/CGHLSLRuntime.cpp clang/lib/Driver/ToolChains/Clang.cpp llvm/lib/Target/DirectX/DXILShaderFlags.cpp llvm/lib/Target/DirectX/DXILShaderFlags.h llvm/test/CodeGen/DirectX/ShaderFlags/typed-uav-load-additional-formats.ll Removed: ################################################################################ diff --git a/clang/include/clang/Basic/CodeGenOptions.def b/clang/include/clang/Basic/CodeGenOptions.def index a7f5f1abbb825..a436c0ec98d5b 100644 --- a/clang/include/clang/Basic/CodeGenOptions.def +++ b/clang/include/clang/Basic/CodeGenOptions.def @@ -476,6 +476,9 @@ CODEGENOPT(ImportCallOptimization, 1, 0) /// (BlocksRuntime) on Windows. CODEGENOPT(StaticClosure, 1, 0) +/// Assume that UAVs/SRVs may alias +CODEGENOPT(ResMayAlias, 1, 0) + /// FIXME: Make DebugOptions its own top-level .def file. #include "DebugOptions.def" diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 2ca5f99e4ca63..c42887deebde8 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -9131,6 +9131,11 @@ def dxil_validator_version : Option<["/", "-"], "validator-version", KIND_SEPARA HelpText<"Override validator version for module. Format: <major.minor>;" "Default: DXIL.dll version or current internal version">, MarshallingInfoString<TargetOpts<"DxilValidatorVersion">, "\"1.8\"">; +def res_may_alias : Option<["/", "-"], "res-may-alias", KIND_FLAG>, + Group<dxc_Group>, Flags<[HelpHidden]>, + Visibility<[DXCOption, ClangOption, CC1Option]>, + HelpText<"Assume that UAVs/SRVs may alias">, + MarshallingInfoFlag<CodeGenOpts<"ResMayAlias">>; def target_profile : DXCJoinedOrSeparate<"T">, MetaVarName<"<profile>">, HelpText<"Set target profile">, Values<"ps_6_0, ps_6_1, ps_6_2, ps_6_3, ps_6_4, ps_6_5, ps_6_6, ps_6_7," diff --git a/clang/lib/CodeGen/CGHLSLRuntime.cpp b/clang/lib/CodeGen/CGHLSLRuntime.cpp index 77700ea3a676d..a756c3f1e0321 100644 --- a/clang/lib/CodeGen/CGHLSLRuntime.cpp +++ b/clang/lib/CodeGen/CGHLSLRuntime.cpp @@ -282,11 +282,14 @@ void CGHLSLRuntime::addHLSLBufferLayoutType(const RecordType *StructType, void CGHLSLRuntime::finishCodeGen() { auto &TargetOpts = CGM.getTarget().getTargetOpts(); + auto &CodeGenOpts = CGM.getCodeGenOpts(); auto &LangOpts = CGM.getLangOpts(); llvm::Module &M = CGM.getModule(); Triple T(M.getTargetTriple()); if (T.getArch() == Triple::ArchType::dxil) addDxilValVersion(TargetOpts.DxilValidatorVersion, M); + if (CodeGenOpts.ResMayAlias) + M.setModuleFlag(llvm::Module::ModFlagBehavior::Error, "dx.resmayalias", 1); // NativeHalfType corresponds to the -fnative-half-type clang option which is // aliased by clang-dxc's -enable-16bit-types option. This option is used to diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index 13b7b94424999..1de83baacff93 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -3974,6 +3974,7 @@ static void RenderOpenCLOptions(const ArgList &Args, ArgStringList &CmdArgs, static void RenderHLSLOptions(const ArgList &Args, ArgStringList &CmdArgs, types::ID InputType) { const unsigned ForwardedArguments[] = {options::OPT_dxil_validator_version, + options::OPT_res_may_alias, options::OPT_D, options::OPT_I, options::OPT_O, diff --git a/clang/test/CodeGenHLSL/res-may-alias.hlsl b/clang/test/CodeGenHLSL/res-may-alias.hlsl new file mode 100644 index 0000000000000..8cb30249a649a --- /dev/null +++ b/clang/test/CodeGenHLSL/res-may-alias.hlsl @@ -0,0 +1,7 @@ +// RUN: %clang_dxc -res-may-alias -T lib_6_3 -HV 202x -Vd -Xclang -emit-llvm %s | FileCheck %s --check-prefix=FLAG +// RUN: %clang_dxc -T lib_6_3 -HV 202x -Vd -Xclang -emit-llvm %s | FileCheck %s --check-prefix=NOFLAG + +// FLAG-DAG: ![[RMA:.*]] = !{i32 1, !"dx.resmayalias", i32 1} +// FLAG-DAG: !llvm.module.flags = !{{{.*}}![[RMA]]{{.*}}} + +// NOFLAG-NOT: dx.resmayalias diff --git a/llvm/lib/Target/DirectX/DXILShaderFlags.cpp b/llvm/lib/Target/DirectX/DXILShaderFlags.cpp index 2ca428672e1c4..1331b0d1d852b 100644 --- a/llvm/lib/Target/DirectX/DXILShaderFlags.cpp +++ b/llvm/lib/Target/DirectX/DXILShaderFlags.cpp @@ -74,7 +74,8 @@ static bool checkWaveOps(Intrinsic::ID IID) { /// \param I Instruction to check. void ModuleShaderFlags::updateFunctionFlags(ComputedShaderFlags &CSF, const Instruction &I, - DXILResourceTypeMap &DRTM) { + DXILResourceTypeMap &DRTM, + const ModuleMetadataInfo &MMDI) { if (!CSF.Doubles) CSF.Doubles = I.getType()->isDoubleTy(); @@ -128,8 +129,15 @@ void ModuleShaderFlags::updateFunctionFlags(ComputedShaderFlags &CSF, switch (II->getIntrinsicID()) { default: break; - case Intrinsic::dx_resource_handlefrombinding: - switch (DRTM[cast<TargetExtType>(II->getType())].getResourceKind()) { + case Intrinsic::dx_resource_handlefrombinding: { + dxil::ResourceTypeInfo &RTI = DRTM[cast<TargetExtType>(II->getType())]; + + // Set ResMayNotAlias if DXIL version >= 1.8 and function uses UAVs + if (!CSF.ResMayNotAlias && CanSetResMayNotAlias && + MMDI.DXILVersion >= VersionTuple(1, 8) && RTI.isUAV()) + CSF.ResMayNotAlias = true; + + switch (RTI.getResourceKind()) { case dxil::ResourceKind::StructuredBuffer: case dxil::ResourceKind::RawBuffer: CSF.EnableRawAndStructuredBuffers = true; @@ -138,6 +146,7 @@ void ModuleShaderFlags::updateFunctionFlags(ComputedShaderFlags &CSF, break; } break; + } case Intrinsic::dx_resource_load_typedbuffer: { dxil::ResourceTypeInfo &RTI = DRTM[cast<TargetExtType>(II->getArgOperand(0)->getType())]; @@ -163,7 +172,18 @@ void ModuleShaderFlags::updateFunctionFlags(ComputedShaderFlags &CSF, /// Construct ModuleShaderFlags for module Module M void ModuleShaderFlags::initialize(Module &M, DXILResourceTypeMap &DRTM, + DXILResourceMap &DRM, const ModuleMetadataInfo &MMDI) { + + CanSetResMayNotAlias = MMDI.DXILVersion >= VersionTuple(1, 7); + + // Check if -res-may-alias was provided on the command line. + // The command line option will set the dx.resmayalias module flag to 1. + if (auto *RMA = mdconst::extract_or_null<ConstantInt>( + M.getModuleFlag("dx.resmayalias"))) + if (RMA->getValue() != 0) + CanSetResMayNotAlias = false; + CallGraph CG(M); // Compute Shader Flags Mask for all functions using post-order visit of SCC @@ -188,6 +208,11 @@ void ModuleShaderFlags::initialize(Module &M, DXILResourceTypeMap &DRTM, continue; } + // Set ResMayNotAlias to true if DXIL version < 1.8 and there are UAVs + // present globally. + if (CanSetResMayNotAlias && MMDI.DXILVersion < VersionTuple(1, 8)) + SCCSF.ResMayNotAlias = !DRM.uavs().empty(); + // Set UseNativeLowPrecision using dx.nativelowprec module metadata if (auto *NativeLowPrec = mdconst::extract_or_null<ConstantInt>( M.getModuleFlag("dx.nativelowprec"))) @@ -198,7 +223,7 @@ void ModuleShaderFlags::initialize(Module &M, DXILResourceTypeMap &DRTM, ComputedShaderFlags CSF; for (const auto &BB : *F) for (const auto &I : BB) - updateFunctionFlags(CSF, I, DRTM); + updateFunctionFlags(CSF, I, DRTM, MMDI); // Update combined shader flags mask for all functions in this SCC SCCSF.merge(CSF); @@ -268,10 +293,11 @@ AnalysisKey ShaderFlagsAnalysis::Key; ModuleShaderFlags ShaderFlagsAnalysis::run(Module &M, ModuleAnalysisManager &AM) { DXILResourceTypeMap &DRTM = AM.getResult<DXILResourceTypeAnalysis>(M); + DXILResourceMap &DRM = AM.getResult<DXILResourceAnalysis>(M); const ModuleMetadataInfo MMDI = AM.getResult<DXILMetadataAnalysis>(M); ModuleShaderFlags MSFI; - MSFI.initialize(M, DRTM, MMDI); + MSFI.initialize(M, DRTM, DRM, MMDI); return MSFI; } @@ -301,16 +327,18 @@ PreservedAnalyses ShaderFlagsAnalysisPrinter::run(Module &M, bool ShaderFlagsAnalysisWrapper::runOnModule(Module &M) { DXILResourceTypeMap &DRTM = getAnalysis<DXILResourceTypeWrapperPass>().getResourceTypeMap(); + DXILResourceMap &DRM = getAnalysis<DXILResourceWrapperPass>().getBindingMap(); const ModuleMetadataInfo MMDI = getAnalysis<DXILMetadataAnalysisWrapperPass>().getModuleMetadata(); - MSFI.initialize(M, DRTM, MMDI); + MSFI.initialize(M, DRTM, DRM, MMDI); return false; } void ShaderFlagsAnalysisWrapper::getAnalysisUsage(AnalysisUsage &AU) const { AU.setPreservesAll(); AU.addRequiredTransitive<DXILResourceTypeWrapperPass>(); + AU.addRequiredTransitive<DXILResourceWrapperPass>(); AU.addRequired<DXILMetadataAnalysisWrapperPass>(); } diff --git a/llvm/lib/Target/DirectX/DXILShaderFlags.h b/llvm/lib/Target/DirectX/DXILShaderFlags.h index abf7cc86259ed..0e0bd0036349e 100644 --- a/llvm/lib/Target/DirectX/DXILShaderFlags.h +++ b/llvm/lib/Target/DirectX/DXILShaderFlags.h @@ -28,6 +28,7 @@ namespace llvm { class Module; class GlobalVariable; class DXILResourceTypeMap; +class DXILResourceMap; namespace dxil { @@ -84,12 +85,13 @@ struct ComputedShaderFlags { }; struct ModuleShaderFlags { - void initialize(Module &, DXILResourceTypeMap &DRTM, + void initialize(Module &, DXILResourceTypeMap &DRTM, DXILResourceMap &DRM, const ModuleMetadataInfo &MMDI); const ComputedShaderFlags &getFunctionFlags(const Function *) const; const ComputedShaderFlags &getCombinedFlags() const { return CombinedSFMask; } private: + bool CanSetResMayNotAlias; /// Map of Function-Shader Flag Mask pairs representing properties of each of /// the functions in the module. Shader Flags of each function represent both /// module-level and function-level flags @@ -97,7 +99,7 @@ struct ModuleShaderFlags { /// Combined Shader Flag Mask of all functions of the module ComputedShaderFlags CombinedSFMask{}; void updateFunctionFlags(ComputedShaderFlags &, const Instruction &, - DXILResourceTypeMap &); + DXILResourceTypeMap &, const ModuleMetadataInfo &); }; class ShaderFlagsAnalysis : public AnalysisInfoMixin<ShaderFlagsAnalysis> { diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-alias-0.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-alias-0.ll new file mode 100644 index 0000000000000..d15b5c7b61984 --- /dev/null +++ b/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-alias-0.ll @@ -0,0 +1,43 @@ +; RUN: opt -S --passes="print-dx-shader-flags" 2>&1 %s | FileCheck %s + +; This test checks to ensure that setting the LLVM module flag "dx.resmayalias" +; to 0 has no effect on the DXIL shader flag analysis for the flag +; ResMayNotAlias. + +target triple = "dxil-pc-shadermodel6.8-library" + +; CHECK: Combined Shader Flags for Module +; CHECK-NEXT: Shader Flags Value: 0x200000010 + +; CHECK: Note: extra DXIL module flags: +; CHECK: Raw and Structured buffers +; CHECK: Any UAV may not alias any other UAV +; + +; CHECK: Function loadUAV : 0x20000000 +define float @loadUAV() #0 { + %res = call target("dx.TypedBuffer", float, 1, 0, 0) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + %load = call {float, i1} @llvm.dx.resource.load.typedbuffer( + target("dx.TypedBuffer", float, 1, 0, 0) %res, i32 0) + %val = extractvalue {float, i1} %load, 0 + ret float %val +} + +; CHECK: Function loadSRV : 0x00000010 +define float @loadSRV() #0 { + %res = tail call target("dx.RawBuffer", float, 0, 0) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + %load = call {float, i1} @llvm.dx.resource.load.rawbuffer( + target("dx.RawBuffer", float, 0, 0) %res, i32 0, i32 0) + %val = extractvalue { float, i1 } %load, 0 + ret float %val +} + +!llvm.module.flags = !{!0} + +; dx.resmayalias should never appear with a value of 0. +; But if it does, ensure that it has no effect. +!0 = !{i32 1, !"dx.resmayalias", i32 0} + +attributes #0 = { convergent norecurse nounwind "hlsl.export"} diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-alias-1.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-alias-1.ll new file mode 100644 index 0000000000000..edd3250a2db0d --- /dev/null +++ b/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-alias-1.ll @@ -0,0 +1,41 @@ +; RUN: opt -S --passes="print-dx-shader-flags" 2>&1 %s | FileCheck %s + +; This test checks to ensure that setting the LLVM module flag "dx.resmayalias" +; to 1 prevents the DXIL shader flag analysis from setting the flag +; ResMayNotAlias. + +target triple = "dxil-pc-shadermodel6.8-library" + +; CHECK: Combined Shader Flags for Module +; CHECK-NEXT: Shader Flags Value: 0x00000010 + +; CHECK: Note: extra DXIL module flags: +; CHECK: Raw and Structured buffers +; CHECK-NOT: Any UAV may not alias any other UAV +; + +; CHECK: Function loadUAV : 0x00000000 +define float @loadUAV() #0 { + %res = call target("dx.TypedBuffer", float, 1, 0, 0) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + %load = call {float, i1} @llvm.dx.resource.load.typedbuffer( + target("dx.TypedBuffer", float, 1, 0, 0) %res, i32 0) + %val = extractvalue {float, i1} %load, 0 + ret float %val +} + +; CHECK: Function loadSRV : 0x00000010 +define float @loadSRV() #0 { + %res = tail call target("dx.RawBuffer", float, 0, 0) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + %load = call {float, i1} @llvm.dx.resource.load.rawbuffer( + target("dx.RawBuffer", float, 0, 0) %res, i32 0, i32 0) + %val = extractvalue { float, i1 } %load, 0 + ret float %val +} + +!llvm.module.flags = !{!0} + +!0 = !{i32 1, !"dx.resmayalias", i32 1} + +attributes #0 = { convergent norecurse nounwind "hlsl.export"} diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-not-alias-shadermodel6.6.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-not-alias-shadermodel6.6.ll new file mode 100644 index 0000000000000..da7c4c619790c --- /dev/null +++ b/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-not-alias-shadermodel6.6.ll @@ -0,0 +1,37 @@ +; RUN: opt -S --passes="print-dx-shader-flags" 2>&1 %s | FileCheck %s + +; This test checks to ensure the behavior of the DXIL shader flag analysis +; for the flag ResMayNotAlias is correct when the DXIL Version is 1.6. The +; ResMayNotAlias flag (0x20000000) should not be set at all. + +target triple = "dxil-pc-shadermodel6.6-library" + +; CHECK: Combined Shader Flags for Module +; CHECK-NEXT: Shader Flags Value: 0x00000010 + +; CHECK: Note: extra DXIL module flags: +; CHECK: Raw and Structured buffers +; CHECK-NOT: Any UAV may not alias any other UAV +; + +; CHECK: Function loadUAV : 0x00000000 +define float @loadUAV() #0 { + %res = call target("dx.TypedBuffer", float, 1, 0, 0) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + %load = call {float, i1} @llvm.dx.resource.load.typedbuffer( + target("dx.TypedBuffer", float, 1, 0, 0) %res, i32 0) + %val = extractvalue {float, i1} %load, 0 + ret float %val +} + +; CHECK: Function loadSRV : 0x00000010 +define float @loadSRV() #0 { + %res = tail call target("dx.RawBuffer", float, 0, 0) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + %load = call {float, i1} @llvm.dx.resource.load.rawbuffer( + target("dx.RawBuffer", float, 0, 0) %res, i32 0, i32 0) + %val = extractvalue { float, i1 } %load, 0 + ret float %val +} + +attributes #0 = { convergent norecurse nounwind "hlsl.export"} diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-not-alias-shadermodel6.7.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-not-alias-shadermodel6.7.ll new file mode 100644 index 0000000000000..87a76162f734e --- /dev/null +++ b/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-not-alias-shadermodel6.7.ll @@ -0,0 +1,38 @@ +; RUN: opt -S --passes="print-dx-shader-flags" 2>&1 %s | FileCheck %s + +; This test checks to ensure the behavior of the DXIL shader flag analysis +; for the flag ResMayNotAlias is correct when the DXIL Version is 1.7. The +; ResMayNotAlias flag (0x20000000) should be set on all functions if there are +; one or more UAVs present globally in the module. + +target triple = "dxil-pc-shadermodel6.7-library" + +; CHECK: Combined Shader Flags for Module +; CHECK-NEXT: Shader Flags Value: 0x200000010 + +; CHECK: Note: extra DXIL module flags: +; CHECK: Raw and Structured buffers +; CHECK: Any UAV may not alias any other UAV +; + +; CHECK: Function loadUAV : 0x200000000 +define float @loadUAV() #0 { + %res = call target("dx.TypedBuffer", float, 1, 0, 0) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + %load = call {float, i1} @llvm.dx.resource.load.typedbuffer( + target("dx.TypedBuffer", float, 1, 0, 0) %res, i32 0) + %val = extractvalue {float, i1} %load, 0 + ret float %val +} + +; CHECK: Function loadSRV : 0x200000010 +define float @loadSRV() #0 { + %res = tail call target("dx.RawBuffer", float, 0, 0) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + %load = call {float, i1} @llvm.dx.resource.load.rawbuffer( + target("dx.RawBuffer", float, 0, 0) %res, i32 0, i32 0) + %val = extractvalue { float, i1 } %load, 0 + ret float %val +} + +attributes #0 = { convergent norecurse nounwind "hlsl.export"} diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-not-alias-shadermodel6.8.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-not-alias-shadermodel6.8.ll new file mode 100644 index 0000000000000..a309d8ecea56c --- /dev/null +++ b/llvm/test/CodeGen/DirectX/ShaderFlags/res-may-not-alias-shadermodel6.8.ll @@ -0,0 +1,38 @@ +; RUN: opt -S --passes="print-dx-shader-flags" 2>&1 %s | FileCheck %s + +; This test checks to ensure the behavior of the DXIL shader flag analysis +; for the flag ResMayNotAlias is correct when the DXIL Version is 1.8. The +; ResMayNotAlias flag (0x20000000) should only be set when a function uses a +; UAV. + +target triple = "dxil-pc-shadermodel6.8-library" + +; CHECK: Combined Shader Flags for Module +; CHECK-NEXT: Shader Flags Value: 0x200000010 + +; CHECK: Note: extra DXIL module flags: +; CHECK: Raw and Structured buffers +; CHECK: Any UAV may not alias any other UAV +; + +; CHECK: Function loadUAV : 0x20000000 +define float @loadUAV() #0 { + %res = call target("dx.TypedBuffer", float, 1, 0, 0) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + %load = call {float, i1} @llvm.dx.resource.load.typedbuffer( + target("dx.TypedBuffer", float, 1, 0, 0) %res, i32 0) + %val = extractvalue {float, i1} %load, 0 + ret float %val +} + +; CHECK: Function loadSRV : 0x00000010 +define float @loadSRV() #0 { + %res = tail call target("dx.RawBuffer", float, 0, 0) + @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false) + %load = call {float, i1} @llvm.dx.resource.load.rawbuffer( + target("dx.RawBuffer", float, 0, 0) %res, i32 0, i32 0) + %val = extractvalue { float, i1 } %load, 0 + ret float %val +} + +attributes #0 = { convergent norecurse nounwind "hlsl.export"} diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/typed-uav-load-additional-formats.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/typed-uav-load-additional-formats.ll index 060d54f961c70..1bb8a4d78eb16 100644 --- a/llvm/test/CodeGen/DirectX/ShaderFlags/typed-uav-load-additional-formats.ll +++ b/llvm/test/CodeGen/DirectX/ShaderFlags/typed-uav-load-additional-formats.ll @@ -43,4 +43,8 @@ define void @noload(<4 x float> %val) #0 { ret void } +!llvm.module.flags = !{!0} +!0 = !{i32 1, !"dx.resmayalias", i32 1} + attributes #0 = { convergent norecurse nounwind "hlsl.export"} + _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits