[BPI] Ignore remainder while distributing the remaining probability from unreachanble
This is a follow up patch for https://reviews.llvm.org/rL300440
to address a comment.
To make implementation to be consistent with other cases we just
ignore the remainder after distribution of remaining probability between
reachable edges.
If we reduced the probability of some edges coming to unreachable
blocks we should distribute the remaining part across other edges
coming to reachable blocks to satisfy the condition that sum of all
probabilities should be equal to one. If this remaining part is not
divided by number of "reachable" edges then we get this remainder.
This remainder probability should be pretty small. Other cases just ignore
if the sum of probabilities is not equal to one so we do the same.
Reviewers: chandlerc, sanjoy, vsk, junbuml, reames
Reviewed By: reames
Subscribers: reames, llvmcommits
Differential Revision: https://reviews.llvm.org/D32124
gitsvnid: https://llvm.org/svn/llvmproject/llvm/trunk@302883 911773080d340410b5e696231b3b80d8
Serguei Katkov
3 years ago
300  300 
WeightSum += Weights[i];

301  301 
}

302  302 
}

 303 
assert(WeightSum <= UINT32_MAX &&

 304 
"Expected weights to scale down to 32 bits");

303  305 

304  306 
if (WeightSum == 0  ReachableIdxs.size() == 0) {

305  307 
for (unsigned i = 0, e = TI>getNumSuccessors(); i != e; ++i)


327  329 
// the difference between reachable blocks.

328  330 
if (ToDistribute > BranchProbability::getZero()) {

329  331 
BranchProbability PerEdge = ToDistribute / ReachableIdxs.size();

330  
for (auto i : ReachableIdxs) {⏎

 332 
for (auto i : ReachableIdxs)⏎

331  333 
BP[i] += PerEdge;

332  
ToDistribute = PerEdge;

333  
}

334  
// Tail goes to the first reachable edge.

335  
BP[ReachableIdxs[0]] += ToDistribute;

336  334 
}

337  335 
}

338  336 

339  337 
for (unsigned i = 0, e = TI>getNumSuccessors(); i != e; ++i)

340  338 
setEdgeProbability(BB, i, BP[i]);

341  

342  
assert(WeightSum <= UINT32_MAX &&

343  
"Expected weights to scale down to 32 bits");

344  339 

345  340 
return true;

346  341 
}

451  451 
i32 3, label %case_d

452  452 
i32 4, label %case_e ], !prof !8

453  453 
; CHECK: edge entry > case_a probability is 0x00000800 / 0x80000000 = 0.00%

454  
; CHECK: edge entry > case_b probability is 0x07fffe01 / 0x80000000 = 6.25%⏎

 454 
; CHECK: edge entry > case_b probability is 0x07fffdff / 0x80000000 = 6.25%⏎

455  455 
; CHECK: edge entry > case_c probability is 0x67fffdff / 0x80000000 = 81.25% [HOT edge]

456  456 
; CHECK: edge entry > case_d probability is 0x07fffdff / 0x80000000 = 6.25%

457  457 
; CHECK: edge entry > case_e probability is 0x07fffdff / 0x80000000 = 6.25%


494  494 
i32 4, label %case_e ], !prof !9

495  495 
; CHECK: edge entry > case_a probability is 0x00000400 / 0x80000000 = 0.00%

496  496 
; CHECK: edge entry > case_b probability is 0x00000400 / 0x80000000 = 0.00%

497  
; CHECK: edge entry > case_c probability is 0x6aaaa800 / 0x80000000 = 83.33% [HOT edge]⏎

 497 
; CHECK: edge entry > case_c probability is 0x6aaaa7ff / 0x80000000 = 83.33% [HOT edge]⏎

498  498 
; CHECK: edge entry > case_d probability is 0x0aaaa7ff / 0x80000000 = 8.33%

499  499 
; CHECK: edge entry > case_e probability is 0x0aaaa7ff / 0x80000000 = 8.33%

500  500 


534  534 
i32 4, label %case_e ], !prof !10

535  535 
; CHECK: edge entry > case_a probability is 0x00000000 / 0x80000000 = 0.00%

536  536 
; CHECK: edge entry > case_b probability is 0x00000400 / 0x80000000 = 0.00%

537  
; CHECK: edge entry > case_c probability is 0x6e08fa2e / 0x80000000 = 85.96% [HOT edge]⏎

 537 
; CHECK: edge entry > case_c probability is 0x6e08fa2d / 0x80000000 = 85.96% [HOT edge]⏎

538  538 
; CHECK: edge entry > case_d probability is 0x08fb80e9 / 0x80000000 = 7.02%

539  539 
; CHECK: edge entry > case_e probability is 0x08fb80e9 / 0x80000000 = 7.02%

540  540 
