namespace llvm {
class BranchProbabilityInfo;
-template <class BlockT, class FunctionT, class BranchProbInfoT>
-class BlockFrequencyInfoImpl;
+template <class BlockT> class BlockFrequencyInfoImpl;
/// BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to
/// estimate IR basic block frequencies.
class BlockFrequencyInfo : public FunctionPass {
- typedef BlockFrequencyInfoImpl<BasicBlock, Function, BranchProbabilityInfo>
- ImplType;
+ typedef BlockFrequencyInfoImpl<BasicBlock> ImplType;
std::unique_ptr<ImplType> BFI;
public:
namespace llvm {
+class BranchProbabilityInfo;
class BlockFrequencyInfo;
+class MachineBranchProbabilityInfo;
class MachineBlockFrequencyInfo;
+namespace bfi_detail {
+template <class BlockT> struct TypeMap {};
+template <> struct TypeMap<BasicBlock> {
+ typedef BasicBlock BlockT;
+ typedef Function FunctionT;
+ typedef BranchProbabilityInfo BlockProbInfoT;
+};
+template <> struct TypeMap<MachineBasicBlock> {
+ typedef MachineBasicBlock BlockT;
+ typedef MachineFunction FunctionT;
+ typedef MachineBranchProbabilityInfo BlockProbInfoT;
+};
+}
+
/// BlockFrequencyInfoImpl implements block frequency algorithm for IR and
/// Machine Instructions. Algorithm starts with value ENTRY_FREQ
/// for the entry block and then propagates frequencies using branch weights
/// from (Machine)BranchProbabilityInfo. LoopInfo is not required because
/// algorithm can find "backedges" by itself.
-template<class BlockT, class FunctionT, class BlockProbInfoT>
+template <class BT>
class BlockFrequencyInfoImpl {
+ typedef typename bfi_detail::TypeMap<BT>::BlockT BlockT;
+ typedef typename bfi_detail::TypeMap<BT>::FunctionT FunctionT;
+ typedef typename bfi_detail::TypeMap<BT>::BlockProbInfoT BlockProbInfoT;
DenseMap<const BlockT *, BlockFrequency> Freqs;
class MachineBasicBlock;
class MachineBranchProbabilityInfo;
-template <class BlockT, class FunctionT, class BranchProbInfoT>
-class BlockFrequencyInfoImpl;
+template <class BlockT> class BlockFrequencyInfoImpl;
/// MachineBlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation
/// to estimate machine basic block frequencies.
class MachineBlockFrequencyInfo : public MachineFunctionPass {
- typedef BlockFrequencyInfoImpl<MachineBasicBlock, MachineFunction,
- MachineBranchProbabilityInfo> ImplType;
+ typedef BlockFrequencyInfoImpl<MachineBasicBlock> ImplType;
std::unique_ptr<ImplType> MBFI;
public: