LLVM: lib/CodeGen/MIR2Vec.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
24
25using namespace llvm;
27
28#define DEBUG_TYPE "mir2vec"
29
31 "Number of lookups to MIR entities not present in the vocabulary");
32
33namespace llvm {
36
37
40 cl::desc("Path to the vocabulary file for MIR2Vec"), cl::init(""),
43 cl::desc("Weight for machine opcode embeddings"),
50 cl::desc("Weight for register operand embeddings"),
55 "Generate symbolic embeddings for MIR")),
58
59}
60}
61
62
63
64
65
67 VocabMap &&PhysicalRegisterMap,
68 VocabMap &&VirtualRegisterMap,
73 buildCanonicalOpcodeMapping();
74 unsigned CanonicalOpcodeCount = UniqueBaseOpcodeNames.size();
75 assert(CanonicalOpcodeCount > 0 &&
76 "No canonical opcodes found for target - invalid vocabulary");
77
78 buildRegisterOperandMapping();
79
80
81 Layout.OpcodeBase = 0;
82 Layout.CommonOperandBase = CanonicalOpcodeCount;
83
84 Layout.PhyRegBase = Layout.CommonOperandBase + std::size(CommonOperandNames);
85 Layout.VirtRegBase = Layout.PhyRegBase + RegisterOperandNames.size();
86
87 generateStorage(OpcodeMap, CommonOperandMap, PhysicalRegisterMap,
88 VirtualRegisterMap);
89 Layout.TotalEntries = Storage.size();
90}
91
94 VocabMap &&PhyRegMap, VocabMap &&VirtRegMap,
97 if (OpcodeMap.empty() || CommonOperandMap.empty() || PhyRegMap.empty() ||
100 "Empty vocabulary entries provided");
101
102 MIRVocabulary Vocab(std::move(OpcodeMap), std::move(CommonOperandMap),
103 std::move(PhyRegMap), std::move(VirtRegMap), TII, TRI,
104 MRI);
105
106
107 if (!Vocab.Storage.isValid())
109 "Failed to create valid vocabulary storage");
111 return std::move(Vocab);
112}
113
115
116
117
118
119
120
121
122
123
124
125
126 assert(!InstrName.empty() && "Instruction name should not be empty");
127
128
129 static const Regex BaseOpcodeRegex("([a-zA-Z_]+)");
131
132 if (BaseOpcodeRegex.match(InstrName, &Matches) && Matches.size() > 1) {
134
135 while (!Match.empty() && Match.back() == '_')
137 return Match.str();
138 }
139
140
141 return InstrName.str();
142}
143
145 assert(!UniqueBaseOpcodeNames.empty() && "Canonical mapping not built");
146 auto It = std::find(UniqueBaseOpcodeNames.begin(),
147 UniqueBaseOpcodeNames.end(), BaseName.str());
148 assert(It != UniqueBaseOpcodeNames.end() &&
149 "Base name not found in unique opcodes");
150 return std::distance(UniqueBaseOpcodeNames.begin(), It);
151}
152
153unsigned MIRVocabulary::getCanonicalOpcodeIndex(unsigned Opcode) const {
154 auto BaseOpcode = extractBaseOpcodeName(TII.getName(Opcode));
155 return getCanonicalIndexForBaseName(BaseOpcode);
156}
157
158unsigned
160 auto It = std::find(std::begin(CommonOperandNames),
161 std::end(CommonOperandNames), OperandName);
162 assert(It != std::end(CommonOperandNames) &&
163 "Operand name not found in common operands");
164 return Layout.CommonOperandBase +
165 std::distance(std::begin(CommonOperandNames), It);
166}
167
168unsigned
170 bool IsPhysical) const {
171 auto It = std::find(RegisterOperandNames.begin(), RegisterOperandNames.end(),
173 assert(It != RegisterOperandNames.end() &&
174 "Register name not found in register operands");
175 unsigned LocalIndex = std::distance(RegisterOperandNames.begin(), It);
176 return (IsPhysical ? Layout.PhyRegBase : Layout.VirtRegBase) + LocalIndex;
177}
178
180 assert(Pos < Layout.TotalEntries && "Position out of bounds in vocabulary");
181
182
183 if (Pos < Layout.CommonOperandBase) {
184
185 auto It = UniqueBaseOpcodeNames.begin();
186 std::advance(It, Pos);
187 assert(It != UniqueBaseOpcodeNames.end() &&
188 "Canonical index out of bounds in opcode section");
189 return *It;
190 }
191
192 auto getLocalIndex = [](unsigned Pos, size_t BaseOffset, size_t Bound,
193 const char *Msg) {
194 unsigned LocalIndex = Pos - BaseOffset;
195 assert(LocalIndex < Bound && Msg);
196 return LocalIndex;
197 };
198
199
200 if (Pos < Layout.PhyRegBase) {
201 unsigned LocalIndex = getLocalIndex(
202 Pos, Layout.CommonOperandBase, std::size(CommonOperandNames),
203 "Local index out of bounds in common operands");
204 return CommonOperandNames[LocalIndex].str();
205 }
206
207
208 if (Pos < Layout.VirtRegBase) {
209 unsigned LocalIndex =
210 getLocalIndex(Pos, Layout.PhyRegBase, RegisterOperandNames.size(),
211 "Local index out of bounds in physical registers");
212 return "PhyReg_" + RegisterOperandNames[LocalIndex];
213 }
214
215
216 unsigned LocalIndex =
217 getLocalIndex(Pos, Layout.VirtRegBase, RegisterOperandNames.size(),
218 "Local index out of bounds in virtual registers");
219 return "VirtReg_" + RegisterOperandNames[LocalIndex];
220}
221
222void MIRVocabulary::generateStorage(const VocabMap &OpcodeMap,
223 const VocabMap &CommonOperandsMap,
224 const VocabMap &PhyRegMap,
226
227
228
229
230 auto handleMissingEntity = [](StringRef Key) {
231 LLVM_DEBUG(errs() << "MIR2Vec: Missing vocabulary entry for " << Key
232 << "; using zero vector. This will result in an error "
233 "in the future.\n");
234 ++MIRVocabMissCounter;
235 };
236
237
238 unsigned EmbeddingDim = OpcodeMap.begin()->second.size();
239 std::vector OpcodeEmbeddings(Layout.CommonOperandBase,
241
242
243 for (auto COpcodeName : UniqueBaseOpcodeNames) {
244 if (auto It = OpcodeMap.find(COpcodeName); It != OpcodeMap.end()) {
245 auto COpcodeIndex = getCanonicalIndexForBaseName(COpcodeName);
246 assert(COpcodeIndex < Layout.CommonOperandBase &&
247 "Canonical index out of bounds");
248 OpcodeEmbeddings[COpcodeIndex] = It->second;
249 } else {
250 handleMissingEntity(COpcodeName);
251 }
252 }
253
254
255 std::vector CommonOperandEmbeddings(std::size(CommonOperandNames),
257 unsigned OperandIndex = 0;
258 for (const auto &CommonOperandName : CommonOperandNames) {
259 if (auto It = CommonOperandsMap.find(CommonOperandName.str());
260 It != CommonOperandsMap.end()) {
261 CommonOperandEmbeddings[OperandIndex] = It->second;
262 } else {
263 handleMissingEntity(CommonOperandName);
264 }
265 ++OperandIndex;
266 }
267
268
269 auto createRegisterEmbeddings = [&](const VocabMap &RegMap) {
270 std::vector RegEmbeddings(TRI.getNumRegClasses(),
272 unsigned RegOperandIndex = 0;
273 for (const auto &RegOperandName : RegisterOperandNames) {
274 if (auto It = RegMap.find(RegOperandName); It != RegMap.end())
275 RegEmbeddings[RegOperandIndex] = It->second;
276 else
277 handleMissingEntity(RegOperandName);
278 ++RegOperandIndex;
279 }
280 return RegEmbeddings;
281 };
282
283
284 std::vector PhyRegEmbeddings = createRegisterEmbeddings(PhyRegMap);
285 std::vector VirtRegEmbeddings =
286 createRegisterEmbeddings(VirtRegMap);
287
288
289 auto scaleVocabSection = [](std::vector &Embeddings,
290 double Weight) {
291 for (auto &Embedding : Embeddings)
293 };
294 scaleVocabSection(OpcodeEmbeddings, OpcWeight);
298
299 std::vector<std::vector> Sections(
300 static_cast<unsigned>(Section::MaxSections));
301 Sections[static_cast<unsigned>(Section::Opcodes)] =
302 std::move(OpcodeEmbeddings);
303 Sections[static_cast<unsigned>(Section::CommonOperands)] =
304 std::move(CommonOperandEmbeddings);
305 Sections[static_cast<unsigned>(Section::PhyRegisters)] =
306 std::move(PhyRegEmbeddings);
307 Sections[static_cast<unsigned>(Section::VirtRegisters)] =
308 std::move(VirtRegEmbeddings);
309
311}
312
313void MIRVocabulary::buildCanonicalOpcodeMapping() {
314
315 if (!UniqueBaseOpcodeNames.empty())
316 return;
317
318
319 for (unsigned Opcode = 0; Opcode < TII.getNumOpcodes(); ++Opcode) {
320 std::string BaseOpcode = extractBaseOpcodeName(TII.getName(Opcode));
321 UniqueBaseOpcodeNames.insert(BaseOpcode);
322 }
323
324 LLVM_DEBUG(dbgs() << "MIR2Vec: Built canonical mapping for target with "
325 << UniqueBaseOpcodeNames.size()
326 << " unique base opcodes\n");
327}
328
329void MIRVocabulary::buildRegisterOperandMapping() {
330
331 if (!RegisterOperandNames.empty())
332 return;
333
334 for (unsigned RC = 0; RC < TRI.getNumRegClasses(); ++RC) {
336 if (!RegClass)
337 continue;
338
339
340 StringRef ClassName = TRI.getRegClassName(RegClass);
341 RegisterOperandNames.push_back(ClassName.str());
342 }
343}
344
345unsigned MIRVocabulary::getCommonOperandIndex(
348 "Expected non-register operand type");
351 return static_cast<unsigned>(OperandType) - 1;
352}
353
354unsigned MIRVocabulary::getRegisterOperandIndex(Register Reg) const {
355 assert(!RegisterOperandNames.empty() && "Register operand mapping not built");
356 assert(Reg.isValid() && "Invalid register; not expected here");
358 "Expected a physical or virtual register");
359
361
362
363
364
366 RegClass = TRI.getMinimalPhysRegClass(Reg);
367 else
368 RegClass = MRI.getRegClass(Reg);
369
370 if (RegClass)
371 return RegClass->getID();
372
373 llvm_unreachable("Register operand without a valid register class");
374 return 0;
375}
376
380 assert(Dim > 0 && "Dimension must be greater than zero");
381
382 float DummyVal = 0.1f;
383
384 VocabMap DummyOpcMap, DummyOperandMap, DummyPhyRegMap, DummyVirtRegMap;
385
386
387 for (unsigned Opcode = 0; Opcode < TII.getNumOpcodes(); ++Opcode) {
389 if (DummyOpcMap.count(BaseOpcode) == 0) {
390 DummyOpcMap[BaseOpcode] = Embedding(Dim, DummyVal);
391 DummyVal += 0.1f;
392 }
393 }
394
395
396 for (const auto &CommonOperandName : CommonOperandNames) {
397 DummyOperandMap[CommonOperandName.str()] = Embedding(Dim, DummyVal);
398 DummyVal += 0.1f;
399 }
400
401
402 for (unsigned RC = 0; RC < TRI.getNumRegClasses(); ++RC) {
404 if (!RegClass)
405 continue;
406
407 std::string ClassName = TRI.getRegClassName(RegClass);
408 DummyPhyRegMap[ClassName] = Embedding(Dim, DummyVal);
409 DummyVirtRegMap[ClassName] = Embedding(Dim, DummyVal);
410 DummyVal += 0.1f;
411 }
412
413
415 std::move(DummyOpcMap), std::move(DummyOperandMap),
416 std::move(DummyPhyRegMap), std::move(DummyVirtRegMap), TII, TRI, MRI);
417}
418
419
420
421
422
425 VocabMap OpcVocab, CommonOperandVocab, PhyRegVocabMap, VirtRegVocabMap;
426
427 if (Error Err = readVocabulary(OpcVocab, CommonOperandVocab, PhyRegVocabMap,
428 VirtRegVocabMap))
429 return std::move(Err);
430
431 for (const auto &F : M) {
432 if (F.isDeclaration())
433 continue;
434
435 if (auto *MF = MMI.getMachineFunction(F)) {
436 auto &Subtarget = MF->getSubtarget();
437 if (const auto *TII = Subtarget.getInstrInfo())
438 if (const auto *TRI = Subtarget.getRegisterInfo())
440 std::move(OpcVocab), std::move(CommonOperandVocab),
441 std::move(PhyRegVocabMap), std::move(VirtRegVocabMap), *TII, *TRI,
442 MF->getRegInfo());
443 }
444 }
446 "No machine functions found in module");
447}
448
449Error MIR2VecVocabProvider::readVocabulary(VocabMap &OpcodeVocab,
450 VocabMap &CommonOperandVocab,
451 VocabMap &PhyRegVocabMap,
452 VocabMap &VirtRegVocabMap) {
456 "MIR2Vec vocabulary file path not specified; set it "
457 "using --mir2vec-vocab-path");
458
460 if (!BufOrError)
462
463 auto Content = BufOrError.get()->getBuffer();
464
466 if (!ParsedVocabValue)
467 return ParsedVocabValue.takeError();
468
469 unsigned OpcodeDim = 0, CommonOperandDim = 0, PhyRegOperandDim = 0,
470 VirtRegOperandDim = 0;
472 "Opcodes", *ParsedVocabValue, OpcodeVocab, OpcodeDim))
473 return Err;
474
476 "CommonOperands", *ParsedVocabValue, CommonOperandVocab,
477 CommonOperandDim))
478 return Err;
479
481 "PhysicalRegisters", *ParsedVocabValue, PhyRegVocabMap,
482 PhyRegOperandDim))
483 return Err;
484
486 "VirtualRegisters", *ParsedVocabValue, VirtRegVocabMap,
487 VirtRegOperandDim))
488 return Err;
489
490
491 if (!(OpcodeDim == CommonOperandDim && CommonOperandDim == PhyRegOperandDim &&
492 PhyRegOperandDim == VirtRegOperandDim)) {
495 "MIR2Vec vocabulary sections have different dimensions");
496 }
497
499}
500
503 "MIR2Vec Vocabulary Analysis", false, true)
507
509 return "MIR2Vec Vocabulary Analysis";
510}
511
512
513
514
515
519 switch (Mode) {
521 return std::make_unique(MF, Vocab);
522 }
523 return nullptr;
524}
525
528
529
530 const auto &Subtarget = MF.getSubtarget();
531 const auto *TII = Subtarget.getInstrInfo();
532 if () {
533 MF.getFunction().getContext().emitError(
534 "MIR2Vec: No TargetInstrInfo available; cannot compute embeddings");
536 }
537
538
539 for (const auto &MI : MBB) {
540
541 if (MI.isDebugInstr())
542 continue;
544 }
545
547}
548
551
552
555 return MFuncVector;
556}
557
561
562std::unique_ptr
565 return std::make_unique(MF, Vocab);
566}
567
569
570 if (MI.isDebugInstr())
572
573
575
576
578 InstructionEmbedding += Vocab[MO];
579
580 return InstructionEmbedding;
581}
582
583
584
585
586
589 "MIR2Vec Vocabulary Printer Pass", false, true)
593 "MIR2Vec Vocabulary Printer Pass", false, true)
594
598
601 auto MIR2VecVocabOrErr = Analysis.getMIR2VecVocabulary(M);
602
603 if (!MIR2VecVocabOrErr) {
604 OS << "MIR2Vec Vocabulary Printer: Failed to get vocabulary - "
605 << toString(MIR2VecVocabOrErr.takeError()) << "\n";
606 return false;
607 }
608
609 auto &MIR2VecVocab = *MIR2VecVocabOrErr;
610 unsigned Pos = 0;
611 for (const auto &Entry : MIR2VecVocab) {
612 OS << "Key: " << MIR2VecVocab.getStringKey(Pos++) << ": ";
613 Entry.print(OS);
614 }
615
616 return false;
617}
618
623
626 "MIR2Vec Embedder Printer Pass", false, true)
630 "MIR2Vec Embedder Printer Pass", false, true)
631
634 auto VocabOrErr =
635 Analysis.getMIR2VecVocabulary(*MF.getFunction().getParent());
636 assert(VocabOrErr && "Failed to get MIR2Vec vocabulary");
637 auto &MIRVocab = *VocabOrErr;
638
640 if (!Emb) {
641 OS << "Error creating MIR2Vec embeddings for function " << MF.getName()
642 << "\n";
643 return false;
644 }
645
646 OS << "MIR2Vec embeddings for machine function " << MF.getName() << ":\n";
647 OS << "Machine Function vector: ";
648 Emb->getMFunctionVector().print(OS);
649
650 OS << "Machine basic block vectors:\n";
652 OS << "Machine basic block: " << MBB.getFullName() << ":\n";
653 Emb->getMBBVector(MBB).print(OS);
654 }
655
656 OS << "Machine instruction vectors:\n";
659
660
661 if (MI.isDebugInstr())
662 continue;
663
664 OS << "Machine instruction: ";
665 MI.print(OS);
666 Emb->getMInstVector(MI).print(OS);
667 }
668 }
669
670 return false;
671}
672
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
block Block Frequency Analysis
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
This file builds on the ADT/GraphTraits.h file to build generic depth first graph iterator.
const HexagonInstrInfo * TII
Module.h This file contains the declarations for the Module class.
This file defines the MIR2Vec framework for generating Machine IR embeddings.
Register const TargetRegisterInfo * TRI
#define INITIALIZE_PASS_DEPENDENCY(depName)
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
SmallVector< MachineBasicBlock *, 4 > MBBVector
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
This pass prints the MIR2Vec embeddings for machine functions, basic blocks, and instructions.
MIR2VecPrinterLegacyPass(raw_ostream &OS)
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
Definition MIR2Vec.cpp:632
Pass to analyze and populate MIR2Vec vocabulary from a module.
This pass prints the embeddings in the MIR2Vec vocabulary.
bool doFinalization(Module &M) override
doFinalization - Virtual method overriden by subclasses to do any necessary clean up after all passes...
Definition MIR2Vec.cpp:599
bool runOnMachineFunction(MachineFunction &MF) override
runOnMachineFunction - This method must be overloaded to perform the desired machine code transformat...
Definition MIR2Vec.cpp:595
MIR2VecVocabPrinterLegacyPass(raw_ostream &OS)
LLVM_ABI Expected< mir2vec::MIRVocabulary > getVocabulary(const Module &M)
Definition MIR2Vec.cpp:424
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
Representation of each machine instruction.
MachineOperand class - Representation of each machine instruction operand.
@ MO_Register
Register operand.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
static ErrorOr< std::unique_ptr< MemoryBuffer > > getFileOrSTDIN(const Twine &Filename, bool IsText=false, bool RequiresNullTerminator=true, std::optional< Align > Alignment=std::nullopt)
Open the specified file as a MemoryBuffer, or open stdin if the Filename is "-".
A Module instance is used to store all the information related to an LLVM module.
AnalysisType & getAnalysis() const
getAnalysis() - This function is used by subclasses to get to the analysis information ...
LLVM_ABI bool match(StringRef String, SmallVectorImpl< StringRef > *Matches=nullptr, std::string *Error=nullptr) const
matches - Match the regex against a given String.
Wrapper class representing virtual and physical registers.
constexpr bool isValid() const
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
std::string str() const
str - Get the contents as an std::string.
constexpr bool empty() const
empty - Check if the string is empty.
char back() const
back - Get the last character in the string.
StringRef drop_back(size_t N=1) const
Return a StringRef equal to 'this' but with the last N elements dropped.
TargetInstrInfo - Interface to description of machine instruction set.
unsigned getID() const
Return the register class ID number.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
Generic storage class for section-based vocabularies.
static Error parseVocabSection(StringRef Key, const json::Value &ParsedVocabValue, VocabMap &TargetVocab, unsigned &Dim)
Parse a vocabulary section from JSON and populate the target vocabulary map.
unsigned getDimension() const
Get vocabulary dimension.
bool isValid() const
Check if vocabulary is valid (has data)
const unsigned Dimension
Dimension of the embeddings; Captured from the vocabulary.
const MIRVocabulary & Vocab
MIREmbedder(const MachineFunction &MF, const MIRVocabulary &Vocab)
LLVM_ABI Embedding computeEmbeddings() const
Function to compute embeddings.
Definition MIR2Vec.cpp:549
const MachineFunction & MF
static LLVM_ABI std::unique_ptr< MIREmbedder > create(MIR2VecKind Mode, const MachineFunction &MF, const MIRVocabulary &Vocab)
Factory method to create an Embedder object of the specified kind Returns nullptr if the requested ki...
Definition MIR2Vec.cpp:516
Class for storing and accessing the MIR2Vec vocabulary.
LLVM_ABI_FOR_TEST unsigned getCanonicalIndexForOperandName(StringRef OperandName) const
Definition MIR2Vec.cpp:159
LLVM_ABI_FOR_TEST unsigned getCanonicalIndexForRegisterClass(StringRef RegName, bool IsPhysical=true) const
Definition MIR2Vec.cpp:169
static LLVM_ABI_FOR_TEST Expected< MIRVocabulary > create(VocabMap &&OpcMap, VocabMap &&CommonOperandsMap, VocabMap &&PhyRegMap, VocabMap &&VirtRegMap, const TargetInstrInfo &TII, const TargetRegisterInfo &TRI, const MachineRegisterInfo &MRI)
Factory method to create MIRVocabulary from vocabulary map.
Definition MIR2Vec.cpp:93
static LLVM_ABI_FOR_TEST std::string extractBaseOpcodeName(StringRef InstrName)
Static method for extracting base opcode names (public for testing)
Definition MIR2Vec.cpp:114
static LLVM_ABI Expected< MIRVocabulary > createDummyVocabForTest(const TargetInstrInfo &TII, const TargetRegisterInfo &TRI, const MachineRegisterInfo &MRI, unsigned Dim=1)
Create a dummy vocabulary for testing purposes.
Definition MIR2Vec.cpp:377
LLVM_ABI std::string getStringKey(unsigned Pos) const
Get the string key for a vocabulary entry at the given position.
Definition MIR2Vec.cpp:179
LLVM_ABI_FOR_TEST unsigned getCanonicalIndexForBaseName(StringRef BaseName) const
Get indices from opcode or operand names.
Definition MIR2Vec.cpp:144
static LLVM_ABI_FOR_TEST std::unique_ptr< SymbolicMIREmbedder > create(const MachineFunction &MF, const MIRVocabulary &Vocab)
Definition MIR2Vec.cpp:563
SymbolicMIREmbedder(const MachineFunction &F, const MIRVocabulary &Vocab)
Definition MIR2Vec.cpp:558
This class implements an extremely fast bulk output stream that can only output to a stream.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
OperandType
Operands are tagged with one of the values of this enum.
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
initializer< Ty > init(const Ty &Val)
LLVM_ABI llvm::Expected< Value > parse(llvm::StringRef JSON)
Parses the provided JSON source, or returns a ParseError.
LLVM_ABI llvm:🆑:OptionCategory MIR2VecCategory
LLVM_ABI cl::opt< float > OpcWeight
static cl::opt< std::string > VocabFile("mir2vec-vocab-path", cl::Optional, cl::desc("Path to the vocabulary file for MIR2Vec"), cl::init(""), cl::cat(MIR2VecCategory))
LLVM_ABI cl::opt< float > RegOperandWeight
ir2vec::Embedding Embedding
LLVM_ABI cl::opt< float > CommonOperandWeight
cl::opt< MIR2VecKind > MIR2VecEmbeddingKind("mir2vec-kind", cl::Optional, cl::values(clEnumValN(MIR2VecKind::Symbolic, "symbolic", "Generate symbolic embeddings for MIR")), cl::init(MIR2VecKind::Symbolic), cl::desc("MIR2Vec embedding kind"), cl::cat(MIR2VecCategory))
This is an optimization pass for GlobalISel generic memory operations.
Error createFileError(const Twine &F, Error E)
Concatenate a source file path and/or name with an Error.
Error createStringError(std::error_code EC, char const *Fmt, const Ts &... Vals)
Create formatted StringError object.
LLVM_ABI MachineFunctionPass * createMIR2VecPrinterLegacyPass(raw_ostream &OS)
Create a machine pass that prints MIR2Vec embeddings.
Definition MIR2Vec.cpp:673
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
LLVM_ABI raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
LLVM_ABI MachineFunctionPass * createMIR2VecVocabPrinterLegacyPass(raw_ostream &OS)
MIR2VecVocabPrinter pass - This pass prints out the MIR2Vec vocabulary contents to the given stream a...
Definition MIR2Vec.cpp:620
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
iterator_range< df_iterator< T > > depth_first(const T &G)