[llvm] [llvm-remarkutil] Add an instruction-mix tool (PR #140598)

Tobias Stadler via llvm-commits llvm-commits at lists.llvm.org
Wed May 28 13:05:07 PDT 2025


================
@@ -0,0 +1,150 @@
+//===- RemarkInstructionMix.cpp -------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+//
+// Generic tool to extract instruction mix from asm-printer remarks.
+//
+//===----------------------------------------------------------------------===//
+
+#include "RemarkUtilHelpers.h"
+#include "RemarkUtilRegistry.h"
+
+#include "llvm/Support/Format.h"
+#include "llvm/Support/FormattedStream.h"
+#include "llvm/Support/Regex.h"
+
+#include <cmath>
+#include <numeric>
+
+using namespace llvm;
+using namespace remarks;
+using namespace llvm::remarkutil;
+
+namespace instructionmix {
+
+static cl::SubCommand
+    InstructionMix("instruction-mix",
+                   "Instruction Mix (requires asm-printer remarks)");
+
+static cl::opt<std::string>
+    FunctionFilter("filter", cl::sub(InstructionMix), cl::ValueOptional,
+                   cl::desc("Optional function name to filter collection by"));
+
+static cl::opt<std::string>
+    FunctionFilterRE("rfilter", cl::sub(InstructionMix), cl::ValueOptional,
+                     cl::desc("Optional function name to filter collection by "
+                              "(accepts regular expressions)"));
+
+enum ReportStyleOptions { human_output, csv_output };
+static cl::opt<ReportStyleOptions> ReportStyle(
+    "report_style", cl::sub(InstructionMix),
+    cl::init(ReportStyleOptions::human_output),
+    cl::desc("Choose the report output format:"),
+    cl::values(clEnumValN(human_output, "human", "Human-readable format"),
+               clEnumValN(csv_output, "csv", "CSV format")));
+
+INPUT_FORMAT_COMMAND_LINE_OPTIONS(InstructionMix)
+INPUT_OUTPUT_COMMAND_LINE_OPTIONS(InstructionMix)
+
+static Expected<FilterMatcher> getRemarkFilter() {
+  if (FunctionFilter.getNumOccurrences())
+    return FilterMatcher::createExact(FunctionFilter);
+  if (FunctionFilterRE.getNumOccurrences())
+    return FilterMatcher::createRE(FunctionFilterRE);
+  return FilterMatcher::createAny();
+}
+
+static Error tryInstructionMix() {
+  auto MaybeOF =
+      getOutputFileWithFlags(OutputFileName, sys::fs::OF_TextWithCRLF);
+  if (!MaybeOF)
+    return MaybeOF.takeError();
+
+  auto OF = std::move(*MaybeOF);
+  auto MaybeBuf = getInputMemoryBuffer(InputFileName);
+  if (!MaybeBuf)
+    return MaybeBuf.takeError();
+  auto MaybeParser = createRemarkParser(InputFormat, (*MaybeBuf)->getBuffer());
+  if (!MaybeParser)
+    return MaybeParser.takeError();
+
+  Expected<FilterMatcher> Filter = getRemarkFilter();
+  if (!Filter)
+    return Filter.takeError();
+
+  // Collect the histogram of instruction counts.
+  std::unordered_map<std::string, unsigned> Histogram;
----------------
tobias-stadler wrote:

Unless I'm missing something, the remark parser doesn't release ownership of any of the returned strings. The strings in the remarks are StringRefs that are alive at least until the RemarkParser is destroyed. They are either owned by the memory buffer or by the RemarkParser itself (if the Remark metadata and remarks file are split into different files)

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


More information about the llvm-commits mailing list