[RFC][Scheduling] Insert NOPs &&dual issue MIs based on the new MIScheduler

Hi All,

I am currently investigating how to insert NOPs and dual issue MIs based on the new llvm MIScheduler.
And encountered several issues requires help from the community.

First, I thought I could rely on the HazardRecoginer to help me decide when I should insert the NOPs. But we
want to use the new MachineSchedModel instead of the legacy Itinerary based model. That means we
won’t define Itinerary model in our backend. Does that mean I cannot use the HazardRecoginzer llvm
frame code to help me decide when to insert NOPs? i.e: I need people to help me confirm: whether it
is possible to use the LLVM HazardRecoginzer to help deciding when to insert NOPs without defining
Itinerary info? Since it seems the following code says without Itineraries,HazardRecognizer will be disabled.
If that’s the case, what should I do to insert NOPs? I also looked ARM backend, it doesn’t override the
insertNoop() function, does that mean ARM hardware can automatically stall when NOP is needed?
Therefore, no need for the compiler to insert NOPs? I also looked at Hexagon code, it does override the
the insertNoop() function. But it seems that was invoked through the old list scheduler rather than the new
MIScheduler. And also Hexagon does define Itinerary in their MachineSchedModel. This confuses me,
does this mean the new MachineSchedModel can work together with the old Itinerary model? Is that the
best way to do scheduling modeling? I was assuming the community now recommend people to use the
new MIScheduler + new MachineScheModel for new target development. And there is also a stand-alone
postRA hazard recognizer which runs the hazard recoginzer and emits noops when necessary. It gives targets
a way to run the hazard recognizer without running one of the schedulers. Should I explore that one instead?

// Initialize the HazardRecognizers. If itineraries don’t exist, are empty, or
2728 // are disabled, then these HazardRecs will be disabled.
2729 const InstrItineraryData *Itin = SchedModel->getInstrItineraries();
2730 if (!Top.HazardRec) {
2731 Top.HazardRec =
2732 DAG->MF.getSubtarget().getInstrInfo()->CreateTargetMIHazardRecognizer(
2733 Itin, DAG);
2734 }
2735 if (!Bot.HazardRec) {
2736 Bot.HazardRec =
2737 DAG->MF.getSubtarget().getInstrInfo()->CreateTargetMIHazardRecognizer(
2738 Itin, DAG);
2739 }

Second, about dual issue. How does MIScheduler handle dual issue vs single issue? The only thing that I found
was IssueWidth,which should be set to 2 if dual issue, and 1 if single issue.

Any comments and suggestions will be greatly appreciated, thanks!