[llvm] [Transforms][DXIL] Wire up a basic DXILUpgrade pass (PR #66275)

via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 13 11:54:36 PDT 2023


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-llvm-transforms
            
<details>
<summary>Changes</summary>
This pass will upgrade DXIL-style llvm constructs (which are mostly metadata) into the representations we use in LLVM for the same concepts.

For now we just strip the valver metadata, which we don't need. Later changes will make this pass more useful, and then we should be able to wire it into clang and possibly the DirectX backend's AsmParser.
--
Full diff: https://github.com/llvm/llvm-project/pull/66275.diff

6 Files Affected:

- (added) llvm/include/llvm/Transforms/Utils/DXILUpgrade.h (+24) 
- (modified) llvm/lib/Passes/PassBuilder.cpp (+1) 
- (modified) llvm/lib/Passes/PassRegistry.def (+1) 
- (modified) llvm/lib/Transforms/Utils/CMakeLists.txt (+1) 
- (added) llvm/lib/Transforms/Utils/DXILUpgrade.cpp (+36) 
- (added) llvm/test/Transforms/DXILUpgrade/strip-valver.ll (+18) 


<pre>
diff --git a/llvm/include/llvm/Transforms/Utils/DXILUpgrade.h b/llvm/include/llvm/Transforms/Utils/DXILUpgrade.h
new file mode 100644
index 000000000000000..4c74976093f1f8f
--- /dev/null
+++ b/llvm/include/llvm/Transforms/Utils/DXILUpgrade.h
@@ -0,0 +1,24 @@
+//===- DXILUpgrade.h - Upgrade DXIL metadata to LLVM constructs -*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_TRANSFORMS_UTILS_DXILUPGRADE_H
+#define LLVM_TRANSFORMS_UTILS_DXILUPGRADE_H
+
+#include "llvm/IR/PassManager.h"
+
+namespace llvm {
+
+/// Upgrade DXIL-style metadata into their LLVM representations
+class DXILUpgradePass : public PassInfoMixin<DXILUpgradePass> {
+public:
+  PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM);
+};
+
+} // namespace llvm
+
+#endif // LLVM_TRANSFORMS_UTILS_DXILUPGRADE_H
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index 1fdeb13706ca6aa..5c7f26109930c9d 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -233,6 +233,7 @@
 #include "llvm/Transforms/Utils/CanonicalizeFreezeInLoops.h"
 #include "llvm/Transforms/Utils/CountVisits.h"
 #include "llvm/Transforms/Utils/Debugify.h"
+#include "llvm/Transforms/Utils/DXILUpgrade.h"
 #include "llvm/Transforms/Utils/EntryExitInstrumenter.h"
 #include "llvm/Transforms/Utils/FixIrreducible.h"
 #include "llvm/Transforms/Utils/HelloWorld.h"
diff --git a/llvm/lib/Passes/PassRegistry.def b/llvm/lib/Passes/PassRegistry.def
index adfbce53f56f180..b9aa015d02dd95d 100644
--- a/llvm/lib/Passes/PassRegistry.def
+++ b/llvm/lib/Passes/PassRegistry.def
@@ -57,6 +57,7 @@ MODULE_PASS("cross-dso-cfi", CrossDSOCFIPass())
 MODULE_PASS("deadargelim", DeadArgumentEliminationPass())
 MODULE_PASS("debugify", NewPMDebugifyPass())
 MODULE_PASS("dot-callgraph", CallGraphDOTPrinterPass())
+MODULE_PASS("dxil-upgrade", DXILUpgradePass())
 MODULE_PASS("elim-avail-extern", EliminateAvailableExternallyPass())
 MODULE_PASS("extract-blocks", BlockExtractorPass({}, false))
 MODULE_PASS("forceattrs", ForceFunctionAttrsPass())
diff --git a/llvm/lib/Transforms/Utils/CMakeLists.txt b/llvm/lib/Transforms/Utils/CMakeLists.txt
index a870071f3f641dc..e971c638327bf05 100644
--- a/llvm/lib/Transforms/Utils/CMakeLists.txt
+++ b/llvm/lib/Transforms/Utils/CMakeLists.txt
@@ -20,6 +20,7 @@ add_llvm_component_library(LLVMTransformUtils
   CountVisits.cpp
   Debugify.cpp
   DemoteRegToStack.cpp
+  DXILUpgrade.cpp
   EntryExitInstrumenter.cpp
   EscapeEnumerator.cpp
   Evaluator.cpp
diff --git a/llvm/lib/Transforms/Utils/DXILUpgrade.cpp b/llvm/lib/Transforms/Utils/DXILUpgrade.cpp
new file mode 100644
index 000000000000000..735686ddce381b7
--- /dev/null
+++ b/llvm/lib/Transforms/Utils/DXILUpgrade.cpp
@@ -0,0 +1,36 @@
+//===- DXILUpgrade.cpp - Upgrade DXIL metadata to LLVM constructs ---------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/Transforms/Utils/DXILUpgrade.h"
+
+using namespace llvm;
+
+static bool handleValVerMetadata(Module &M) {
+  NamedMDNode *ValVer = M.getNamedMetadata("dx.valver");
+  if (!ValVer)
+    return false;
+
+  // We don&#x27;t need the validation version internally, so we drop it.
+  ValVer->dropAllReferences();
+  ValVer->eraseFromParent();
+  return true;
+}
+
+PreservedAnalyses DXILUpgradePass::run(Module &M, ModuleAnalysisManager &AM) {
+  PreservedAnalyses PA;
+  // We never add, remove, or change functions here.
+  PA.preserve<FunctionAnalysisManagerModuleProxy>();
+  PA.preserveSet<AllAnalysesOn<Function>>();
+
+  bool Changed = false;
+  Changed |= handleValVerMetadata(M);
+
+  if (!Changed)
+    return PreservedAnalyses::all();
+  return PA;
+}
diff --git a/llvm/test/Transforms/DXILUpgrade/strip-valver.ll b/llvm/test/Transforms/DXILUpgrade/strip-valver.ll
new file mode 100644
index 000000000000000..718cfeb59863d76
--- /dev/null
+++ b/llvm/test/Transforms/DXILUpgrade/strip-valver.ll
@@ -0,0 +1,18 @@
+; RUN: opt -passes=dxil-upgrade -S < %s | FileCheck %s
+
+; Ensure that both the valver metadata and its operand are removed.
+; CHECK: !unrelated_md1 = !{!0}
+; CHECK-NOT: !dx.valver
+; CHECK: !unrelated_md2 = !{!1}
+;
+; CHECK: !0 = !{i32 1234}
+; CHECK-NOT: !{i32 1, i32 7}
+; CHECK: !1 = !{i32 4321}
+
+!unrelated_md1 = !{!0}
+!dx.valver = !{!1}
+!unrelated_md2 = !{!2}
+
+!0 = !{i32 1234}
+!1 = !{i32 1, i32 7}
+!2 = !{i32 4321}
</pre>
</details>


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


More information about the llvm-commits mailing list