Index: llvm/trunk/lib/Transforms/Scalar/LowerExpectIntrinsic.cpp =================================================================== --- llvm/trunk/lib/Transforms/Scalar/LowerExpectIntrinsic.cpp +++ llvm/trunk/lib/Transforms/Scalar/LowerExpectIntrinsic.cpp @@ -34,12 +34,24 @@ STATISTIC(ExpectIntrinsicsHandled, "Number of 'expect' intrinsic instructions handled"); -static cl::opt -LikelyBranchWeight("likely-branch-weight", cl::Hidden, cl::init(64), - cl::desc("Weight of the branch likely to be taken (default = 64)")); -static cl::opt -UnlikelyBranchWeight("unlikely-branch-weight", cl::Hidden, cl::init(4), - cl::desc("Weight of the branch unlikely to be taken (default = 4)")); +// 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. + +static cl::opt LikelyBranchWeight( + "likely-branch-weight", cl::Hidden, cl::init(2000), + cl::desc("Weight of the branch likely to be taken (default = 2000)")); +static cl::opt UnlikelyBranchWeight( + "unlikely-branch-weight", cl::Hidden, cl::init(1), + cl::desc("Weight of the branch unlikely to be taken (default = 1)")); static bool handleSwitchExpect(SwitchInst &SI) { CallInst *CI = dyn_cast(SI.getCondition()); Index: llvm/trunk/test/Transforms/LowerExpectIntrinsic/basic.ll =================================================================== --- llvm/trunk/test/Transforms/LowerExpectIntrinsic/basic.ll +++ llvm/trunk/test/Transforms/LowerExpectIntrinsic/basic.ll @@ -275,7 +275,7 @@ declare i1 @llvm.expect.i1(i1, i1) nounwind readnone -; CHECK: !0 = !{!"branch_weights", i32 64, i32 4} -; CHECK: !1 = !{!"branch_weights", i32 4, i32 64} -; CHECK: !2 = !{!"branch_weights", i32 4, i32 64, i32 4} -; CHECK: !3 = !{!"branch_weights", i32 64, i32 4, i32 4} +; CHECK: !0 = !{!"branch_weights", i32 2000, i32 1} +; CHECK: !1 = !{!"branch_weights", i32 1, i32 2000} +; CHECK: !2 = !{!"branch_weights", i32 1, i32 2000, i32 1} +; CHECK: !3 = !{!"branch_weights", i32 2000, i32 1, i32 1}