X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FSupport%2FBranchProbability.h;h=eedf69247ef5d6fbd5ce7705ff944cea6006cca2;hb=b09c146b116359616f6cbd4c8b3328607e00ff42;hp=c66d2248866cba31725866709ea9076d147808b9;hpb=44eb49c2a191108df801977c8e3dc03466c6c02a;p=oota-llvm.git diff --git a/include/llvm/Support/BranchProbability.h b/include/llvm/Support/BranchProbability.h index c66d2248866..eedf69247ef 100644 --- a/include/llvm/Support/BranchProbability.h +++ b/include/llvm/Support/BranchProbability.h @@ -1,4 +1,4 @@ -//===- BranchProbability.h - Branch Probability Analysis --------*- C++ -*-===// +//===- BranchProbability.h - Branch Probability Wrapper ---------*- C++ -*-===// // // The LLVM Compiler Infrastructure // @@ -15,40 +15,59 @@ #define LLVM_SUPPORT_BRANCHPROBABILITY_H #include "llvm/Support/DataTypes.h" +#include namespace llvm { -template -class BlockFrequencyImpl; -class BranchProbabilityInfo; -class MachineBranchProbabilityInfo; -class MachineBasicBlock; class raw_ostream; // This class represents Branch Probability as a non-negative fraction. class BranchProbability { - template - friend class BlockFrequencyImpl; - friend class BranchProbabilityInfo; - friend class MachineBranchProbabilityInfo; - friend class MachineBasicBlock; - // Numerator uint32_t N; // Denominator uint32_t D; - BranchProbability(uint32_t n, uint32_t d); - public: + BranchProbability(uint32_t n, uint32_t d) : N(n), D(d) { + assert(d > 0 && "Denomiator cannot be 0!"); + assert(n <= d && "Probability cannot be bigger than 1!"); + } + + static BranchProbability getZero() { return BranchProbability(0, 1); } + static BranchProbability getOne() { return BranchProbability(1, 1); } uint32_t getNumerator() const { return N; } uint32_t getDenominator() const { return D; } - raw_ostream &print(raw_ostream &OS) const; + // Return (1 - Probability). + BranchProbability getCompl() const { + return BranchProbability(D - N, D); + } + + void print(raw_ostream &OS) const; void dump() const; + + bool operator==(BranchProbability RHS) const { + return (uint64_t)N * RHS.D == (uint64_t)D * RHS.N; + } + bool operator!=(BranchProbability RHS) const { + return !(*this == RHS); + } + bool operator<(BranchProbability RHS) const { + return (uint64_t)N * RHS.D < (uint64_t)D * RHS.N; + } + bool operator>(BranchProbability RHS) const { + return RHS < *this; + } + bool operator<=(BranchProbability RHS) const { + return (uint64_t)N * RHS.D <= (uint64_t)D * RHS.N; + } + bool operator>=(BranchProbability RHS) const { + return RHS <= *this; + } }; raw_ostream &operator<<(raw_ostream &OS, const BranchProbability &Prob);