X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FSupport%2FBlockFrequency.cpp;h=6f7e341904b90f85c33ce4c4141ffbae2d7b52c4;hb=e8757c5dbbb50a0ac106f01360c462a3217ef62f;hp=53bbd8ad12dd232970ce6316f6ea03e65da970c5;hpb=93702a3b0754052d926c75082abf7ca156b80c45;p=oota-llvm.git diff --git a/lib/Support/BlockFrequency.cpp b/lib/Support/BlockFrequency.cpp index 53bbd8ad12d..6f7e341904b 100644 --- a/lib/Support/BlockFrequency.cpp +++ b/lib/Support/BlockFrequency.cpp @@ -18,84 +18,8 @@ using namespace llvm; -namespace { - -/// mult96bit - Multiply FREQ by N and store result in W array. -void mult96bit(uint64_t freq, uint32_t N, uint64_t W[2]) { - uint64_t u0 = freq & UINT32_MAX; - uint64_t u1 = freq >> 32; - - // Represent 96-bit value as w[2]:w[1]:w[0]; - uint32_t w[3] = { 0, 0, 0 }; - - uint64_t t = u0 * N; - uint64_t k = t >> 32; - w[0] = t; - t = u1 * N + k; - w[1] = t; - w[2] = t >> 32; - - // W[1] - higher bits. - // W[0] - lower bits. - W[0] = w[0] + ((uint64_t) w[1] << 32); - W[1] = w[2]; -} - - -/// div96bit - Divide 96-bit value stored in W array by D. Return 64-bit frequency. -uint64_t div96bit(uint64_t W[2], uint32_t D) { - uint64_t y = W[0]; - uint64_t x = W[1]; - int i; - - for (i = 1; i <= 64 && x; ++i) { - uint32_t t = (int)x >> 31; - x = (x << 1) | (y >> 63); - y = y << 1; - if ((x | t) >= D) { - x -= D; - ++y; - } - } - - return y << (64 - i + 1); -} - -} - - BlockFrequency &BlockFrequency::operator*=(const BranchProbability &Prob) { - if (Frequency == 0) - return *this; - - uint32_t n = Prob.getNumerator(); - uint32_t d = Prob.getDenominator(); - - assert(n <= d && "Probability must be less or equal to 1."); - - // Calculate Frequency * n. - uint64_t mulLo = (Frequency & UINT32_MAX) * n; - uint64_t mulHi = (Frequency >> 32) * n; - uint64_t mulRes = (mulHi << 32) + mulLo; - - // If there was overflow use 96-bit operations. - if (mulHi > UINT32_MAX || mulRes < mulLo) { - // 96-bit value represented as W[1]:W[0]. - uint64_t W[2]; - - // Probability is less or equal to 1 which means that results must fit - // 64-bit. - mult96bit(Frequency, n, W); - Frequency = div96bit(W, d); - } else { - // Fast case. - Frequency = mulRes / d; - } - - // Limit the result to 1; 0 is a sentinel value. This keeps BlockFrequencyInfo - // from getting stuck at zero frequencies just because a value became too - // small to be represented as a BlockFrequency. - Frequency = (n == 0 || Frequency != 0) ? Frequency : 1; + Frequency = Prob.scale(Frequency); return *this; } @@ -106,6 +30,17 @@ BlockFrequency::operator*(const BranchProbability &Prob) const { return Freq; } +BlockFrequency &BlockFrequency::operator/=(const BranchProbability &Prob) { + Frequency = Prob.scaleByInverse(Frequency); + return *this; +} + +BlockFrequency BlockFrequency::operator/(const BranchProbability &Prob) const { + BlockFrequency Freq(Frequency); + Freq /= Prob; + return Freq; +} + BlockFrequency &BlockFrequency::operator+=(const BlockFrequency &Freq) { uint64_t Before = Freq.Frequency; Frequency += Freq.Frequency; @@ -124,15 +59,14 @@ BlockFrequency::operator+(const BlockFrequency &Prob) const { return Freq; } -void BlockFrequency::print(raw_ostream &OS) const { - OS << Frequency; -} +BlockFrequency &BlockFrequency::operator>>=(const unsigned count) { + // Frequency can never be 0 by design. + assert(Frequency != 0); -namespace llvm { - -raw_ostream &operator<<(raw_ostream &OS, const BlockFrequency &Freq) { - Freq.print(OS); - return OS; -} + // Shift right by count. + Frequency >>= count; + // Saturate to 1 if we are 0. + Frequency |= Frequency == 0; + return *this; }