1111
1212#include " llvm/CodeGen/GlobalISel/InstructionSelect.h"
1313#include " llvm/ADT/PostOrderIterator.h"
14+ #include " llvm/ADT/ScopeExit.h"
1415#include " llvm/ADT/Twine.h"
16+ #include " llvm/Analysis/BlockFrequencyInfo.h"
17+ #include " llvm/Analysis/LazyBlockFrequencyInfo.h"
18+ #include " llvm/Analysis/ProfileSummaryInfo.h"
1519#include " llvm/CodeGen/GlobalISel/GISelKnownBits.h"
1620#include " llvm/CodeGen/GlobalISel/InstructionSelector.h"
1721#include " llvm/CodeGen/GlobalISel/LegalizerInfo.h"
@@ -50,16 +54,29 @@ INITIALIZE_PASS_BEGIN(InstructionSelect, DEBUG_TYPE,
5054 false , false )
5155INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
5256INITIALIZE_PASS_DEPENDENCY(GISelKnownBitsAnalysis)
57+ INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass)
58+ INITIALIZE_PASS_DEPENDENCY(LazyBlockFrequencyInfoPass)
5359INITIALIZE_PASS_END(InstructionSelect, DEBUG_TYPE,
5460 " Select target instructions out of generic instructions" ,
5561 false , false )
5662
57- InstructionSelect::InstructionSelect() : MachineFunctionPass(ID) { }
63+ InstructionSelect::InstructionSelect(CodeGenOpt::Level OL)
64+ : MachineFunctionPass(ID), OptLevel(OL) {}
65+
66+ // In order not to crash when calling getAnalysis during testing with -run-pass
67+ // we use the default opt level here instead of None, so that the addRequired()
68+ // calls are made in getAnalysisUsage().
69+ InstructionSelect::InstructionSelect ()
70+ : MachineFunctionPass(ID), OptLevel(CodeGenOpt::Default) {}
5871
5972void InstructionSelect::getAnalysisUsage (AnalysisUsage &AU) const {
6073 AU.addRequired <TargetPassConfig>();
61- AU.addRequired <GISelKnownBitsAnalysis>();
62- AU.addPreserved <GISelKnownBitsAnalysis>();
74+ if (OptLevel != CodeGenOpt::None) {
75+ AU.addRequired <GISelKnownBitsAnalysis>();
76+ AU.addPreserved <GISelKnownBitsAnalysis>();
77+ AU.addRequired <ProfileSummaryInfoWrapperPass>();
78+ LazyBlockFrequencyInfoPass::getLazyBFIAnalysisUsage (AU);
79+ }
6380 getSelectionDAGFallbackAnalysisUsage (AU);
6481 MachineFunctionPass::getAnalysisUsage (AU);
6582}
@@ -71,13 +88,26 @@ bool InstructionSelect::runOnMachineFunction(MachineFunction &MF) {
7188 return false ;
7289
7390 LLVM_DEBUG (dbgs () << " Selecting function: " << MF.getName () << ' \n ' );
74- GISelKnownBits &KB = getAnalysis<GISelKnownBitsAnalysis>().get (MF);
7591
7692 const TargetPassConfig &TPC = getAnalysis<TargetPassConfig>();
7793 InstructionSelector *ISel = MF.getSubtarget ().getInstructionSelector ();
94+
95+ CodeGenOpt::Level OldOptLevel = OptLevel;
96+ auto RestoreOptLevel = make_scope_exit ([=]() { OptLevel = OldOptLevel; });
97+ OptLevel = MF.getFunction ().hasOptNone () ? CodeGenOpt::None
98+ : MF.getTarget ().getOptLevel ();
99+
100+ GISelKnownBits *KB = nullptr ;
101+ if (OptLevel != CodeGenOpt::None) {
102+ KB = &getAnalysis<GISelKnownBitsAnalysis>().get (MF);
103+ PSI = &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI ();
104+ if (PSI && PSI->hasProfileSummary ())
105+ BFI = &getAnalysis<LazyBlockFrequencyInfoPass>().getBFI ();
106+ }
107+
78108 CodeGenCoverage CoverageInfo;
79109 assert (ISel && " Cannot work without InstructionSelector" );
80- ISel->setupMF (MF, KB, CoverageInfo);
110+ ISel->setupMF (MF, KB, CoverageInfo, PSI, BFI );
81111
82112 // An optimization remark emitter. Used to report failures.
83113 MachineOptimizationRemarkEmitter MORE (MF, /* MBFI=*/ nullptr );
@@ -102,6 +132,7 @@ bool InstructionSelect::runOnMachineFunction(MachineFunction &MF) {
102132#endif
103133
104134 for (MachineBasicBlock *MBB : post_order (&MF)) {
135+ ISel->CurMBB = MBB;
105136 if (MBB->empty ())
106137 continue ;
107138
0 commit comments