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

Tony Jiang via llvm-dev llvm-dev at lists.llvm.org
Mon Mar 23 15:00:36 PDT 2020

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,
2728  // are disabled, then these HazardRecs will be disabled.
2729  const InstrItineraryData
<https://llvm.org/doxygen/classllvm_1_1InstrItineraryData.html> *Itin =
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

Any comments and suggestions will be greatly appreciated, thanks!


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200323/717bee13/attachment.html>

More information about the llvm-dev mailing list