diff options
author | vvvv <vvvv@ydb.tech> | 2024-02-06 20:01:22 +0300 |
---|---|---|
committer | Alexander Smirnov <alex@ydb.tech> | 2024-02-09 19:18:27 +0300 |
commit | ee2b7fbda052aa09b6fdb83b8c6f0305fef3e193 (patch) | |
tree | 102765416c3866bde98a82facc7752d329ee0226 /contrib/libs/llvm16/tools/llvm-reduce/deltas/ReduceMetadata.cpp | |
parent | 7494ca32d3a5aca00b7ac527b5f127989335102c (diff) | |
download | ydb-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.cpp | 124 |
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"); +} |