[llvm] Set shader analysis flags EnableRawAndStructuredBuffers and ComputeShadersPlusRawAndStructuredBuffers for RWBuffers (PR #114449)

via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 31 11:44:23 PDT 2024


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-directx

Author: Cooper Partin (coopp)

<details>
<summary>Changes</summary>

This commit address Issue #<!-- -->112273 .

This change includes updates to the shader analysis pass and walking the resource metadata to properly set the required shader flags for RWbuffers.

---
Full diff: https://github.com/llvm/llvm-project/pull/114449.diff


4 Files Affected:

- (modified) llvm/lib/Target/DirectX/DXILShaderFlags.cpp (+32-2) 
- (modified) llvm/lib/Target/DirectX/DXILShaderFlags.h (+2-2) 
- (added) llvm/test/CodeGen/DirectX/ShaderFlags/buffers.ll (+23) 
- (added) llvm/test/CodeGen/DirectX/ShaderFlags/buffers_cs4.ll (+24) 


``````````diff
diff --git a/llvm/lib/Target/DirectX/DXILShaderFlags.cpp b/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
index 9fa137b4c025e1..e24b8b5e8e594f 100644
--- a/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
+++ b/llvm/lib/Target/DirectX/DXILShaderFlags.cpp
@@ -13,8 +13,11 @@
 
 #include "DXILShaderFlags.h"
 #include "DirectX.h"
+#include "llvm/Analysis/DXILMetadataAnalysis.h"
+#include "llvm/Analysis/DXILResource.h"
 #include "llvm/IR/Instruction.h"
 #include "llvm/IR/Module.h"
+#include "llvm/Support/DXILABI.h"
 #include "llvm/Support/FormatVariadic.h"
 
 using namespace llvm;
@@ -36,8 +39,35 @@ static void updateFlags(ComputedShaderFlags &Flags, const Instruction &I) {
   }
 }
 
-ComputedShaderFlags ComputedShaderFlags::computeFlags(Module &M) {
+static void updateResourceFlags(ComputedShaderFlags &Flags, Module &M,
+                                ModuleAnalysisManager *AM) {
+  if (!AM)
+    return;
+
+  const DXILResourceMap &DRM = AM->getResult<DXILResourceAnalysis>(M);
+  if (DRM.empty())
+    return;
+
+  const dxil::ModuleMetadataInfo &MMDI = AM->getResult<DXILMetadataAnalysis>(M);
+  VersionTuple SM = MMDI.ShaderModelVersion;
+  Triple::EnvironmentType SP = MMDI.ShaderProfile;
+
+  // RWBuffer
+  for (const ResourceInfo &RI : DRM.uavs()) {
+    if (RI.getResourceKind() == ResourceKind::TypedBuffer) {
+      Flags.EnableRawAndStructuredBuffers = true;
+      Flags.ComputeShadersPlusRawAndStructuredBuffers =
+          (SP == Triple::EnvironmentType::Compute && SM.getMajor() == 4);
+      break;
+    }
+  }
+}
+
+ComputedShaderFlags
+ComputedShaderFlags::computeFlags(Module &M, ModuleAnalysisManager *AM) {
   ComputedShaderFlags Flags;
+  updateResourceFlags(Flags, M, AM);
+
   for (const auto &F : M)
     for (const auto &BB : F)
       for (const auto &I : BB)
@@ -67,7 +97,7 @@ AnalysisKey ShaderFlagsAnalysis::Key;
 
 ComputedShaderFlags ShaderFlagsAnalysis::run(Module &M,
                                              ModuleAnalysisManager &AM) {
-  return ComputedShaderFlags::computeFlags(M);
+  return ComputedShaderFlags::computeFlags(M, &AM);
 }
 
 PreservedAnalyses ShaderFlagsAnalysisPrinter::run(Module &M,
diff --git a/llvm/lib/Target/DirectX/DXILShaderFlags.h b/llvm/lib/Target/DirectX/DXILShaderFlags.h
index 1df7d27de13d3c..86d0a70dcbee10 100644
--- a/llvm/lib/Target/DirectX/DXILShaderFlags.h
+++ b/llvm/lib/Target/DirectX/DXILShaderFlags.h
@@ -60,7 +60,7 @@ struct ComputedShaderFlags {
     return FeatureFlags;
   }
 
-  static ComputedShaderFlags computeFlags(Module &M);
+  static ComputedShaderFlags computeFlags(Module &M, ModuleAnalysisManager *AM);
   void print(raw_ostream &OS = dbgs()) const;
   LLVM_DUMP_METHOD void dump() const { print(); }
 };
@@ -102,7 +102,7 @@ class ShaderFlagsAnalysisWrapper : public ModulePass {
   const ComputedShaderFlags &getShaderFlags() { return Flags; }
 
   bool runOnModule(Module &M) override {
-    Flags = ComputedShaderFlags::computeFlags(M);
+    Flags = ComputedShaderFlags::computeFlags(M, nullptr);
     return false;
   }
 
diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/buffers.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/buffers.ll
new file mode 100644
index 00000000000000..93346c2d5587db
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ShaderFlags/buffers.ll
@@ -0,0 +1,23 @@
+; RUN: opt -S --passes="print-dx-shader-flags" 2>&1 %s | FileCheck %s
+
+target triple = "dxil-pc-shadermodel6.3-compute"
+
+ at G = external constant <4 x float>, align 4
+
+define void @test_bufferflags() {
+
+  ; RWBuffer<int> Buf : register(u7, space2)
+  %uav0 = call target("dx.TypedBuffer", i32, 1, 0, 1)
+      @llvm.dx.handle.fromBinding.tdx.TypedBuffer_i32_1_0t(
+          i32 2, i32 7, i32 1, i32 0, i1 false)
+
+; CHECK: ; Shader Flags Value: 0x00000010
+; CHECK: ; Note: shader requires additional functionality:
+; CHECK-NEXT: ; Note: extra DXIL module flags:
+; CHECK-NEXT: ; D3D11_SB_GLOBAL_FLAG_ENABLE_RAW_AND_STRUCTURED_BUFFERS
+; CHECK-NEXT: {{^;$}}
+
+  ret void
+}
+
+attributes #0 = { nocallback nofree nosync nounwind willreturn memory(none) }
diff --git a/llvm/test/CodeGen/DirectX/ShaderFlags/buffers_cs4.ll b/llvm/test/CodeGen/DirectX/ShaderFlags/buffers_cs4.ll
new file mode 100644
index 00000000000000..21b05e4ef59a22
--- /dev/null
+++ b/llvm/test/CodeGen/DirectX/ShaderFlags/buffers_cs4.ll
@@ -0,0 +1,24 @@
+; RUN: opt -S --passes="print-dx-shader-flags" 2>&1 %s | FileCheck %s
+
+target triple = "dxil-pc-shadermodel4.0-compute"
+
+ at G = external constant <4 x float>, align 4
+
+define void @test_bufferflags() {
+
+  ; RWBuffer<int> Buf : register(u7, space2)
+  %uav0 = call target("dx.TypedBuffer", i32, 1, 0, 1)
+      @llvm.dx.handle.fromBinding.tdx.TypedBuffer_i32_1_0t(
+          i32 2, i32 7, i32 1, i32 0, i1 false)
+
+; CHECK: ; Shader Flags Value: 0x00020010
+; CHECK: ; Note: shader requires additional functionality:
+; CHECK-NEXT: ;       Raw and Structured buffers
+; CHECK-NEXT: ; Note: extra DXIL module flags:
+; CHECK-NEXT: ; D3D11_SB_GLOBAL_FLAG_ENABLE_RAW_AND_STRUCTURED_BUFFERS
+; CHECK-NEXT: {{^;$}}
+
+  ret void
+}
+
+attributes #0 = { nocallback nofree nosync nounwind willreturn memory(none) }

``````````

</details>


https://github.com/llvm/llvm-project/pull/114449


More information about the llvm-commits mailing list