IndirectCallPromotionAnalysis.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. //===-- IndirectCallPromotionAnalysis.cpp - Find promotion candidates ===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. //
  9. // Helper methods for identifying profitable indirect call promotion
  10. // candidates for an instruction when the indirect-call value profile metadata
  11. // is available.
  12. //
  13. //===----------------------------------------------------------------------===//
  14. #include "llvm/Analysis/IndirectCallPromotionAnalysis.h"
  15. #include "llvm/IR/Instruction.h"
  16. #include "llvm/ProfileData/InstrProf.h"
  17. #include "llvm/Support/CommandLine.h"
  18. #include "llvm/Support/Debug.h"
  19. #include <memory>
  20. using namespace llvm;
  21. #define DEBUG_TYPE "pgo-icall-prom-analysis"
  22. // The percent threshold for the direct-call target (this call site vs the
  23. // remaining call count) for it to be considered as the promotion target.
  24. static cl::opt<unsigned> ICPRemainingPercentThreshold(
  25. "icp-remaining-percent-threshold", cl::init(30), cl::Hidden,
  26. cl::desc("The percentage threshold against remaining unpromoted indirect "
  27. "call count for the promotion"));
  28. // The percent threshold for the direct-call target (this call site vs the
  29. // total call count) for it to be considered as the promotion target.
  30. static cl::opt<unsigned>
  31. ICPTotalPercentThreshold("icp-total-percent-threshold", cl::init(5),
  32. cl::Hidden,
  33. cl::desc("The percentage threshold against total "
  34. "count for the promotion"));
  35. // Set the maximum number of targets to promote for a single indirect-call
  36. // callsite.
  37. static cl::opt<unsigned>
  38. MaxNumPromotions("icp-max-prom", cl::init(3), cl::Hidden,
  39. cl::desc("Max number of promotions for a single indirect "
  40. "call callsite"));
  41. ICallPromotionAnalysis::ICallPromotionAnalysis() {
  42. ValueDataArray = std::make_unique<InstrProfValueData[]>(MaxNumPromotions);
  43. }
  44. bool ICallPromotionAnalysis::isPromotionProfitable(uint64_t Count,
  45. uint64_t TotalCount,
  46. uint64_t RemainingCount) {
  47. return Count * 100 >= ICPRemainingPercentThreshold * RemainingCount &&
  48. Count * 100 >= ICPTotalPercentThreshold * TotalCount;
  49. }
  50. // Indirect-call promotion heuristic. The direct targets are sorted based on
  51. // the count. Stop at the first target that is not promoted. Returns the
  52. // number of candidates deemed profitable.
  53. uint32_t ICallPromotionAnalysis::getProfitablePromotionCandidates(
  54. const Instruction *Inst, uint32_t NumVals, uint64_t TotalCount) {
  55. ArrayRef<InstrProfValueData> ValueDataRef(ValueDataArray.get(), NumVals);
  56. LLVM_DEBUG(dbgs() << " \nWork on callsite " << *Inst
  57. << " Num_targets: " << NumVals << "\n");
  58. uint32_t I = 0;
  59. uint64_t RemainingCount = TotalCount;
  60. for (; I < MaxNumPromotions && I < NumVals; I++) {
  61. uint64_t Count = ValueDataRef[I].Count;
  62. assert(Count <= RemainingCount);
  63. LLVM_DEBUG(dbgs() << " Candidate " << I << " Count=" << Count
  64. << " Target_func: " << ValueDataRef[I].Value << "\n");
  65. if (!isPromotionProfitable(Count, TotalCount, RemainingCount)) {
  66. LLVM_DEBUG(dbgs() << " Not promote: Cold target.\n");
  67. return I;
  68. }
  69. RemainingCount -= Count;
  70. }
  71. return I;
  72. }
  73. ArrayRef<InstrProfValueData>
  74. ICallPromotionAnalysis::getPromotionCandidatesForInstruction(
  75. const Instruction *I, uint32_t &NumVals, uint64_t &TotalCount,
  76. uint32_t &NumCandidates) {
  77. bool Res =
  78. getValueProfDataFromInst(*I, IPVK_IndirectCallTarget, MaxNumPromotions,
  79. ValueDataArray.get(), NumVals, TotalCount);
  80. if (!Res) {
  81. NumCandidates = 0;
  82. return ArrayRef<InstrProfValueData>();
  83. }
  84. NumCandidates = getProfitablePromotionCandidates(I, NumVals, TotalCount);
  85. return ArrayRef<InstrProfValueData>(ValueDataArray.get(), NumVals);
  86. }