15fdaaf7fSRong Xu //===-------- MIRSampleProfile.cpp: MIRSampleFDO (For FSAFDO) -------------===//
25fdaaf7fSRong Xu //
35fdaaf7fSRong Xu // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45fdaaf7fSRong Xu // See https://llvm.org/LICENSE.txt for license information.
55fdaaf7fSRong Xu // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65fdaaf7fSRong Xu //
75fdaaf7fSRong Xu //===----------------------------------------------------------------------===//
85fdaaf7fSRong Xu //
95fdaaf7fSRong Xu // This file provides the implementation of the MIRSampleProfile loader, mainly
105fdaaf7fSRong Xu // for flow sensitive SampleFDO.
115fdaaf7fSRong Xu //
125fdaaf7fSRong Xu //===----------------------------------------------------------------------===//
135fdaaf7fSRong Xu 
145fdaaf7fSRong Xu #include "llvm/CodeGen/MIRSampleProfile.h"
155fdaaf7fSRong Xu #include "llvm/ADT/DenseMap.h"
165fdaaf7fSRong Xu #include "llvm/ADT/DenseSet.h"
175fdaaf7fSRong Xu #include "llvm/Analysis/BlockFrequencyInfoImpl.h"
18*989f1c72Sserge-sans-paille #include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
19*989f1c72Sserge-sans-paille #include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
20*989f1c72Sserge-sans-paille #include "llvm/CodeGen/MachineDominators.h"
21*989f1c72Sserge-sans-paille #include "llvm/CodeGen/MachineLoopInfo.h"
22*989f1c72Sserge-sans-paille #include "llvm/CodeGen/MachineOptimizationRemarkEmitter.h"
23*989f1c72Sserge-sans-paille #include "llvm/CodeGen/MachinePostDominators.h"
24*989f1c72Sserge-sans-paille #include "llvm/CodeGen/Passes.h"
255fdaaf7fSRong Xu #include "llvm/IR/Function.h"
26*989f1c72Sserge-sans-paille #include "llvm/InitializePasses.h"
275fdaaf7fSRong Xu #include "llvm/Support/CommandLine.h"
285fdaaf7fSRong Xu #include "llvm/Support/Debug.h"
295fdaaf7fSRong Xu #include "llvm/Support/raw_ostream.h"
305fdaaf7fSRong Xu #include "llvm/Transforms/Utils/SampleProfileLoaderBaseImpl.h"
315fdaaf7fSRong Xu #include "llvm/Transforms/Utils/SampleProfileLoaderBaseUtil.h"
325fdaaf7fSRong Xu 
335fdaaf7fSRong Xu using namespace llvm;
345fdaaf7fSRong Xu using namespace sampleprof;
355fdaaf7fSRong Xu using namespace llvm::sampleprofutil;
365fdaaf7fSRong Xu using ProfileCount = Function::ProfileCount;
375fdaaf7fSRong Xu 
385fdaaf7fSRong Xu #define DEBUG_TYPE "fs-profile-loader"
395fdaaf7fSRong Xu 
405fdaaf7fSRong Xu static cl::opt<bool> ShowFSBranchProb(
415fdaaf7fSRong Xu     "show-fs-branchprob", cl::Hidden, cl::init(false),
425fdaaf7fSRong Xu     cl::desc("Print setting flow sensitive branch probabilities"));
435fdaaf7fSRong Xu static cl::opt<unsigned> FSProfileDebugProbDiffThreshold(
445fdaaf7fSRong Xu     "fs-profile-debug-prob-diff-threshold", cl::init(10),
455fdaaf7fSRong Xu     cl::desc("Only show debug message if the branch probility is greater than "
465fdaaf7fSRong Xu              "this value (in percentage)."));
475fdaaf7fSRong Xu 
485fdaaf7fSRong Xu static cl::opt<unsigned> FSProfileDebugBWThreshold(
495fdaaf7fSRong Xu     "fs-profile-debug-bw-threshold", cl::init(10000),
505fdaaf7fSRong Xu     cl::desc("Only show debug message if the source branch weight is greater "
515fdaaf7fSRong Xu              " than this value."));
525fdaaf7fSRong Xu 
535fdaaf7fSRong Xu static cl::opt<bool> ViewBFIBefore("fs-viewbfi-before", cl::Hidden,
545fdaaf7fSRong Xu                                    cl::init(false),
555fdaaf7fSRong Xu                                    cl::desc("View BFI before MIR loader"));
565fdaaf7fSRong Xu static cl::opt<bool> ViewBFIAfter("fs-viewbfi-after", cl::Hidden,
575fdaaf7fSRong Xu                                   cl::init(false),
585fdaaf7fSRong Xu                                   cl::desc("View BFI after MIR loader"));
595fdaaf7fSRong Xu 
605fdaaf7fSRong Xu char MIRProfileLoaderPass::ID = 0;
615fdaaf7fSRong Xu 
625fdaaf7fSRong Xu INITIALIZE_PASS_BEGIN(MIRProfileLoaderPass, DEBUG_TYPE,
635fdaaf7fSRong Xu                       "Load MIR Sample Profile",
645fdaaf7fSRong Xu                       /* cfg = */ false, /* is_analysis = */ false)
655fdaaf7fSRong Xu INITIALIZE_PASS_DEPENDENCY(MachineBlockFrequencyInfo)
665fdaaf7fSRong Xu INITIALIZE_PASS_DEPENDENCY(MachineDominatorTree)
675fdaaf7fSRong Xu INITIALIZE_PASS_DEPENDENCY(MachinePostDominatorTree)
685fdaaf7fSRong Xu INITIALIZE_PASS_DEPENDENCY(MachineLoopInfo)
695fdaaf7fSRong Xu INITIALIZE_PASS_DEPENDENCY(MachineOptimizationRemarkEmitterPass)
705fdaaf7fSRong Xu INITIALIZE_PASS_END(MIRProfileLoaderPass, DEBUG_TYPE, "Load MIR Sample Profile",
715fdaaf7fSRong Xu                     /* cfg = */ false, /* is_analysis = */ false)
725fdaaf7fSRong Xu 
735fdaaf7fSRong Xu char &llvm::MIRProfileLoaderPassID = MIRProfileLoaderPass::ID;
745fdaaf7fSRong Xu 
createMIRProfileLoaderPass(std::string File,std::string RemappingFile,FSDiscriminatorPass P)755fdaaf7fSRong Xu FunctionPass *llvm::createMIRProfileLoaderPass(std::string File,
765fdaaf7fSRong Xu                                                std::string RemappingFile,
775fdaaf7fSRong Xu                                                FSDiscriminatorPass P) {
785fdaaf7fSRong Xu   return new MIRProfileLoaderPass(File, RemappingFile, P);
795fdaaf7fSRong Xu }
805fdaaf7fSRong Xu 
815fdaaf7fSRong Xu namespace llvm {
825fdaaf7fSRong Xu 
835fdaaf7fSRong Xu // Internal option used to control BFI display only after MBP pass.
845fdaaf7fSRong Xu // Defined in CodeGen/MachineBlockFrequencyInfo.cpp:
855fdaaf7fSRong Xu // -view-block-layout-with-bfi={none | fraction | integer | count}
865fdaaf7fSRong Xu extern cl::opt<GVDAGType> ViewBlockLayoutWithBFI;
875fdaaf7fSRong Xu 
885fdaaf7fSRong Xu // Command line option to specify the name of the function for CFG dump
895fdaaf7fSRong Xu // Defined in Analysis/BlockFrequencyInfo.cpp:  -view-bfi-func-name=
905fdaaf7fSRong Xu extern cl::opt<std::string> ViewBlockFreqFuncName;
915fdaaf7fSRong Xu 
925fdaaf7fSRong Xu namespace afdo_detail {
935fdaaf7fSRong Xu template <> struct IRTraits<MachineBasicBlock> {
945fdaaf7fSRong Xu   using InstructionT = MachineInstr;
955fdaaf7fSRong Xu   using BasicBlockT = MachineBasicBlock;
965fdaaf7fSRong Xu   using FunctionT = MachineFunction;
975fdaaf7fSRong Xu   using BlockFrequencyInfoT = MachineBlockFrequencyInfo;
985fdaaf7fSRong Xu   using LoopT = MachineLoop;
995fdaaf7fSRong Xu   using LoopInfoPtrT = MachineLoopInfo *;
1005fdaaf7fSRong Xu   using DominatorTreePtrT = MachineDominatorTree *;
1015fdaaf7fSRong Xu   using PostDominatorTreePtrT = MachinePostDominatorTree *;
1025fdaaf7fSRong Xu   using PostDominatorTreeT = MachinePostDominatorTree;
1035fdaaf7fSRong Xu   using OptRemarkEmitterT = MachineOptimizationRemarkEmitter;
1045fdaaf7fSRong Xu   using OptRemarkAnalysisT = MachineOptimizationRemarkAnalysis;
1055fdaaf7fSRong Xu   using PredRangeT = iterator_range<std::vector<MachineBasicBlock *>::iterator>;
1065fdaaf7fSRong Xu   using SuccRangeT = iterator_range<std::vector<MachineBasicBlock *>::iterator>;
getFunctionllvm::afdo_detail::IRTraits1075fdaaf7fSRong Xu   static Function &getFunction(MachineFunction &F) { return F.getFunction(); }
getEntryBBllvm::afdo_detail::IRTraits1085fdaaf7fSRong Xu   static const MachineBasicBlock *getEntryBB(const MachineFunction *F) {
1095fdaaf7fSRong Xu     return GraphTraits<const MachineFunction *>::getEntryNode(F);
1105fdaaf7fSRong Xu   }
getPredecessorsllvm::afdo_detail::IRTraits1115fdaaf7fSRong Xu   static PredRangeT getPredecessors(MachineBasicBlock *BB) {
1125fdaaf7fSRong Xu     return BB->predecessors();
1135fdaaf7fSRong Xu   }
getSuccessorsllvm::afdo_detail::IRTraits1145fdaaf7fSRong Xu   static SuccRangeT getSuccessors(MachineBasicBlock *BB) {
1155fdaaf7fSRong Xu     return BB->successors();
1165fdaaf7fSRong Xu   }
1175fdaaf7fSRong Xu };
1185fdaaf7fSRong Xu } // namespace afdo_detail
1195fdaaf7fSRong Xu 
1205fdaaf7fSRong Xu class MIRProfileLoader final
1215fdaaf7fSRong Xu     : public SampleProfileLoaderBaseImpl<MachineBasicBlock> {
1225fdaaf7fSRong Xu public:
setInitVals(MachineDominatorTree * MDT,MachinePostDominatorTree * MPDT,MachineLoopInfo * MLI,MachineBlockFrequencyInfo * MBFI,MachineOptimizationRemarkEmitter * MORE)1235fdaaf7fSRong Xu   void setInitVals(MachineDominatorTree *MDT, MachinePostDominatorTree *MPDT,
1245fdaaf7fSRong Xu                    MachineLoopInfo *MLI, MachineBlockFrequencyInfo *MBFI,
1255fdaaf7fSRong Xu                    MachineOptimizationRemarkEmitter *MORE) {
1265fdaaf7fSRong Xu     DT = MDT;
1275fdaaf7fSRong Xu     PDT = MPDT;
1285fdaaf7fSRong Xu     LI = MLI;
1295fdaaf7fSRong Xu     BFI = MBFI;
1305fdaaf7fSRong Xu     ORE = MORE;
1315fdaaf7fSRong Xu   }
setFSPass(FSDiscriminatorPass Pass)1325fdaaf7fSRong Xu   void setFSPass(FSDiscriminatorPass Pass) {
1335fdaaf7fSRong Xu     P = Pass;
1345fdaaf7fSRong Xu     LowBit = getFSPassBitBegin(P);
1355fdaaf7fSRong Xu     HighBit = getFSPassBitEnd(P);
1365fdaaf7fSRong Xu     assert(LowBit < HighBit && "HighBit needs to be greater than Lowbit");
1375fdaaf7fSRong Xu   }
1385fdaaf7fSRong Xu 
MIRProfileLoader(StringRef Name,StringRef RemapName)1395fdaaf7fSRong Xu   MIRProfileLoader(StringRef Name, StringRef RemapName)
1405fdaaf7fSRong Xu       : SampleProfileLoaderBaseImpl(std::string(Name), std::string(RemapName)) {
1415fdaaf7fSRong Xu   }
1425fdaaf7fSRong Xu 
1435fdaaf7fSRong Xu   void setBranchProbs(MachineFunction &F);
1445fdaaf7fSRong Xu   bool runOnFunction(MachineFunction &F);
1455fdaaf7fSRong Xu   bool doInitialization(Module &M);
isValid() const1465fdaaf7fSRong Xu   bool isValid() const { return ProfileIsValid; }
1475fdaaf7fSRong Xu 
1485fdaaf7fSRong Xu protected:
1495fdaaf7fSRong Xu   friend class SampleCoverageTracker;
1505fdaaf7fSRong Xu 
1515fdaaf7fSRong Xu   /// Hold the information of the basic block frequency.
1525fdaaf7fSRong Xu   MachineBlockFrequencyInfo *BFI;
1535fdaaf7fSRong Xu 
1545fdaaf7fSRong Xu   /// PassNum is the sequence number this pass is called, start from 1.
1555fdaaf7fSRong Xu   FSDiscriminatorPass P;
1565fdaaf7fSRong Xu 
1575fdaaf7fSRong Xu   // LowBit in the FS discriminator used by this instance. Note the number is
1585fdaaf7fSRong Xu   // 0-based. Base discrimnator use bit 0 to bit 11.
1595fdaaf7fSRong Xu   unsigned LowBit;
1605fdaaf7fSRong Xu   // HighwBit in the FS discriminator used by this instance. Note the number
1615fdaaf7fSRong Xu   // is 0-based.
1625fdaaf7fSRong Xu   unsigned HighBit;
1635fdaaf7fSRong Xu 
1645fdaaf7fSRong Xu   bool ProfileIsValid = true;
1655fdaaf7fSRong Xu };
1665fdaaf7fSRong Xu 
1675fdaaf7fSRong Xu template <>
1685fdaaf7fSRong Xu void SampleProfileLoaderBaseImpl<
computeDominanceAndLoopInfo(MachineFunction & F)1695fdaaf7fSRong Xu     MachineBasicBlock>::computeDominanceAndLoopInfo(MachineFunction &F) {}
1705fdaaf7fSRong Xu 
setBranchProbs(MachineFunction & F)1715fdaaf7fSRong Xu void MIRProfileLoader::setBranchProbs(MachineFunction &F) {
1725fdaaf7fSRong Xu   LLVM_DEBUG(dbgs() << "\nPropagation complete. Setting branch probs\n");
1735fdaaf7fSRong Xu   for (auto &BI : F) {
1745fdaaf7fSRong Xu     MachineBasicBlock *BB = &BI;
1755fdaaf7fSRong Xu     if (BB->succ_size() < 2)
1765fdaaf7fSRong Xu       continue;
1775fdaaf7fSRong Xu     const MachineBasicBlock *EC = EquivalenceClass[BB];
1785fdaaf7fSRong Xu     uint64_t BBWeight = BlockWeights[EC];
1795fdaaf7fSRong Xu     uint64_t SumEdgeWeight = 0;
180cba40c4eSKazu Hirata     for (MachineBasicBlock *Succ : BB->successors()) {
1815fdaaf7fSRong Xu       Edge E = std::make_pair(BB, Succ);
1825fdaaf7fSRong Xu       SumEdgeWeight += EdgeWeights[E];
1835fdaaf7fSRong Xu     }
1845fdaaf7fSRong Xu 
1855fdaaf7fSRong Xu     if (BBWeight != SumEdgeWeight) {
1865fdaaf7fSRong Xu       LLVM_DEBUG(dbgs() << "BBweight is not equal to SumEdgeWeight: BBWWeight="
1875fdaaf7fSRong Xu                         << BBWeight << " SumEdgeWeight= " << SumEdgeWeight
1885fdaaf7fSRong Xu                         << "\n");
1895fdaaf7fSRong Xu       BBWeight = SumEdgeWeight;
1905fdaaf7fSRong Xu     }
1915fdaaf7fSRong Xu     if (BBWeight == 0) {
1925fdaaf7fSRong Xu       LLVM_DEBUG(dbgs() << "SKIPPED. All branch weights are zero.\n");
1935fdaaf7fSRong Xu       continue;
1945fdaaf7fSRong Xu     }
1955fdaaf7fSRong Xu 
1965fdaaf7fSRong Xu #ifndef NDEBUG
1975fdaaf7fSRong Xu     uint64_t BBWeightOrig = BBWeight;
1985fdaaf7fSRong Xu #endif
1995fdaaf7fSRong Xu     uint32_t MaxWeight = std::numeric_limits<uint32_t>::max();
2005fdaaf7fSRong Xu     uint32_t Factor = 1;
2015fdaaf7fSRong Xu     if (BBWeight > MaxWeight) {
2025fdaaf7fSRong Xu       Factor = BBWeight / MaxWeight + 1;
2035fdaaf7fSRong Xu       BBWeight /= Factor;
2045fdaaf7fSRong Xu       LLVM_DEBUG(dbgs() << "Scaling weights by " << Factor << "\n");
2055fdaaf7fSRong Xu     }
2065fdaaf7fSRong Xu 
2075fdaaf7fSRong Xu     for (MachineBasicBlock::succ_iterator SI = BB->succ_begin(),
2085fdaaf7fSRong Xu                                           SE = BB->succ_end();
2095fdaaf7fSRong Xu          SI != SE; ++SI) {
2105fdaaf7fSRong Xu       MachineBasicBlock *Succ = *SI;
2115fdaaf7fSRong Xu       Edge E = std::make_pair(BB, Succ);
2125fdaaf7fSRong Xu       uint64_t EdgeWeight = EdgeWeights[E];
2135fdaaf7fSRong Xu       EdgeWeight /= Factor;
2145fdaaf7fSRong Xu 
2155fdaaf7fSRong Xu       assert(BBWeight >= EdgeWeight &&
2165fdaaf7fSRong Xu              "BBweight is larger than EdgeWeight -- should not happen.\n");
2175fdaaf7fSRong Xu 
2185fdaaf7fSRong Xu       BranchProbability OldProb = BFI->getMBPI()->getEdgeProbability(BB, SI);
2195fdaaf7fSRong Xu       BranchProbability NewProb(EdgeWeight, BBWeight);
2205fdaaf7fSRong Xu       if (OldProb == NewProb)
2215fdaaf7fSRong Xu         continue;
2225fdaaf7fSRong Xu       BB->setSuccProbability(SI, NewProb);
2235fdaaf7fSRong Xu #ifndef NDEBUG
2245fdaaf7fSRong Xu       if (!ShowFSBranchProb)
2255fdaaf7fSRong Xu         continue;
2265fdaaf7fSRong Xu       bool Show = false;
2275fdaaf7fSRong Xu       BranchProbability Diff;
2285fdaaf7fSRong Xu       if (OldProb > NewProb)
2295fdaaf7fSRong Xu         Diff = OldProb - NewProb;
2305fdaaf7fSRong Xu       else
2315fdaaf7fSRong Xu         Diff = NewProb - OldProb;
2325fdaaf7fSRong Xu       Show = (Diff >= BranchProbability(FSProfileDebugProbDiffThreshold, 100));
2335fdaaf7fSRong Xu       Show &= (BBWeightOrig >= FSProfileDebugBWThreshold);
2345fdaaf7fSRong Xu 
2355fdaaf7fSRong Xu       auto DIL = BB->findBranchDebugLoc();
2365fdaaf7fSRong Xu       auto SuccDIL = Succ->findBranchDebugLoc();
2375fdaaf7fSRong Xu       if (Show) {
2385fdaaf7fSRong Xu         dbgs() << "Set branch fs prob: MBB (" << BB->getNumber() << " -> "
2395fdaaf7fSRong Xu                << Succ->getNumber() << "): ";
2405fdaaf7fSRong Xu         if (DIL)
2415fdaaf7fSRong Xu           dbgs() << DIL->getFilename() << ":" << DIL->getLine() << ":"
2425fdaaf7fSRong Xu                  << DIL->getColumn();
2435fdaaf7fSRong Xu         if (SuccDIL)
2445fdaaf7fSRong Xu           dbgs() << "-->" << SuccDIL->getFilename() << ":" << SuccDIL->getLine()
2455fdaaf7fSRong Xu                  << ":" << SuccDIL->getColumn();
2465fdaaf7fSRong Xu         dbgs() << " W=" << BBWeightOrig << "  " << OldProb << " --> " << NewProb
2475fdaaf7fSRong Xu                << "\n";
2485fdaaf7fSRong Xu       }
2495fdaaf7fSRong Xu #endif
2505fdaaf7fSRong Xu     }
2515fdaaf7fSRong Xu   }
2525fdaaf7fSRong Xu }
2535fdaaf7fSRong Xu 
doInitialization(Module & M)2545fdaaf7fSRong Xu bool MIRProfileLoader::doInitialization(Module &M) {
2555fdaaf7fSRong Xu   auto &Ctx = M.getContext();
2565fdaaf7fSRong Xu 
2575fdaaf7fSRong Xu   auto ReaderOrErr = sampleprof::SampleProfileReader::create(Filename, Ctx, P,
2585fdaaf7fSRong Xu                                                              RemappingFilename);
2595fdaaf7fSRong Xu   if (std::error_code EC = ReaderOrErr.getError()) {
2605fdaaf7fSRong Xu     std::string Msg = "Could not open profile: " + EC.message();
2615fdaaf7fSRong Xu     Ctx.diagnose(DiagnosticInfoSampleProfile(Filename, Msg));
2625fdaaf7fSRong Xu     return false;
2635fdaaf7fSRong Xu   }
2645fdaaf7fSRong Xu 
2655fdaaf7fSRong Xu   Reader = std::move(ReaderOrErr.get());
2665fdaaf7fSRong Xu   Reader->setModule(&M);
2675fdaaf7fSRong Xu   ProfileIsValid = (Reader->read() == sampleprof_error::success);
2685fdaaf7fSRong Xu   Reader->getSummary();
2695fdaaf7fSRong Xu 
2705fdaaf7fSRong Xu   return true;
2715fdaaf7fSRong Xu }
2725fdaaf7fSRong Xu 
runOnFunction(MachineFunction & MF)2735fdaaf7fSRong Xu bool MIRProfileLoader::runOnFunction(MachineFunction &MF) {
2745fdaaf7fSRong Xu   Function &Func = MF.getFunction();
2755fdaaf7fSRong Xu   clearFunctionData(false);
2765fdaaf7fSRong Xu   Samples = Reader->getSamplesFor(Func);
2775fdaaf7fSRong Xu   if (!Samples || Samples->empty())
2785fdaaf7fSRong Xu     return false;
2795fdaaf7fSRong Xu 
2805fdaaf7fSRong Xu   if (getFunctionLoc(MF) == 0)
2815fdaaf7fSRong Xu     return false;
2825fdaaf7fSRong Xu 
2835fdaaf7fSRong Xu   DenseSet<GlobalValue::GUID> InlinedGUIDs;
2845fdaaf7fSRong Xu   bool Changed = computeAndPropagateWeights(MF, InlinedGUIDs);
2855fdaaf7fSRong Xu 
2865fdaaf7fSRong Xu   // Set the new BPI, BFI.
2875fdaaf7fSRong Xu   setBranchProbs(MF);
2885fdaaf7fSRong Xu 
2895fdaaf7fSRong Xu   return Changed;
2905fdaaf7fSRong Xu }
2915fdaaf7fSRong Xu 
2925fdaaf7fSRong Xu } // namespace llvm
2935fdaaf7fSRong Xu 
MIRProfileLoaderPass(std::string FileName,std::string RemappingFileName,FSDiscriminatorPass P)2941e586bccSAdrian Prantl MIRProfileLoaderPass::MIRProfileLoaderPass(std::string FileName,
2951e586bccSAdrian Prantl                                            std::string RemappingFileName,
2961e586bccSAdrian Prantl                                            FSDiscriminatorPass P)
2971e586bccSAdrian Prantl     : MachineFunctionPass(ID), ProfileFileName(FileName), P(P),
2981e586bccSAdrian Prantl       MIRSampleLoader(
2991e586bccSAdrian Prantl           std::make_unique<MIRProfileLoader>(FileName, RemappingFileName)) {
3001e586bccSAdrian Prantl   LowBit = getFSPassBitBegin(P);
3011e586bccSAdrian Prantl   HighBit = getFSPassBitEnd(P);
3021e586bccSAdrian Prantl   assert(LowBit < HighBit && "HighBit needs to be greater than Lowbit");
3031e586bccSAdrian Prantl }
3041e586bccSAdrian Prantl 
runOnMachineFunction(MachineFunction & MF)3055fdaaf7fSRong Xu bool MIRProfileLoaderPass::runOnMachineFunction(MachineFunction &MF) {
3065fdaaf7fSRong Xu   if (!MIRSampleLoader->isValid())
3075fdaaf7fSRong Xu     return false;
3085fdaaf7fSRong Xu 
3095fdaaf7fSRong Xu   LLVM_DEBUG(dbgs() << "MIRProfileLoader pass working on Func: "
3105fdaaf7fSRong Xu                     << MF.getFunction().getName() << "\n");
3115fdaaf7fSRong Xu   MBFI = &getAnalysis<MachineBlockFrequencyInfo>();
3125fdaaf7fSRong Xu   MIRSampleLoader->setInitVals(
3135fdaaf7fSRong Xu       &getAnalysis<MachineDominatorTree>(),
3145fdaaf7fSRong Xu       &getAnalysis<MachinePostDominatorTree>(), &getAnalysis<MachineLoopInfo>(),
3155fdaaf7fSRong Xu       MBFI, &getAnalysis<MachineOptimizationRemarkEmitterPass>().getORE());
3165fdaaf7fSRong Xu 
3175fdaaf7fSRong Xu   MF.RenumberBlocks();
3185fdaaf7fSRong Xu   if (ViewBFIBefore && ViewBlockLayoutWithBFI != GVDT_None &&
3195fdaaf7fSRong Xu       (ViewBlockFreqFuncName.empty() ||
3205fdaaf7fSRong Xu        MF.getFunction().getName().equals(ViewBlockFreqFuncName))) {
3215fdaaf7fSRong Xu     MBFI->view("MIR_Prof_loader_b." + MF.getName(), false);
3225fdaaf7fSRong Xu   }
3235fdaaf7fSRong Xu 
3245fdaaf7fSRong Xu   bool Changed = MIRSampleLoader->runOnFunction(MF);
325bf113849SRong Xu   if (Changed)
326bf113849SRong Xu     MBFI->calculate(MF, *MBFI->getMBPI(), *&getAnalysis<MachineLoopInfo>());
3275fdaaf7fSRong Xu 
3285fdaaf7fSRong Xu   if (ViewBFIAfter && ViewBlockLayoutWithBFI != GVDT_None &&
3295fdaaf7fSRong Xu       (ViewBlockFreqFuncName.empty() ||
3305fdaaf7fSRong Xu        MF.getFunction().getName().equals(ViewBlockFreqFuncName))) {
3315fdaaf7fSRong Xu     MBFI->view("MIR_prof_loader_a." + MF.getName(), false);
3325fdaaf7fSRong Xu   }
3335fdaaf7fSRong Xu 
3345fdaaf7fSRong Xu   return Changed;
3355fdaaf7fSRong Xu }
3365fdaaf7fSRong Xu 
doInitialization(Module & M)3375fdaaf7fSRong Xu bool MIRProfileLoaderPass::doInitialization(Module &M) {
3385fdaaf7fSRong Xu   LLVM_DEBUG(dbgs() << "MIRProfileLoader pass working on Module " << M.getName()
3395fdaaf7fSRong Xu                     << "\n");
3405fdaaf7fSRong Xu 
3415fdaaf7fSRong Xu   MIRSampleLoader->setFSPass(P);
3425fdaaf7fSRong Xu   return MIRSampleLoader->doInitialization(M);
3435fdaaf7fSRong Xu }
3445fdaaf7fSRong Xu 
getAnalysisUsage(AnalysisUsage & AU) const3455fdaaf7fSRong Xu void MIRProfileLoaderPass::getAnalysisUsage(AnalysisUsage &AU) const {
3465fdaaf7fSRong Xu   AU.setPreservesAll();
3475fdaaf7fSRong Xu   AU.addRequired<MachineBlockFrequencyInfo>();
3485fdaaf7fSRong Xu   AU.addRequired<MachineDominatorTree>();
3495fdaaf7fSRong Xu   AU.addRequired<MachinePostDominatorTree>();
3505fdaaf7fSRong Xu   AU.addRequiredTransitive<MachineLoopInfo>();
3515fdaaf7fSRong Xu   AU.addRequired<MachineOptimizationRemarkEmitterPass>();
3525fdaaf7fSRong Xu   MachineFunctionPass::getAnalysisUsage(AU);
3535fdaaf7fSRong Xu }
354