[llvm] Refactoring llvm-ir2vec.cpp for better separation of concerns in the Tooling classes (PR #170078)

S. VenkataKeerthy via llvm-commits llvm-commits at lists.llvm.org
Mon Dec 1 23:07:30 PST 2025


================
@@ -216,56 +222,139 @@ class IR2VecTool {
         unsigned Opcode = Vocabulary::getIndex(I.getOpcode());
         unsigned TypeID = Vocabulary::getIndex(I.getType()->getTypeID());
 
-        // Add "Next" relationship with previous instruction
         if (HasPrevOpcode) {
-          OS << PrevOpcode << '\t' << Opcode << '\t' << NextRelation << '\n';
+          Result.Triplets.push_back({PrevOpcode, Opcode, NextRelation});
           LLVM_DEBUG(dbgs()
-                     << Vocabulary::getVocabKeyForOpcode(PrevOpcode + 1) << '\t'
-                     << Vocabulary::getVocabKeyForOpcode(Opcode + 1) << '\t'
-                     << "Next\n");
+                    << Vocabulary::getVocabKeyForOpcode(PrevOpcode + 1) << '\t'
+                    << Vocabulary::getVocabKeyForOpcode(Opcode + 1) << '\t'
+                    << "Next\n");
         }
 
-        // Add "Type" relationship
-        OS << Opcode << '\t' << TypeID << '\t' << TypeRelation << '\n';
+        Result.Triplets.push_back({Opcode, TypeID, TypeRelation});
         LLVM_DEBUG(
             dbgs() << Vocabulary::getVocabKeyForOpcode(Opcode + 1) << '\t'
-                   << Vocabulary::getVocabKeyForTypeID(I.getType()->getTypeID())
-                   << '\t' << "Type\n");
+                  << Vocabulary::getVocabKeyForTypeID(I.getType()->getTypeID())
+                  << '\t' << "Type\n");
 
-        // Add "Arg" relationships
         unsigned ArgIndex = 0;
         for (const Use &U : I.operands()) {
           unsigned OperandID = Vocabulary::getIndex(*U.get());
           unsigned RelationID = ArgRelation + ArgIndex;
-          OS << Opcode << '\t' << OperandID << '\t' << RelationID << '\n';
+          Result.Triplets.push_back({Opcode, OperandID, RelationID});
 
           LLVM_DEBUG({
             StringRef OperandStr = Vocabulary::getVocabKeyForOperandKind(
                 Vocabulary::getOperandKind(U.get()));
             dbgs() << Vocabulary::getVocabKeyForOpcode(Opcode + 1) << '\t'
-                   << OperandStr << '\t' << "Arg" << ArgIndex << '\n';
+                  << OperandStr << '\t' << "Arg" << ArgIndex << '\n';
           });
 
           ++ArgIndex;
         }
-        // Only update MaxRelation if there were operands
+
         if (ArgIndex > 0) {
           MaxRelation = std::max(MaxRelation, ArgRelation + ArgIndex - 1);
         }
+
         PrevOpcode = Opcode;
         HasPrevOpcode = true;
       }
     }
 
-    return MaxRelation;
+    Result.MaxRelation = MaxRelation;
+    return Result;
   }
 
-  /// Dump entity ID to string mappings
-  static void generateEntityMappings(raw_ostream &OS) {
+  TripletResult getTriplets() const {
+    TripletResult Result;
+    Result.MaxRelation = NextRelation;
+
+    for (const Function &F : M) {
+      TripletResult FuncResult = getTriplets(F);
+      Result.MaxRelation = std::max(Result.MaxRelation, FuncResult.MaxRelation);
+      Result.Triplets.insert(Result.Triplets.end(),
+                            FuncResult.Triplets.begin(),
+                            FuncResult.Triplets.end());
+    }
+
+    return Result;
+  }
+
+  /// Generate triplets for the module
+  /// Output format: MAX_RELATION=N header followed by relationships
+  void generateTriplets(raw_ostream &OS) const {
+    auto Result = getTriplets();
+    OS << "MAX_RELATION=" << Result.MaxRelation << '\n';
+    for (const auto &T : Result.Triplets) {
----------------
svkeerthy wrote:

Don’t Use Braces on Simple Single-Statement Bodies of if/else/loop Statements - https://llvm.org/docs/CodingStandards.html#don-t-use-braces-on-simple-single-statement-bodies-of-if-else-loop-statements

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


More information about the llvm-commits mailing list