[MBFI] Move BranchFolding::MBFIWrapper to its own files. NFC.

Summary:
To avoid header file circular dependency issues in passing updated MBFI (in
MBFIWrapper) to the interface of profile guided size optimizations.

A prep step for (and split off of) D73381.

Reviewers: davidxl

Subscribers: mgorny, hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D73494
This commit is contained in:
Hiroshi Yamauchi 2020-01-27 10:05:54 -08:00
parent b8d9ac0870
commit 2c03c899d5
7 changed files with 102 additions and 65 deletions

View File

@ -0,0 +1,46 @@
//===- llvm/CodeGen/MBFIWrapper.h -------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This class keeps track of branch frequencies of newly created blocks and
// tail-merged blocks. Used by the TailDuplication and MachineBlockPlacement.
//
//===----------------------------------------------------------------------===//
#ifndef LLVM_CODEGEN_MBFIWRAPPER_H
#define LLVM_CODEGEN_MBFIWRAPPER_H
#include "llvm/ADT/DenseMap.h"
#include "llvm/Support/BlockFrequency.h"
namespace llvm {
class MachineBasicBlock;
class MachineBlockFrequencyInfo;
class MBFIWrapper {
public:
MBFIWrapper(const MachineBlockFrequencyInfo &I) : MBFI(I) {}
BlockFrequency getBlockFreq(const MachineBasicBlock *MBB) const;
void setBlockFreq(const MachineBasicBlock *MBB, BlockFrequency F);
raw_ostream &printBlockFreq(raw_ostream &OS,
const MachineBasicBlock *MBB) const;
raw_ostream &printBlockFreq(raw_ostream &OS,
const BlockFrequency Freq) const;
void view(const Twine &Name, bool isSimple = true);
uint64_t getEntryFreq() const;
const MachineBlockFrequencyInfo &getMBFI() { return MBFI; }
private:
const MachineBlockFrequencyInfo &MBFI;
DenseMap<const MachineBasicBlock *, BlockFrequency> MergedBBFreq;
};
} // end namespace llvm
#endif // LLVM_CODEGEN_MBFIWRAPPER_H

View File

@ -129,7 +129,7 @@ bool BranchFolderPass::runOnMachineFunction(MachineFunction &MF) {
// HW that requires structurized CFG. // HW that requires structurized CFG.
bool EnableTailMerge = !MF.getTarget().requiresStructuredCFG() && bool EnableTailMerge = !MF.getTarget().requiresStructuredCFG() &&
PassConfig->getEnableTailMerge(); PassConfig->getEnableTailMerge();
BranchFolder::MBFIWrapper MBBFreqInfo( MBFIWrapper MBBFreqInfo(
getAnalysis<MachineBlockFrequencyInfo>()); getAnalysis<MachineBlockFrequencyInfo>());
BranchFolder Folder(EnableTailMerge, /*CommonHoist=*/true, MBBFreqInfo, BranchFolder Folder(EnableTailMerge, /*CommonHoist=*/true, MBBFreqInfo,
getAnalysis<MachineBranchProbabilityInfo>(), getAnalysis<MachineBranchProbabilityInfo>(),
@ -501,42 +501,6 @@ BranchFolder::MergePotentialsElt::operator<(const MergePotentialsElt &o) const {
#endif #endif
} }
BlockFrequency
BranchFolder::MBFIWrapper::getBlockFreq(const MachineBasicBlock *MBB) const {
auto I = MergedBBFreq.find(MBB);
if (I != MergedBBFreq.end())
return I->second;
return MBFI.getBlockFreq(MBB);
}
void BranchFolder::MBFIWrapper::setBlockFreq(const MachineBasicBlock *MBB,
BlockFrequency F) {
MergedBBFreq[MBB] = F;
}
raw_ostream &
BranchFolder::MBFIWrapper::printBlockFreq(raw_ostream &OS,
const MachineBasicBlock *MBB) const {
return MBFI.printBlockFreq(OS, getBlockFreq(MBB));
}
raw_ostream &
BranchFolder::MBFIWrapper::printBlockFreq(raw_ostream &OS,
const BlockFrequency Freq) const {
return MBFI.printBlockFreq(OS, Freq);
}
void BranchFolder::MBFIWrapper::view(const Twine &Name, bool isSimple) {
MBFI.view(Name, isSimple);
}
uint64_t
BranchFolder::MBFIWrapper::getEntryFreq() const {
return MBFI.getEntryFreq();
}
/// CountTerminators - Count the number of terminators in the given /// CountTerminators - Count the number of terminators in the given
/// block and set I to the position of the first non-terminator, if there /// block and set I to the position of the first non-terminator, if there
/// is one, or MBB->end() otherwise. /// is one, or MBB->end() otherwise.
@ -591,7 +555,7 @@ ProfitableToMerge(MachineBasicBlock *MBB1, MachineBasicBlock *MBB2,
MachineBasicBlock *PredBB, MachineBasicBlock *PredBB,
DenseMap<const MachineBasicBlock *, int> &EHScopeMembership, DenseMap<const MachineBasicBlock *, int> &EHScopeMembership,
bool AfterPlacement, bool AfterPlacement,
BranchFolder::MBFIWrapper &MBBFreqInfo, MBFIWrapper &MBBFreqInfo,
ProfileSummaryInfo *PSI) { ProfileSummaryInfo *PSI) {
// It is never profitable to tail-merge blocks from two different EH scopes. // It is never profitable to tail-merge blocks from two different EH scopes.
if (!EHScopeMembership.empty()) { if (!EHScopeMembership.empty()) {

View File

@ -13,6 +13,7 @@
#include "llvm/ADT/SmallPtrSet.h" #include "llvm/ADT/SmallPtrSet.h"
#include "llvm/CodeGen/LivePhysRegs.h" #include "llvm/CodeGen/LivePhysRegs.h"
#include "llvm/CodeGen/MachineBasicBlock.h" #include "llvm/CodeGen/MachineBasicBlock.h"
#include "llvm/CodeGen/MBFIWrapper.h"
#include "llvm/Support/BlockFrequency.h" #include "llvm/Support/BlockFrequency.h"
#include "llvm/Support/Compiler.h" #include "llvm/Support/Compiler.h"
#include <cstdint> #include <cstdint>
@ -34,8 +35,6 @@ class TargetRegisterInfo;
class LLVM_LIBRARY_VISIBILITY BranchFolder { class LLVM_LIBRARY_VISIBILITY BranchFolder {
public: public:
class MBFIWrapper;
explicit BranchFolder(bool defaultEnableTailMerge, explicit BranchFolder(bool defaultEnableTailMerge,
bool CommonHoist, bool CommonHoist,
MBFIWrapper &FreqInfo, MBFIWrapper &FreqInfo,
@ -132,28 +131,6 @@ class TargetRegisterInfo;
MachineLoopInfo *MLI; MachineLoopInfo *MLI;
LivePhysRegs LiveRegs; LivePhysRegs LiveRegs;
public:
/// This class keeps track of branch frequencies of newly created
/// blocks and tail-merged blocks.
class MBFIWrapper {
public:
MBFIWrapper(const MachineBlockFrequencyInfo &I) : MBFI(I) {}
BlockFrequency getBlockFreq(const MachineBasicBlock *MBB) const;
void setBlockFreq(const MachineBasicBlock *MBB, BlockFrequency F);
raw_ostream &printBlockFreq(raw_ostream &OS,
const MachineBasicBlock *MBB) const;
raw_ostream &printBlockFreq(raw_ostream &OS,
const BlockFrequency Freq) const;
void view(const Twine &Name, bool isSimple = true);
uint64_t getEntryFreq() const;
const MachineBlockFrequencyInfo &getMBFI() { return MBFI; }
private:
const MachineBlockFrequencyInfo &MBFI;
DenseMap<const MachineBasicBlock *, BlockFrequency> MergedBBFreq;
};
private: private:
MBFIWrapper &MBBFreqInfo; MBFIWrapper &MBBFreqInfo;
const MachineBranchProbabilityInfo &MBPI; const MachineBranchProbabilityInfo &MBPI;

View File

@ -99,6 +99,7 @@ add_llvm_component_library(LLVMCodeGen
MachineVerifier.cpp MachineVerifier.cpp
ModuloSchedule.cpp ModuloSchedule.cpp
PatchableFunction.cpp PatchableFunction.cpp
MBFIWrapper.cpp
MIRPrinter.cpp MIRPrinter.cpp
MIRPrintingPass.cpp MIRPrintingPass.cpp
MacroFusion.cpp MacroFusion.cpp

View File

@ -447,7 +447,7 @@ bool IfConverter::runOnMachineFunction(MachineFunction &MF) {
TLI = ST.getTargetLowering(); TLI = ST.getTargetLowering();
TII = ST.getInstrInfo(); TII = ST.getInstrInfo();
TRI = ST.getRegisterInfo(); TRI = ST.getRegisterInfo();
BranchFolder::MBFIWrapper MBFI(getAnalysis<MachineBlockFrequencyInfo>()); MBFIWrapper MBFI(getAnalysis<MachineBlockFrequencyInfo>());
MBPI = &getAnalysis<MachineBranchProbabilityInfo>(); MBPI = &getAnalysis<MachineBranchProbabilityInfo>();
ProfileSummaryInfo *PSI = ProfileSummaryInfo *PSI =
&getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI(); &getAnalysis<ProfileSummaryInfoWrapperPass>().getPSI();

View File

@ -0,0 +1,49 @@
//===- MBFIWrapper.cpp - MachineBlockFrequencyInfo wrapper ----------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This class keeps track of branch frequencies of newly created blocks and
// tail-merged blocks. Used by the TailDuplication and MachineBlockPlacement.
//
//===----------------------------------------------------------------------===//
#include "llvm/CodeGen/MBFIWrapper.h"
#include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
using namespace llvm;
BlockFrequency MBFIWrapper::getBlockFreq(const MachineBasicBlock *MBB) const {
auto I = MergedBBFreq.find(MBB);
if (I != MergedBBFreq.end())
return I->second;
return MBFI.getBlockFreq(MBB);
}
void MBFIWrapper::setBlockFreq(const MachineBasicBlock *MBB,
BlockFrequency F) {
MergedBBFreq[MBB] = F;
}
raw_ostream & MBFIWrapper::printBlockFreq(raw_ostream &OS,
const MachineBasicBlock *MBB) const {
return MBFI.printBlockFreq(OS, getBlockFreq(MBB));
}
raw_ostream & MBFIWrapper::printBlockFreq(raw_ostream &OS,
const BlockFrequency Freq) const {
return MBFI.printBlockFreq(OS, Freq);
}
void MBFIWrapper::view(const Twine &Name, bool isSimple) {
MBFI.view(Name, isSimple);
}
uint64_t MBFIWrapper::getEntryFreq() const {
return MBFI.getEntryFreq();
}

View File

@ -346,7 +346,7 @@ class MachineBlockPlacement : public MachineFunctionPass {
const MachineBranchProbabilityInfo *MBPI; const MachineBranchProbabilityInfo *MBPI;
/// A handle to the function-wide block frequency pass. /// A handle to the function-wide block frequency pass.
std::unique_ptr<BranchFolder::MBFIWrapper> MBFI; std::unique_ptr<MBFIWrapper> MBFI;
/// A handle to the loop info. /// A handle to the loop info.
MachineLoopInfo *MLI; MachineLoopInfo *MLI;
@ -3046,7 +3046,7 @@ bool MachineBlockPlacement::runOnMachineFunction(MachineFunction &MF) {
F = &MF; F = &MF;
MBPI = &getAnalysis<MachineBranchProbabilityInfo>(); MBPI = &getAnalysis<MachineBranchProbabilityInfo>();
MBFI = std::make_unique<BranchFolder::MBFIWrapper>( MBFI = std::make_unique<MBFIWrapper>(
getAnalysis<MachineBlockFrequencyInfo>()); getAnalysis<MachineBlockFrequencyInfo>());
MLI = &getAnalysis<MachineLoopInfo>(); MLI = &getAnalysis<MachineLoopInfo>();
TII = MF.getSubtarget().getInstrInfo(); TII = MF.getSubtarget().getInstrInfo();