diff --git a/llvm/utils/TableGen/CodeGenSchedule.h b/llvm/utils/TableGen/CodeGenSchedule.h --- a/llvm/utils/TableGen/CodeGenSchedule.h +++ b/llvm/utils/TableGen/CodeGenSchedule.h @@ -96,7 +96,7 @@ /// Represent a transition between SchedClasses induced by SchedVariant. struct CodeGenSchedTransition { unsigned ToClassIdx; - IdxVec ProcIndices; + unsigned ProcIndex; RecVec PredTerm; }; diff --git a/llvm/utils/TableGen/CodeGenSchedule.cpp b/llvm/utils/TableGen/CodeGenSchedule.cpp --- a/llvm/utils/TableGen/CodeGenSchedule.cpp +++ b/llvm/utils/TableGen/CodeGenSchedule.cpp @@ -1314,16 +1314,12 @@ SmallVector PredTerm; SmallVector, 16> WriteSequences; SmallVector, 16> ReadSequences; - SmallVector ProcIndices; + unsigned ProcIndex = 0; PredTransition() = default; - PredTransition(ArrayRef PT) { + PredTransition(ArrayRef PT, unsigned ProcId) { PredTerm.assign(PT.begin(), PT.end()); - ProcIndices.assign(1, 0); - } - PredTransition(ArrayRef PT, ArrayRef PIds) { - PredTerm.assign(PT.begin(), PT.end()); - ProcIndices.assign(PIds.begin(), PIds.end()); + ProcIndex = ProcId; } }; @@ -1413,16 +1409,11 @@ } static std::vector getAllPredicates(ArrayRef Variants, - ArrayRef ProcIndices) { + unsigned ProcId) { std::vector Preds; for (auto &Variant : Variants) { if (!Variant.VarOrSeqDef->isSubClassOf("SchedVar")) continue; - - if (ProcIndices[0] && Variant.ProcIdx) - if (!llvm::count(ProcIndices, Variant.ProcIdx)) - continue; - Preds.push_back(Variant.VarOrSeqDef->getValueAsDef("Predicate")); } return Preds; @@ -1444,12 +1435,14 @@ Record *ModelDef = SchedRW.TheDef->getValueAsDef("SchedModel"); VarProcIdx = SchedModels.getProcModel(ModelDef).Index; } - // Push each variant. Assign TransVecIdx later. - const RecVec VarDefs = SchedRW.TheDef->getValueAsListOfDefs("Variants"); - for (Record *VarDef : VarDefs) - Variants.emplace_back(VarDef, SchedRW.Index, VarProcIdx, 0); - if (VarProcIdx == 0) - GenericRW = true; + if (VarProcIdx == 0 || VarProcIdx == TransVec[TransIdx].ProcIndex) { + // Push each variant. Assign TransVecIdx later. + const RecVec VarDefs = SchedRW.TheDef->getValueAsListOfDefs("Variants"); + for (Record *VarDef : VarDefs) + Variants.emplace_back(VarDef, SchedRW.Index, VarProcIdx, 0); + if (VarProcIdx == 0) + GenericRW = true; + } } for (RecIter AI = SchedRW.Aliases.begin(), AE = SchedRW.Aliases.end(); AI != AE; ++AI) { @@ -1461,6 +1454,17 @@ Record *ModelDef = (*AI)->getValueAsDef("SchedModel"); AliasProcIdx = SchedModels.getProcModel(ModelDef).Index; } + if (AliasProcIdx && AliasProcIdx != TransVec[TransIdx].ProcIndex) + continue; + if (!Variants.empty()) { + const CodeGenProcModel &PM = + *(SchedModels.procModelBegin() + AliasProcIdx); + PrintFatalError((*AI)->getLoc(), + "Multiple variants defined for processor " + + PM.ModelName + + " Ensure only one SchedAlias exists per RW."); + } + const CodeGenSchedRW &AliasRW = SchedModels.getSchedRW((*AI)->getValueAsDef("AliasRW")); @@ -1475,25 +1479,10 @@ GenericRW = true; } std::vector AllPreds = - getAllPredicates(Variants, TransVec[TransIdx].ProcIndices); + getAllPredicates(Variants, TransVec[TransIdx].ProcIndex); for (TransVariant &Variant : Variants) { // Don't expand variants if the processor models don't intersect. // A zero processor index means any processor. - SmallVectorImpl &ProcIndices = TransVec[TransIdx].ProcIndices; - if (ProcIndices[0] && Variant.ProcIdx) { - unsigned Cnt = std::count(ProcIndices.begin(), ProcIndices.end(), - Variant.ProcIdx); - if (!Cnt) - continue; - if (Cnt > 1) { - const CodeGenProcModel &PM = - *(SchedModels.procModelBegin() + Variant.ProcIdx); - PrintFatalError(Variant.VarOrSeqDef->getLoc(), - "Multiple variants defined for processor " + - PM.ModelName + - " Ensure only one SchedAlias exists per RW."); - } - } if (Variant.VarOrSeqDef->isSubClassOf("SchedVar")) { Record *PredDef = Variant.VarOrSeqDef->getValueAsDef("Predicate"); if (mutuallyExclusive(PredDef, AllPreds, TransVec[TransIdx].PredTerm)) @@ -1526,9 +1515,6 @@ // If this operand transition is reached through a processor-specific alias, // then the whole transition is specific to this processor. - if (VInfo.ProcIdx != 0) - Trans.ProcIndices.assign(1, VInfo.ProcIdx); - IdxVec SelectedRWs; if (VInfo.VarOrSeqDef->isSubClassOf("SchedVar")) { Record *PredDef = VInfo.VarOrSeqDef->getValueAsDef("Predicate"); @@ -1632,9 +1618,9 @@ // PredTransitions. Remember the first new transition. unsigned StartIdx = TransVec.size(); bool Subst = false; - TransVec.emplace_back(Trans.PredTerm, Trans.ProcIndices); + assert(Trans.ProcIndex != 0); + TransVec.emplace_back(Trans.PredTerm, Trans.ProcIndex); - assert(!llvm::count(Trans.ProcIndices, 0)); // Visit each original write sequence. for (SmallVectorImpl>::const_iterator WSI = Trans.WriteSequences.begin(), WSE = Trans.WriteSequences.end(); @@ -1683,8 +1669,8 @@ << FromSC.Index << ") to " << SchedModels.getSchedClass(SCTrans.ToClassIdx).Name << "(" << SCTrans.ToClassIdx << ") on pred term: ("; - dumpRecVec(Preds); dbgs() << ") on processor indices: ("; - dumpIdxVec(SCTrans.ProcIndices); dbgs() << ")\n"); + dumpRecVec(Preds); + dbgs() << ") on processor (" << SCTrans.ProcIndex << ")\n"); } // Create a new SchedClass for each variant found by inferFromRW. Pass static void inferFromTransitions(ArrayRef LastTransitions, @@ -1706,15 +1692,12 @@ // Transition should not contain processor indices already assigned to // InstRWs in this scheduling class. const CodeGenSchedClass &FromSC = SchedModels.getSchedClass(FromClassIdx); - llvm::copy_if(I->ProcIndices, std::back_inserter(SCTrans.ProcIndices), - [&FromSC](unsigned PIdx) { - return !FromSC.InstRWProcIndices.count(PIdx); - }); - if (SCTrans.ProcIndices.empty()) + if (FromSC.InstRWProcIndices.count(I->ProcIndex)) continue; + SCTrans.ProcIndex = I->ProcIndex; SCTrans.ToClassIdx = SchedModels.addSchedClass(/*ItinClassDef=*/nullptr, OperWritesVariant, - OperReadsVariant, I->ProcIndices); + OperReadsVariant, I->ProcIndex); // The final PredTerm is unique set of predicates guarding the transition. RecVec Preds; @@ -1745,7 +1728,7 @@ for (unsigned ProcId : ProcIndices) { assert(ProcId != 0); PerCpuTransVec.push_back(Trans); - PerCpuTransVec.back().ProcIndices.assign(1, ProcId); + PerCpuTransVec.back().ProcIndex = ProcId; } return PerCpuTransVec; } @@ -1763,8 +1746,6 @@ // of SchedWrites for the current SchedClass. std::vector LastTransitions; LastTransitions.emplace_back(); - LastTransitions.back().ProcIndices.append(ProcIndices.begin(), - ProcIndices.end()); for (unsigned WriteIdx : OperWrites) { IdxVec WriteSeq; @@ -2270,7 +2251,7 @@ if (!Transitions.empty()) { dbgs() << "\n Transitions for Proc "; for (const CodeGenSchedTransition &Transition : Transitions) { - dumpIdxVec(Transition.ProcIndices); + dbgs() << Transition.ProcIndex << ", "; } } dbgs() << '\n'; diff --git a/llvm/utils/TableGen/SubtargetEmitter.cpp b/llvm/utils/TableGen/SubtargetEmitter.cpp --- a/llvm/utils/TableGen/SubtargetEmitter.cpp +++ b/llvm/utils/TableGen/SubtargetEmitter.cpp @@ -1007,8 +1007,7 @@ bool HasVariants = false; for (const CodeGenSchedTransition &CGT : make_range(SC.Transitions.begin(), SC.Transitions.end())) { - if (CGT.ProcIndices[0] == 0 || - is_contained(CGT.ProcIndices, ProcModel.Index)) { + if (CGT.ProcIndex == ProcModel.Index) { HasVariants = true; break; } @@ -1551,9 +1550,8 @@ // transition rules specified by variant class `SC`. for (const CodeGenSchedTransition &T : SC.Transitions) { IdxVec PI; - std::set_union(T.ProcIndices.begin(), T.ProcIndices.end(), - ProcIndices.begin(), ProcIndices.end(), - std::back_inserter(PI)); + std::set_union(&T.ProcIndex, &T.ProcIndex + 1, ProcIndices.begin(), + ProcIndices.end(), std::back_inserter(PI)); ProcIndices.swap(PI); } } @@ -1607,7 +1605,7 @@ // Now emit transitions associated with processor PI. const CodeGenSchedTransition *FinalT = nullptr; for (const CodeGenSchedTransition &T : SC.Transitions) { - if (PI != 0 && !count(T.ProcIndices, PI)) + if (PI != 0 && T.ProcIndex != PI) continue; // Emit only transitions based on MCSchedPredicate, if it's the case.