if (BB->succ_size() == 2) {
const MachineBasicBlock *Succ1 = *BB->succ_begin();
const MachineBasicBlock *Succ2 = *(BB->succ_begin() + 1);
- if (Succ1->isSuccessor(Succ2) || Succ2->isSuccessor(Succ1))
- return BranchProbability(
- 200 - 2 * ProfileLikelyProb, 200 - ProfileLikelyProb);
+ if (Succ1->isSuccessor(Succ2) || Succ2->isSuccessor(Succ1)) {
+ /* See case 1 below for the cost analysis. For BB->Succ to
+ * be taken with smaller cost, the following needs to hold:
+ * Prob(BB->Succ) > 2* Prob(BB->Pred)
+ * So the threshold T
+ * T = 2 * (1-Prob(BB->Pred). Since T + Prob(BB->Pred) == 1,
+ * We have T + T/2 = 1, i.e. T = 2/3. Also adding user specified
+ * branch bias, we have
+ * T = (2/3)*(ProfileLikelyProb/50)
+ * = (2*ProfileLikelyProb)/150)
+ */
+ return BranchProbability(2 * ProfileLikelyProb, 150);
+ }
}
return BranchProbability(ProfileLikelyProb, 100);
}
INITIALIZE_PASS_END(MachineBranchProbabilityInfo, "machine-branch-prob",
"Machine Branch Probability Analysis", false, true)
-cl::opt<unsigned> StaticLikelyProb(
- "static-likely-prob",
- cl::desc("branch probability threshold to be considered very likely"),
- cl::init(80), cl::Hidden);
+cl::opt<unsigned>
+ StaticLikelyProb("static-likely-prob",
+ cl::desc("branch probability threshold in percentage"
+ "to be considered very likely"),
+ cl::init(80), cl::Hidden);
cl::opt<unsigned> ProfileLikelyProb(
"profile-likely-prob",
- cl::desc("branch probability threshold to be considered very likely "
- "when profile is available"),
+ cl::desc("branch probability threshold in percentage to be considered"
+ " very likely when profile is available"),
cl::init(51), cl::Hidden);
char MachineBranchProbabilityInfo::ID = 0;