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