12c03c899SHiroshi Yamauchi //===- MBFIWrapper.cpp - MachineBlockFrequencyInfo wrapper ----------------===//
22c03c899SHiroshi Yamauchi //
32c03c899SHiroshi Yamauchi // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42c03c899SHiroshi Yamauchi // See https://llvm.org/LICENSE.txt for license information.
52c03c899SHiroshi Yamauchi // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
62c03c899SHiroshi Yamauchi //
72c03c899SHiroshi Yamauchi //===----------------------------------------------------------------------===//
82c03c899SHiroshi Yamauchi //
92c03c899SHiroshi Yamauchi // This class keeps track of branch frequencies of newly created blocks and
102c03c899SHiroshi Yamauchi // tail-merged blocks. Used by the TailDuplication and MachineBlockPlacement.
112c03c899SHiroshi Yamauchi //
122c03c899SHiroshi Yamauchi //===----------------------------------------------------------------------===//
132c03c899SHiroshi Yamauchi
14*983565a6SNikita Popov #include "llvm/ADT/Optional.h"
152c03c899SHiroshi Yamauchi #include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
16*983565a6SNikita Popov #include "llvm/CodeGen/MBFIWrapper.h"
172c03c899SHiroshi Yamauchi
182c03c899SHiroshi Yamauchi using namespace llvm;
192c03c899SHiroshi Yamauchi
getBlockFreq(const MachineBasicBlock * MBB) const202c03c899SHiroshi Yamauchi BlockFrequency MBFIWrapper::getBlockFreq(const MachineBasicBlock *MBB) const {
212c03c899SHiroshi Yamauchi auto I = MergedBBFreq.find(MBB);
222c03c899SHiroshi Yamauchi
232c03c899SHiroshi Yamauchi if (I != MergedBBFreq.end())
242c03c899SHiroshi Yamauchi return I->second;
252c03c899SHiroshi Yamauchi
262c03c899SHiroshi Yamauchi return MBFI.getBlockFreq(MBB);
272c03c899SHiroshi Yamauchi }
282c03c899SHiroshi Yamauchi
setBlockFreq(const MachineBasicBlock * MBB,BlockFrequency F)292c03c899SHiroshi Yamauchi void MBFIWrapper::setBlockFreq(const MachineBasicBlock *MBB,
302c03c899SHiroshi Yamauchi BlockFrequency F) {
312c03c899SHiroshi Yamauchi MergedBBFreq[MBB] = F;
322c03c899SHiroshi Yamauchi }
332c03c899SHiroshi Yamauchi
34fd75ad86SGuozhi Wei Optional<uint64_t>
getBlockProfileCount(const MachineBasicBlock * MBB) const35fd75ad86SGuozhi Wei MBFIWrapper::getBlockProfileCount(const MachineBasicBlock *MBB) const {
36fd75ad86SGuozhi Wei auto I = MergedBBFreq.find(MBB);
37fd75ad86SGuozhi Wei
38fd75ad86SGuozhi Wei // Modified block frequency also impacts profile count. So we should compute
39fd75ad86SGuozhi Wei // profile count from new block frequency if it has been changed.
40fd75ad86SGuozhi Wei if (I != MergedBBFreq.end())
41fd75ad86SGuozhi Wei return MBFI.getProfileCountFromFreq(I->second.getFrequency());
42fd75ad86SGuozhi Wei
43fd75ad86SGuozhi Wei return MBFI.getBlockProfileCount(MBB);
44fd75ad86SGuozhi Wei }
45fd75ad86SGuozhi Wei
printBlockFreq(raw_ostream & OS,const MachineBasicBlock * MBB) const462c03c899SHiroshi Yamauchi raw_ostream & MBFIWrapper::printBlockFreq(raw_ostream &OS,
472c03c899SHiroshi Yamauchi const MachineBasicBlock *MBB) const {
482c03c899SHiroshi Yamauchi return MBFI.printBlockFreq(OS, getBlockFreq(MBB));
492c03c899SHiroshi Yamauchi }
502c03c899SHiroshi Yamauchi
printBlockFreq(raw_ostream & OS,const BlockFrequency Freq) const512c03c899SHiroshi Yamauchi raw_ostream & MBFIWrapper::printBlockFreq(raw_ostream &OS,
522c03c899SHiroshi Yamauchi const BlockFrequency Freq) const {
532c03c899SHiroshi Yamauchi return MBFI.printBlockFreq(OS, Freq);
542c03c899SHiroshi Yamauchi }
552c03c899SHiroshi Yamauchi
view(const Twine & Name,bool isSimple)562c03c899SHiroshi Yamauchi void MBFIWrapper::view(const Twine &Name, bool isSimple) {
572c03c899SHiroshi Yamauchi MBFI.view(Name, isSimple);
582c03c899SHiroshi Yamauchi }
592c03c899SHiroshi Yamauchi
getEntryFreq() const602c03c899SHiroshi Yamauchi uint64_t MBFIWrapper::getEntryFreq() const {
612c03c899SHiroshi Yamauchi return MBFI.getEntryFreq();
622c03c899SHiroshi Yamauchi }
63