aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/llvm16/tools/llvm-reduce/deltas/ReduceMetadata.cpp
diff options
context:
space:
mode:
authorvvvv <vvvv@ydb.tech>2024-02-06 20:01:22 +0300
committerAlexander Smirnov <alex@ydb.tech>2024-02-09 19:18:27 +0300
commitee2b7fbda052aa09b6fdb83b8c6f0305fef3e193 (patch)
tree102765416c3866bde98a82facc7752d329ee0226 /contrib/libs/llvm16/tools/llvm-reduce/deltas/ReduceMetadata.cpp
parent7494ca32d3a5aca00b7ac527b5f127989335102c (diff)
downloadydb-ee2b7fbda052aa09b6fdb83b8c6f0305fef3e193.tar.gz
llvm16 targets
Diffstat (limited to 'contrib/libs/llvm16/tools/llvm-reduce/deltas/ReduceMetadata.cpp')
-rw-r--r--contrib/libs/llvm16/tools/llvm-reduce/deltas/ReduceMetadata.cpp124
1 files changed, 124 insertions, 0 deletions
diff --git a/contrib/libs/llvm16/tools/llvm-reduce/deltas/ReduceMetadata.cpp b/contrib/libs/llvm16/tools/llvm-reduce/deltas/ReduceMetadata.cpp
new file mode 100644
index 0000000000..d491858db5
--- /dev/null
+++ b/contrib/libs/llvm16/tools/llvm-reduce/deltas/ReduceMetadata.cpp
@@ -0,0 +1,124 @@
+//===- ReduceMetadata.cpp - Specialized Delta Pass ------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements two functions used by the Generic Delta Debugging
+// Algorithm, which are used to reduce Metadata nodes.
+//
+//===----------------------------------------------------------------------===//
+
+#include "ReduceMetadata.h"
+#include "Delta.h"
+#include "llvm/ADT/Sequence.h"
+#include "llvm/ADT/SmallVector.h"
+#include "llvm/IR/InstIterator.h"
+#include "llvm/IR/IntrinsicInst.h"
+#include <vector>
+
+using namespace llvm;
+
+static bool shouldKeepDebugIntrinsicMetadata(Instruction &I, MDNode &MD) {
+ return isa<DILocation>(MD) && isa<DbgInfoIntrinsic>(I);
+}
+
+static bool shouldKeepDebugNamedMetadata(NamedMDNode &MD) {
+ return MD.getName() == "llvm.dbg.cu" && MD.getNumOperands() != 0;
+}
+
+// Named metadata with simple list-like behavior, so that it's valid to remove
+// operands individually.
+static constexpr StringLiteral ListNamedMetadata[] = {
+ "llvm.module.flags",
+ "llvm.ident",
+ "opencl.spir.version",
+ "opencl.ocl.version",
+ "opencl.used.extensions",
+ "opencl.used.optional.core.features",
+ "opencl.compiler.options"
+};
+
+/// Remove unneeded arguments to named metadata.
+static void reduceNamedMetadataOperands(Oracle &O, ReducerWorkItem &WorkItem) {
+ Module &M = WorkItem.getModule();
+
+ for (StringRef MDName : ListNamedMetadata) {
+ NamedMDNode *NamedNode = M.getNamedMetadata(MDName);
+ if (!NamedNode)
+ continue;
+
+ bool MadeChange = false;
+ SmallVector<MDNode *, 16> KeptOperands;
+ for (auto I : seq<unsigned>(0, NamedNode->getNumOperands())) {
+ if (O.shouldKeep())
+ KeptOperands.push_back(NamedNode->getOperand(I));
+ else
+ MadeChange = true;
+ }
+
+ if (MadeChange) {
+ NamedNode->clearOperands();
+ for (MDNode *KeptOperand : KeptOperands)
+ NamedNode->addOperand(KeptOperand);
+ }
+ }
+}
+
+/// Removes all the Named and Unnamed Metadata Nodes, as well as any debug
+/// functions that aren't inside the desired Chunks.
+static void extractMetadataFromModule(Oracle &O, ReducerWorkItem &WorkItem) {
+ Module &Program = WorkItem.getModule();
+
+ // Get out-of-chunk Named metadata nodes
+ SmallVector<NamedMDNode *> NamedNodesToDelete;
+ for (NamedMDNode &MD : Program.named_metadata())
+ if (!shouldKeepDebugNamedMetadata(MD) && !O.shouldKeep())
+ NamedNodesToDelete.push_back(&MD);
+
+ for (NamedMDNode *NN : NamedNodesToDelete) {
+ for (auto I : seq<unsigned>(0, NN->getNumOperands()))
+ NN->setOperand(I, nullptr);
+ NN->eraseFromParent();
+ }
+
+ // Delete out-of-chunk metadata attached to globals.
+ for (GlobalVariable &GV : Program.globals()) {
+ SmallVector<std::pair<unsigned, MDNode *>> MDs;
+ GV.getAllMetadata(MDs);
+ for (std::pair<unsigned, MDNode *> &MD : MDs)
+ if (!O.shouldKeep())
+ GV.setMetadata(MD.first, nullptr);
+ }
+
+ for (Function &F : Program) {
+ {
+ SmallVector<std::pair<unsigned, MDNode *>> MDs;
+ // Delete out-of-chunk metadata attached to functions.
+ F.getAllMetadata(MDs);
+ for (std::pair<unsigned, MDNode *> &MD : MDs)
+ if (!O.shouldKeep())
+ F.setMetadata(MD.first, nullptr);
+ }
+
+ // Delete out-of-chunk metadata attached to instructions.
+ for (Instruction &I : instructions(F)) {
+ SmallVector<std::pair<unsigned, MDNode *>> MDs;
+ I.getAllMetadata(MDs);
+ for (std::pair<unsigned, MDNode *> &MD : MDs) {
+ if (!shouldKeepDebugIntrinsicMetadata(I, *MD.second) && !O.shouldKeep())
+ I.setMetadata(MD.first, nullptr);
+ }
+ }
+ }
+}
+
+void llvm::reduceMetadataDeltaPass(TestRunner &Test) {
+ runDeltaPass(Test, extractMetadataFromModule, "Reducing Metadata");
+}
+
+void llvm::reduceNamedMetadataDeltaPass(TestRunner &Test) {
+ runDeltaPass(Test, reduceNamedMetadataOperands, "Reducing Named Metadata");
+}