Index: llvm/include/llvm/Support/BranchProbability.h =================================================================== --- llvm/include/llvm/Support/BranchProbability.h +++ llvm/include/llvm/Support/BranchProbability.h @@ -13,6 +13,7 @@ #ifndef LLVM_SUPPORT_BRANCHPROBABILITY_H #define LLVM_SUPPORT_BRANCHPROBABILITY_H +#include "llvm/Support/CommandLine.h" #include "llvm/Support/DataTypes.h" #include #include @@ -21,6 +22,9 @@ namespace llvm { +extern cl::opt LikelyBranchWeight; +extern cl::opt UnlikelyBranchWeight; + class raw_ostream; // This class represents Branch Probability as a non-negative fraction that is Index: llvm/include/llvm/Transforms/Scalar/LowerExpectIntrinsic.h =================================================================== --- llvm/include/llvm/Transforms/Scalar/LowerExpectIntrinsic.h +++ llvm/include/llvm/Transforms/Scalar/LowerExpectIntrinsic.h @@ -17,7 +17,6 @@ #include "llvm/IR/Function.h" #include "llvm/IR/PassManager.h" -#include "llvm/Support/CommandLine.h" namespace llvm { @@ -32,8 +31,6 @@ PreservedAnalyses run(Function &F, FunctionAnalysisManager &); }; -extern cl::opt LikelyBranchWeight; -extern cl::opt UnlikelyBranchWeight; } #endif Index: llvm/lib/Support/BranchProbability.cpp =================================================================== --- llvm/lib/Support/BranchProbability.cpp +++ llvm/lib/Support/BranchProbability.cpp @@ -19,6 +19,20 @@ using namespace llvm; +// These default values are chosen to represent an extremely skewed outcome for +// a condition, but they leave some room for interpretation by later passes. +// +// If the documentation for __builtin_expect() was made explicit that it should +// only be used in extreme cases, we could make this ratio higher. As it stands, +// programmers may be using __builtin_expect() / llvm.expect to annotate that a +// branch is only mildly likely or unlikely to be taken. +cl::opt llvm::LikelyBranchWeight( + "likely-branch-weight", cl::Hidden, cl::init(2000), + cl::desc("Weight of the branch likely to be taken (default = 2000)")); +cl::opt llvm::UnlikelyBranchWeight( + "unlikely-branch-weight", cl::Hidden, cl::init(1), + cl::desc("Weight of the branch unlikely to be taken (default = 1)")); + constexpr uint32_t BranchProbability::D; raw_ostream &BranchProbability::print(raw_ostream &OS) const { Index: llvm/lib/Transforms/Scalar/LowerExpectIntrinsic.cpp =================================================================== --- llvm/lib/Transforms/Scalar/LowerExpectIntrinsic.cpp +++ llvm/lib/Transforms/Scalar/LowerExpectIntrinsic.cpp @@ -24,6 +24,7 @@ #include "llvm/IR/Metadata.h" #include "llvm/InitializePasses.h" #include "llvm/Pass.h" +#include "llvm/Support/BranchProbability.h" #include "llvm/Support/Debug.h" #include "llvm/Transforms/Scalar.h" @@ -34,25 +35,6 @@ STATISTIC(ExpectIntrinsicsHandled, "Number of 'expect' intrinsic instructions handled"); -// These default values are chosen to represent an extremely skewed outcome for -// a condition, but they leave some room for interpretation by later passes. -// -// If the documentation for __builtin_expect() was made explicit that it should -// only be used in extreme cases, we could make this ratio higher. As it stands, -// programmers may be using __builtin_expect() / llvm.expect to annotate that a -// branch is likely or unlikely to be taken. -// -// There is a known dependency on this ratio in CodeGenPrepare when transforming -// 'select' instructions. It may be worthwhile to hoist these values to some -// shared space, so they can be used directly by other passes. - -cl::opt llvm::LikelyBranchWeight( - "likely-branch-weight", cl::Hidden, cl::init(2000), - cl::desc("Weight of the branch likely to be taken (default = 2000)")); -cl::opt llvm::UnlikelyBranchWeight( - "unlikely-branch-weight", cl::Hidden, cl::init(1), - cl::desc("Weight of the branch unlikely to be taken (default = 1)")); - static std::tuple getBranchWeight(Intrinsic::ID IntrinsicID, CallInst *CI, int BranchCount) { if (IntrinsicID == Intrinsic::expect) {