[RDF] Use default TargetOperandInfo if not given in constructor

All current in-tree users use the default implementation.

GitOrigin-RevId: 2bc390bdd66c9e0bc888f3bbe3eba473a54ff431
diff --git a/include/llvm/CodeGen/RDFGraph.h b/include/llvm/CodeGen/RDFGraph.h
index a323ee9..4a8428f 100644
--- a/include/llvm/CodeGen/RDFGraph.h
+++ b/include/llvm/CodeGen/RDFGraph.h
@@ -233,6 +233,7 @@
 #include <cstdint>
 #include <cstring>
 #include <map>
+#include <memory>
 #include <set>
 #include <unordered_map>
 #include <utility>
@@ -644,6 +645,9 @@
   struct DataFlowGraph {
     DataFlowGraph(MachineFunction &mf, const TargetInstrInfo &tii,
         const TargetRegisterInfo &tri, const MachineDominatorTree &mdt,
+        const MachineDominanceFrontier &mdf);
+    DataFlowGraph(MachineFunction &mf, const TargetInstrInfo &tii,
+        const TargetRegisterInfo &tri, const MachineDominatorTree &mdt,
         const MachineDominanceFrontier &mdf, const TargetOperandInfo &toi);
 
     NodeBase *ptr(NodeId N) const;
@@ -861,6 +865,9 @@
       IA.Addr->removeMember(RA, *this);
     }
 
+    // Default TOI object, if not given in the constructor.
+    std::unique_ptr<TargetOperandInfo> DefaultTOI;
+
     MachineFunction &MF;
     const TargetInstrInfo &TII;
     const TargetRegisterInfo &TRI;
diff --git a/lib/CodeGen/RDFGraph.cpp b/lib/CodeGen/RDFGraph.cpp
index df5ec9c..4f7457d 100644
--- a/lib/CodeGen/RDFGraph.cpp
+++ b/lib/CodeGen/RDFGraph.cpp
@@ -648,6 +648,14 @@
 
 DataFlowGraph::DataFlowGraph(MachineFunction &mf, const TargetInstrInfo &tii,
       const TargetRegisterInfo &tri, const MachineDominatorTree &mdt,
+      const MachineDominanceFrontier &mdf)
+    : DefaultTOI(std::make_unique<TargetOperandInfo>(tii)), MF(mf), TII(tii),
+      TRI(tri), PRI(tri, mf), MDT(mdt), MDF(mdf), TOI(*DefaultTOI),
+      LiveIns(PRI) {
+}
+
+DataFlowGraph::DataFlowGraph(MachineFunction &mf, const TargetInstrInfo &tii,
+      const TargetRegisterInfo &tri, const MachineDominatorTree &mdt,
       const MachineDominanceFrontier &mdf, const TargetOperandInfo &toi)
     : MF(mf), TII(tii), TRI(tri), PRI(tri, mf), MDT(mdt), MDF(mdf), TOI(toi),
       LiveIns(PRI) {
diff --git a/lib/Target/Hexagon/HexagonOptAddrMode.cpp b/lib/Target/Hexagon/HexagonOptAddrMode.cpp
index 311e43d..b816a7d 100644
--- a/lib/Target/Hexagon/HexagonOptAddrMode.cpp
+++ b/lib/Target/Hexagon/HexagonOptAddrMode.cpp
@@ -863,9 +863,8 @@
   HRI = HST.getRegisterInfo();
   const auto &MDF = getAnalysis<MachineDominanceFrontier>();
   MDT = &getAnalysis<MachineDominatorTree>();
-  const TargetOperandInfo TOI(*HII);
 
-  DataFlowGraph G(MF, *HII, *HRI, *MDT, MDF, TOI);
+  DataFlowGraph G(MF, *HII, *HRI, *MDT, MDF);
   // Need to keep dead phis because we can propagate uses of registers into
   // nodes dominated by those would-be phis.
   G.build(BuildOptions::KeepDeadPhis);
diff --git a/lib/Target/Hexagon/HexagonRDFOpt.cpp b/lib/Target/Hexagon/HexagonRDFOpt.cpp
index fb69189..78ab443 100644
--- a/lib/Target/Hexagon/HexagonRDFOpt.cpp
+++ b/lib/Target/Hexagon/HexagonRDFOpt.cpp
@@ -299,8 +299,7 @@
   if (RDFDump)
     MF.print(dbgs() << "Before " << getPassName() << "\n", nullptr);
 
-  TargetOperandInfo TOI(HII);
-  DataFlowGraph G(MF, HII, HRI, *MDT, MDF, TOI);
+  DataFlowGraph G(MF, HII, HRI, *MDT, MDF);
   // Dead phi nodes are necessary for copy propagation: we can add a use
   // of a register in a block where it would need a phi node, but which
   // was dead (and removed) during the graph build time.
diff --git a/lib/Target/X86/X86LoadValueInjectionLoadHardening.cpp b/lib/Target/X86/X86LoadValueInjectionLoadHardening.cpp
index 23976fb..5d9a923 100644
--- a/lib/Target/X86/X86LoadValueInjectionLoadHardening.cpp
+++ b/lib/Target/X86/X86LoadValueInjectionLoadHardening.cpp
@@ -331,8 +331,7 @@
   using namespace rdf;
 
   // Build the Register Dataflow Graph using the RDF framework
-  TargetOperandInfo TOI{*TII};
-  DataFlowGraph DFG{MF, *TII, *TRI, MDT, MDF, TOI};
+  DataFlowGraph DFG{MF, *TII, *TRI, MDT, MDF};
   DFG.build();
   Liveness L{MF.getRegInfo(), DFG};
   L.computePhiInfo();