class BlockFrequencyInfoImplBase

Declaration

class BlockFrequencyInfoImplBase { /* full declaration omitted */ };

Description

Base class for BlockFrequencyInfoImpl BlockFrequencyInfoImplBase has supporting data structures and some algorithms for BlockFrequencyInfoImplBase. Only algorithms that depend on the block type (or that call such algorithms) are skipped here. Nevertheless, the majority of the overall algorithm documentation lives with BlockFrequencyInfoImpl. See there for details.

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:179

Member Variables

public std::vector<FrequencyData> Freqs
Data about each block. This is used downstream.
public SparseBitVector<> IsIrrLoopHeader
Whether each block is an irreducible loop header. This is used downstream.
public std::vector<WorkingData> Working
Loop data: see initializeLoops().
public std::list<LoopData> Loops
Indexed information about loops.

Method Overview

  • public bool addLoopSuccessorsToDist(const llvm::BlockFrequencyInfoImplBase::LoopData * OuterLoop, llvm::BlockFrequencyInfoImplBase::LoopData & Loop, llvm::BlockFrequencyInfoImplBase::Distribution & Dist)
  • public bool addToDist(llvm::BlockFrequencyInfoImplBase::Distribution & Dist, const llvm::BlockFrequencyInfoImplBase::LoopData * OuterLoop, const llvm::BlockFrequencyInfoImplBase::BlockNode & Pred, const llvm::BlockFrequencyInfoImplBase::BlockNode & Succ, uint64_t Weight)
  • public void adjustLoopHeaderMass(llvm::BlockFrequencyInfoImplBase::LoopData & Loop)
  • public iterator_range<std::list<LoopData>::iterator> analyzeIrreducible(const bfi_detail::IrreducibleGraph & G, llvm::BlockFrequencyInfoImplBase::LoopData * OuterLoop, std::list<LoopData>::iterator Insert)
  • public void clear()
  • public void computeLoopScale(llvm::BlockFrequencyInfoImplBase::LoopData & Loop)
  • public void distributeIrrLoopHeaderMass(llvm::BlockFrequencyInfoImplBase::Distribution & Dist)
  • public void distributeMass(const llvm::BlockFrequencyInfoImplBase::BlockNode & Source, llvm::BlockFrequencyInfoImplBase::LoopData * OuterLoop, llvm::BlockFrequencyInfoImplBase::Distribution & Dist)
  • public void dump() const
  • public void finalizeMetrics()
  • public llvm::BlockFrequency getBlockFreq(const llvm::BlockFrequencyInfoImplBase::BlockNode & Node) const
  • public virtual std::string getBlockName(const llvm::BlockFrequencyInfoImplBase::BlockNode & Node) const
  • public Optional<uint64_t> getBlockProfileCount(const llvm::Function & F, const llvm::BlockFrequencyInfoImplBase::BlockNode & Node, bool AllowSynthetic = false) const
  • public uint64_t getEntryFreq() const
  • public llvm::BlockFrequencyInfoImplBase::Scaled64 getFloatingBlockFreq(const llvm::BlockFrequencyInfoImplBase::BlockNode & Node) const
  • public std::string getLoopName(const llvm::BlockFrequencyInfoImplBase::LoopData & Loop) const
  • public Optional<uint64_t> getProfileCountFromFreq(const llvm::Function & F, uint64_t Freq, bool AllowSynthetic = false) const
  • public bool isIrrLoopHeader(const llvm::BlockFrequencyInfoImplBase::BlockNode & Node)
  • public void packageLoop(llvm::BlockFrequencyInfoImplBase::LoopData & Loop)
  • public virtual llvm::raw_ostream & print(llvm::raw_ostream & OS) const
  • public llvm::raw_ostream & printBlockFreq(llvm::raw_ostream & OS, const llvm::BlockFrequencyInfoImplBase::BlockNode & Node) const
  • public llvm::raw_ostream & printBlockFreq(llvm::raw_ostream & OS, const llvm::BlockFrequency & Freq) const
  • public void setBlockFreq(const llvm::BlockFrequencyInfoImplBase::BlockNode & Node, uint64_t Freq)
  • public void unwrapLoops()
  • public void updateLoopWithIrreducible(llvm::BlockFrequencyInfoImplBase::LoopData & OuterLoop)
  • public virtual ~BlockFrequencyInfoImplBase()

Methods

bool addLoopSuccessorsToDist(
    const llvm::BlockFrequencyInfoImplBase::
        LoopData* OuterLoop,
    llvm::BlockFrequencyInfoImplBase::LoopData&
        Loop,
    llvm::BlockFrequencyInfoImplBase::
        Distribution& Dist)

Description

Add all edges out of a packaged loop to the distribution. Adds all edges from LocalLoopHead to Dist. Calls addToDist() to add each successor edge.

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:445

Parameters

const llvm::BlockFrequencyInfoImplBase::LoopData* OuterLoop
llvm::BlockFrequencyInfoImplBase::LoopData& Loop
llvm::BlockFrequencyInfoImplBase::Distribution& Dist

Returns

\c true unless there's an irreducible backedge.

bool addToDist(
    llvm::BlockFrequencyInfoImplBase::
        Distribution& Dist,
    const llvm::BlockFrequencyInfoImplBase::
        LoopData* OuterLoop,
    const llvm::BlockFrequencyInfoImplBase::
        BlockNode& Pred,
    const llvm::BlockFrequencyInfoImplBase::
        BlockNode& Succ,
    uint64_t Weight)

Description

Add an edge to the distribution. Adds an edge to Succ to Dist. If \c LoopHead.isValid(), then whether the edge is local/exit/backedge is in the context of LoopHead. Otherwise, every edge should be a local edge (since all the loops are packaged up).

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:455

Parameters

llvm::BlockFrequencyInfoImplBase::Distribution& Dist
const llvm::BlockFrequencyInfoImplBase::LoopData* OuterLoop
const llvm::BlockFrequencyInfoImplBase::BlockNode& Pred
const llvm::BlockFrequencyInfoImplBase::BlockNode& Succ
uint64_t Weight

Returns

\c true unless aborted due to an irreducible backedge.

void adjustLoopHeaderMass(
    llvm::BlockFrequencyInfoImplBase::LoopData&
        Loop)

Description

Adjust the mass of all headers in an irreducible loop. Initially, irreducible loops are assumed to distribute their mass equally among its headers. This can lead to wrong frequency estimates since some headers may be executed more frequently than others. This adjusts header mass distribution so it matches the weights of the backedges going into each of the loop headers.

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:497

Parameters

llvm::BlockFrequencyInfoImplBase::LoopData& Loop

iterator_range<std::list<LoopData>::iterator>
analyzeIrreducible(
    const bfi_detail::IrreducibleGraph& G,
    llvm::BlockFrequencyInfoImplBase::LoopData*
        OuterLoop,
    std::list<LoopData>::iterator Insert)

Description

Analyze irreducible SCCs. Separate irreducible SCCs from \c G, which is an explicit graph of \c OuterLoop (or the top-level function, if \c OuterLoop is \c nullptr). Insert them into \a Loops before \c Insert.

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:466

Parameters

const bfi_detail::IrreducibleGraph& G
llvm::BlockFrequencyInfoImplBase::LoopData* OuterLoop
std::list<LoopData>::iterator Insert

Returns

the \c LoopData nodes representing the irreducible SCCs.

void clear()

Description

Clear all memory.

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:514

void computeLoopScale(
    llvm::BlockFrequencyInfoImplBase::LoopData&
        Loop)

Description

Compute the loop scale for a loop.

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:487

Parameters

llvm::BlockFrequencyInfoImplBase::LoopData& Loop

void distributeIrrLoopHeaderMass(
    llvm::BlockFrequencyInfoImplBase::
        Distribution& Dist)

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:499

Parameters

llvm::BlockFrequencyInfoImplBase::Distribution& Dist

void distributeMass(
    const llvm::BlockFrequencyInfoImplBase::
        BlockNode& Source,
    llvm::BlockFrequencyInfoImplBase::LoopData*
        OuterLoop,
    llvm::BlockFrequencyInfoImplBase::
        Distribution& Dist)

Description

Distribute mass according to a distribution. Distributes the mass in Source according to Dist. If LoopHead.isValid(), backedges and exits are stored in its entry in Loops. Mass is distributed in parallel from two copies of the source mass.

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:483

Parameters

const llvm::BlockFrequencyInfoImplBase::BlockNode& Source
llvm::BlockFrequencyInfoImplBase::LoopData* OuterLoop
llvm::BlockFrequencyInfoImplBase::Distribution& Dist

void dump() const

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:520

void finalizeMetrics()

Description

Finalize frequency metrics. Calculates final frequencies and cleans up no-longer-needed data structures.

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:511

llvm::BlockFrequency getBlockFreq(
    const llvm::BlockFrequencyInfoImplBase::
        BlockNode& Node) const

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:524

Parameters

const llvm::BlockFrequencyInfoImplBase::BlockNode& Node

virtual std::string getBlockName(
    const llvm::BlockFrequencyInfoImplBase::
        BlockNode& Node) const

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:516

Parameters

const llvm::BlockFrequencyInfoImplBase::BlockNode& Node

Optional<uint64_t> getBlockProfileCount(
    const llvm::Function& F,
    const llvm::BlockFrequencyInfoImplBase::
        BlockNode& Node,
    bool AllowSynthetic = false) const

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:525

Parameters

const llvm::Function& F
const llvm::BlockFrequencyInfoImplBase::BlockNode& Node
bool AllowSynthetic = false

uint64_t getEntryFreq() const

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:539

llvm::BlockFrequencyInfoImplBase::Scaled64
getFloatingBlockFreq(
    const llvm::BlockFrequencyInfoImplBase::
        BlockNode& Node) const

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:522

Parameters

const llvm::BlockFrequencyInfoImplBase::BlockNode& Node

std::string getLoopName(
    const llvm::BlockFrequencyInfoImplBase::
        LoopData& Loop) const

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:517

Parameters

const llvm::BlockFrequencyInfoImplBase::LoopData& Loop

Optional<uint64_t> getProfileCountFromFreq(
    const llvm::Function& F,
    uint64_t Freq,
    bool AllowSynthetic = false) const

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:528

Parameters

const llvm::Function& F
uint64_t Freq
bool AllowSynthetic = false

bool isIrrLoopHeader(
    const llvm::BlockFrequencyInfoImplBase::
        BlockNode& Node)

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:531

Parameters

const llvm::BlockFrequencyInfoImplBase::BlockNode& Node

void packageLoop(
    llvm::BlockFrequencyInfoImplBase::LoopData&
        Loop)

Description

Package up a loop.

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:502

Parameters

llvm::BlockFrequencyInfoImplBase::LoopData& Loop

virtual llvm::raw_ostream& print(
    llvm::raw_ostream& OS) const

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:519

Parameters

llvm::raw_ostream& OS

llvm::raw_ostream& printBlockFreq(
    llvm::raw_ostream& OS,
    const llvm::BlockFrequencyInfoImplBase::
        BlockNode& Node) const

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:535

Parameters

llvm::raw_ostream& OS
const llvm::BlockFrequencyInfoImplBase::BlockNode& Node

llvm::raw_ostream& printBlockFreq(
    llvm::raw_ostream& OS,
    const llvm::BlockFrequency& Freq) const

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:536

Parameters

llvm::raw_ostream& OS
const llvm::BlockFrequency& Freq

void setBlockFreq(
    const llvm::BlockFrequencyInfoImplBase::
        BlockNode& Node,
    uint64_t Freq)

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:533

Parameters

const llvm::BlockFrequencyInfoImplBase::BlockNode& Node
uint64_t Freq

void unwrapLoops()

Description

Unwrap loops.

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:505

void updateLoopWithIrreducible(
    llvm::BlockFrequencyInfoImplBase::LoopData&
        OuterLoop)

Description

Update a loop after packaging irreducible SCCs inside of it. Update \c OuterLoop. Before finding irreducible control flow, it was partway through \a computeMassInLoop(), so \a LoopData::Exits and \a LoopData::BackedgeMass need to be reset. Also, nodes that were packaged up need to be removed from \a OuterLoop::Nodes.

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:475

Parameters

llvm::BlockFrequencyInfoImplBase::LoopData& OuterLoop

virtual ~BlockFrequencyInfoImplBase()

Description

Virtual destructor. Need a virtual destructor to mask the compiler warning about getBlockName().

Declared at: llvm/include/llvm/Analysis/BlockFrequencyInfoImpl.h:437