Machine model: allow itineraries to be shared by different processor models.
authorAndrew Trick <atrick@apple.com>
Mon, 9 Jul 2012 20:43:03 +0000 (20:43 +0000)
committerAndrew Trick <atrick@apple.com>
Mon, 9 Jul 2012 20:43:03 +0000 (20:43 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@159959 91177308-0d34-0410-b5e6-96231b3b80d8

utils/TableGen/SubtargetEmitter.cpp

index 48dbdc2c7c2a41cdfe4017832013d69bb402b8f1..39055c07b9cee68aa5ec975ef798a33cab58bbd7 100644 (file)
@@ -336,10 +336,16 @@ EmitStageAndOperandCycleData(raw_ostream &OS,
                              std::vector<std::vector<InstrItinerary> >
                                &ProcItinLists) {
 
+  // Multiple processor models may share an itinerary record. Emit it once.
+  SmallPtrSet<Record*, 8> ItinsDefSet;
+
   // Emit functional units for all the itineraries.
   for (CodeGenSchedModels::ProcIter PI = SchedModels.procModelBegin(),
          PE = SchedModels.procModelEnd(); PI != PE; ++PI) {
 
+    if (!ItinsDefSet.insert(PI->ItinsDef))
+      continue;
+
     std::vector<Record*> FUs = PI->ItinsDef->getValueAsListOfDefs("FU");
     if (FUs.empty())
       continue;
@@ -508,12 +514,18 @@ void SubtargetEmitter::
 EmitItineraries(raw_ostream &OS,
                 std::vector<std::vector<InstrItinerary> > &ProcItinLists) {
 
+  // Multiple processor models may share an itinerary record. Emit it once.
+  SmallPtrSet<Record*, 8> ItinsDefSet;
+
   // For each processor's machine model
   std::vector<std::vector<InstrItinerary> >::iterator
       ProcItinListsIter = ProcItinLists.begin();
   for (CodeGenSchedModels::ProcIter PI = SchedModels.procModelBegin(),
          PE = SchedModels.procModelEnd(); PI != PE; ++PI) {
+
     Record *ItinsDef = PI->ItinsDef;
+    if (!ItinsDefSet.insert(ItinsDef))
+      continue;
 
     // Get processor itinerary name
     const std::string &Name = ItinsDef->getName();