[llvm] 73ebb05 - [DirectX] Support opaque ptr for ValueAsMetadata in DXILBitcodeWriter

Xiang Li via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 22 09:10:49 PDT 2022


Author: Xiang Li
Date: 2022-06-22T09:10:42-07:00
New Revision: 73ebb05e4423246c7ca8c084abb5666cdf2611ab

URL: https://github.com/llvm/llvm-project/commit/73ebb05e4423246c7ca8c084abb5666cdf2611ab
DIFF: https://github.com/llvm/llvm-project/commit/73ebb05e4423246c7ca8c084abb5666cdf2611ab.diff

LOG: [DirectX] Support opaque ptr for ValueAsMetadata in DXILBitcodeWriter

When writeValueAsMetadata for GlobalVariable and Function, write TypedPointerType for ValueType and FunctionType.

Reviewed By: bogner

Differential Revision: https://reviews.llvm.org/D127705

Added: 
    llvm/test/tools/dxil-dis/opaque-value_as_metadata.ll

Modified: 
    llvm/lib/Target/DirectX/DXILWriter/DXILBitcodeWriter.cpp
    llvm/lib/Target/DirectX/DXILWriter/DXILValueEnumerator.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/DirectX/DXILWriter/DXILBitcodeWriter.cpp b/llvm/lib/Target/DirectX/DXILWriter/DXILBitcodeWriter.cpp
index 0e2773af930eb..593897d4d00c9 100644
--- a/llvm/lib/Target/DirectX/DXILWriter/DXILBitcodeWriter.cpp
+++ b/llvm/lib/Target/DirectX/DXILWriter/DXILBitcodeWriter.cpp
@@ -1357,7 +1357,12 @@ void DXILBitcodeWriter::writeValueAsMetadata(
     const ValueAsMetadata *MD, SmallVectorImpl<uint64_t> &Record) {
   // Mimic an MDNode with a value as one operand.
   Value *V = MD->getValue();
-  Record.push_back(getTypeID(V->getType()));
+  Type *Ty = V->getType();
+  if (Function *F = dyn_cast<Function>(V))
+    Ty = TypedPointerType::get(F->getFunctionType(), F->getAddressSpace());
+  else if (GlobalVariable *GV = dyn_cast<GlobalVariable>(V))
+    Ty = TypedPointerType::get(GV->getValueType(), GV->getAddressSpace());
+  Record.push_back(getTypeID(Ty));
   Record.push_back(VE.getValueID(V));
   Stream.EmitRecord(bitc::METADATA_VALUE, Record, 0);
   Record.clear();

diff  --git a/llvm/lib/Target/DirectX/DXILWriter/DXILValueEnumerator.cpp b/llvm/lib/Target/DirectX/DXILWriter/DXILValueEnumerator.cpp
index 69c3d56ae2fb2..08944ee3f1fef 100644
--- a/llvm/lib/Target/DirectX/DXILWriter/DXILValueEnumerator.cpp
+++ b/llvm/lib/Target/DirectX/DXILWriter/DXILValueEnumerator.cpp
@@ -12,6 +12,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "DXILValueEnumerator.h"
+#include "DXILPointerType.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/Config/llvm-config.h"
 #include "llvm/IR/Argument.h"
@@ -373,6 +374,8 @@ ValueEnumerator::ValueEnumerator(const Module &M, Type *PrefixType) {
   for (const Function &F : M) {
     EnumerateValue(&F);
     EnumerateType(F.getValueType());
+    EnumerateType(
+        dxil::TypedPointerType::get(F.getFunctionType(), F.getAddressSpace()));
     EnumerateAttributes(F.getAttributes());
   }
 
@@ -392,6 +395,8 @@ ValueEnumerator::ValueEnumerator(const Module &M, Type *PrefixType) {
   for (const GlobalVariable &GV : M.globals()) {
     if (GV.hasInitializer())
       EnumerateValue(GV.getInitializer());
+    EnumerateType(
+        dxil::TypedPointerType::get(GV.getValueType(), GV.getAddressSpace()));
     if (GV.hasAttributes())
       EnumerateAttributes(GV.getAttributesAsList(AttributeList::FunctionIndex));
   }

diff  --git a/llvm/test/tools/dxil-dis/opaque-value_as_metadata.ll b/llvm/test/tools/dxil-dis/opaque-value_as_metadata.ll
new file mode 100644
index 0000000000000..9645db685d51c
--- /dev/null
+++ b/llvm/test/tools/dxil-dis/opaque-value_as_metadata.ll
@@ -0,0 +1,29 @@
+; RUN: llc --filetype=obj %s -o - 2>&1 | dxil-dis -o - | FileCheck %s
+target datalayout = "e-m:e-p:32:32-i1:32-i8:32-i16:32-i32:32-i64:64-f16:32-f32:32-f64:64-n8:16:32:64"
+target triple = "dxil-ms-dx"
+
+%"$Globals" = type { float }
+
+ at CBV = external constant %"$Globals"
+
+define void @main() {
+  ret void
+}
+
+!llvm.ident = !{!0}
+!dx.version = !{!1}
+!dx.valver = !{!2}
+!dx.shaderModel = !{!3}
+!dx.entryPoints = !{!8}
+
+!0 = !{!"clang version 15.0.0"}
+!1 = !{i32 1, i32 0}
+!2 = !{i32 1, i32 7}
+!3 = !{!"ps", i32 6, i32 0}
+!4 = !{null, null, !5, null}
+!5 = !{!6}
+; CHECK-DAG:!{{[0-9]+}} = !{i32 0, %"$Globals"* @CBV
+!6 = !{i32 0, ptr @CBV, !"", i32 0, i32 0, i32 1, i32 4, null}
+!7 = !{[2 x i32] [i32 0, i32 1]}
+; CHECK-DAG:!{{[0-9]+}} = !{void ()* @main
+!8 = !{ptr @main, !"main", null, !4, null}


        


More information about the llvm-commits mailing list