forked from OSchip/llvm-project
[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:
parent
b8d9ac0870
commit
2c03c899d5
|
@ -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
|
|
@ -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()) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue