MachineBranchProbabilityInfo.h 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #pragma once
  2. #ifdef __GNUC__
  3. #pragma GCC diagnostic push
  4. #pragma GCC diagnostic ignored "-Wunused-parameter"
  5. #endif
  6. //=- MachineBranchProbabilityInfo.h - Branch Probability Analysis -*- C++ -*-=//
  7. //
  8. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  9. // See https://llvm.org/LICENSE.txt for license information.
  10. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  11. //
  12. //===----------------------------------------------------------------------===//
  13. //
  14. // This pass is used to evaluate branch probabilties on machine basic blocks.
  15. //
  16. //===----------------------------------------------------------------------===//
  17. #ifndef LLVM_CODEGEN_MACHINEBRANCHPROBABILITYINFO_H
  18. #define LLVM_CODEGEN_MACHINEBRANCHPROBABILITYINFO_H
  19. #include "llvm/CodeGen/MachineBasicBlock.h"
  20. #include "llvm/Pass.h"
  21. #include "llvm/Support/BranchProbability.h"
  22. #include <climits>
  23. #include <numeric>
  24. namespace llvm {
  25. class MachineBranchProbabilityInfo : public ImmutablePass {
  26. virtual void anchor();
  27. // Default weight value. Used when we don't have information about the edge.
  28. // TODO: DEFAULT_WEIGHT makes sense during static predication, when none of
  29. // the successors have a weight yet. But it doesn't make sense when providing
  30. // weight to an edge that may have siblings with non-zero weights. This can
  31. // be handled various ways, but it's probably fine for an edge with unknown
  32. // weight to just "inherit" the non-zero weight of an adjacent successor.
  33. static const uint32_t DEFAULT_WEIGHT = 16;
  34. public:
  35. static char ID;
  36. MachineBranchProbabilityInfo();
  37. void getAnalysisUsage(AnalysisUsage &AU) const override {
  38. AU.setPreservesAll();
  39. }
  40. // Return edge probability.
  41. BranchProbability getEdgeProbability(const MachineBasicBlock *Src,
  42. const MachineBasicBlock *Dst) const;
  43. // Same as above, but using a const_succ_iterator from Src. This is faster
  44. // when the iterator is already available.
  45. BranchProbability
  46. getEdgeProbability(const MachineBasicBlock *Src,
  47. MachineBasicBlock::const_succ_iterator Dst) const;
  48. // A 'Hot' edge is an edge which probability is >= 80%.
  49. bool isEdgeHot(const MachineBasicBlock *Src,
  50. const MachineBasicBlock *Dst) const;
  51. // Print value between 0 (0% probability) and 1 (100% probability),
  52. // however the value is never equal to 0, and can be 1 only iff SRC block
  53. // has only one successor.
  54. raw_ostream &printEdgeProbability(raw_ostream &OS,
  55. const MachineBasicBlock *Src,
  56. const MachineBasicBlock *Dst) const;
  57. };
  58. }
  59. #endif
  60. #ifdef __GNUC__
  61. #pragma GCC diagnostic pop
  62. #endif