X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FSupport%2FBlockFrequency.h;h=666b3c822dbcd215fe77193b8e56a280c53f2c65;hb=e85959cb2cb6f82959b3cf1a9ef59c6d793a2556;hp=b133c961f632b3b5153156cffde8dc4903758bef;hpb=a26ec886a3a4d9d317262861d7a3de4f64bad71c;p=oota-llvm.git diff --git a/include/llvm/Support/BlockFrequency.h b/include/llvm/Support/BlockFrequency.h index b133c961f63..666b3c822db 100644 --- a/include/llvm/Support/BlockFrequency.h +++ b/include/llvm/Support/BlockFrequency.h @@ -14,6 +14,8 @@ #ifndef LLVM_SUPPORT_BLOCKFREQUENCY_H #define LLVM_SUPPORT_BLOCKFREQUENCY_H +#include "llvm/Support/DataTypes.h" + namespace llvm { class raw_ostream; @@ -23,18 +25,35 @@ class BranchProbability; class BlockFrequency { uint64_t Frequency; + static const int64_t ENTRY_FREQ = 1 << 14; - static void mult96bit(uint64_t freq, uint32_t N, uint64_t W[2]); - static uint64_t div96bit(uint64_t W[2], uint32_t D); + // Scale frequency by N/D, saturating on overflow. + void scale(uint32_t N, uint32_t D); public: BlockFrequency(uint64_t Freq = 0) : Frequency(Freq) { } + /// \brief Returns the frequency of the entry block of the function. + static uint64_t getEntryFrequency() { return ENTRY_FREQ; } + + /// \brief Returns the maximum possible frequency, the saturation value. + static uint64_t getMaxFrequency() { return -1ULL; } + + /// \brief Returns the frequency as a fixpoint number scaled by the entry + /// frequency. uint64_t getFrequency() const { return Frequency; } + /// \brief Multiplies with a branch probability. The computation will never + /// overflow. BlockFrequency &operator*=(const BranchProbability &Prob); const BlockFrequency operator*(const BranchProbability &Prob) const; + /// \brief Divide by a non-zero branch probability using saturating + /// arithmetic. + BlockFrequency &operator/=(const BranchProbability &Prob); + BlockFrequency operator/(const BranchProbability &Prob) const; + + /// \brief Adds another block frequency using saturating arithmetic. BlockFrequency &operator+=(const BlockFrequency &Freq); const BlockFrequency operator+(const BlockFrequency &Freq) const;