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

Justin Bogner via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 14 11:02:15 PDT 2023


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

>From bb2e622ce42b1e8d586ea2a4cdbed86b3e85eb55 Mon Sep 17 00:00:00 2001
From: Justin Bogner <mail at justinbogner.com>
Date: Tue, 12 Sep 2023 15:24:34 -0700
Subject: [PATCH] [Transforms][DXIL] Wire up a basic DXILUpgrade pass

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.
---
 .../llvm/Transforms/Utils/DXILUpgrade.h       | 24 +++++++++++++
 llvm/lib/Passes/PassBuilder.cpp               |  1 +
 llvm/lib/Passes/PassRegistry.def              |  1 +
 llvm/lib/Transforms/Utils/CMakeLists.txt      |  1 +
 llvm/lib/Transforms/Utils/DXILUpgrade.cpp     | 36 +++++++++++++++++++
 .../Transforms/DXILUpgrade/strip-valver.ll    | 18 ++++++++++
 6 files changed, 81 insertions(+)
 create mode 100644 llvm/include/llvm/Transforms/Utils/DXILUpgrade.h
 create mode 100644 llvm/lib/Transforms/Utils/DXILUpgrade.cpp
 create mode 100644 llvm/test/Transforms/DXILUpgrade/strip-valver.ll

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'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}



More information about the llvm-commits mailing list