Tony Jiang via llvm-dev
2020-Mar-23 22:00 UTC
[llvm-dev] [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 <https://llvm.org/doxygen/classllvm_1_1InstrItineraryData.html> *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! Regards, Yanjun -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200323/717bee13/attachment.html>