@@ -1282,10 +1282,12 @@ uint32_t SelectionDAGBuilder::getEdgeWeight(MachineBasicBlock *Src,
1282
1282
return BPI->getEdgeWeight (SrcBB, DstBB);
1283
1283
}
1284
1284
1285
- void SelectionDAGBuilder::addSuccessorWithWeight (MachineBasicBlock *Src,
1286
- MachineBasicBlock *Dst) {
1287
- uint32_t weight = getEdgeWeight (Src, Dst);
1288
- Src->addSuccessor (Dst, weight);
1285
+ void SelectionDAGBuilder::
1286
+ addSuccessorWithWeight (MachineBasicBlock *Src, MachineBasicBlock *Dst,
1287
+ uint32_t Weight /* = 0 */ ) {
1288
+ if (!Weight)
1289
+ Weight = getEdgeWeight (Src, Dst);
1290
+ Src->addSuccessor (Dst, Weight);
1289
1291
}
1290
1292
1291
1293
@@ -1558,8 +1560,8 @@ void SelectionDAGBuilder::visitSwitchCase(CaseBlock &CB,
1558
1560
}
1559
1561
1560
1562
// Update successor info
1561
- addSuccessorWithWeight (SwitchBB, CB.TrueBB );
1562
- addSuccessorWithWeight (SwitchBB, CB.FalseBB );
1563
+ addSuccessorWithWeight (SwitchBB, CB.TrueBB , CB. TrueWeight );
1564
+ addSuccessorWithWeight (SwitchBB, CB.FalseBB , CB. FalseWeight );
1563
1565
1564
1566
// Set NextBlock to be the MBB immediately after the current one, if any.
1565
1567
// This is used to avoid emitting unnecessary branches to the next block.
@@ -1910,8 +1912,8 @@ bool SelectionDAGBuilder::handleSmallSwitchRange(CaseRec& CR,
1910
1912
ISD::SETEQ);
1911
1913
1912
1914
// Update successor info.
1913
- SwitchBB-> addSuccessor ( Small.BB );
1914
- SwitchBB-> addSuccessor ( Default);
1915
+ addSuccessorWithWeight (SwitchBB, Small.BB );
1916
+ addSuccessorWithWeight (SwitchBB, Default);
1915
1917
1916
1918
// Insert the true branch.
1917
1919
SDValue BrCond = DAG.getNode (ISD::BRCOND, DL, MVT::Other,
@@ -1967,7 +1969,11 @@ bool SelectionDAGBuilder::handleSmallSwitchRange(CaseRec& CR,
1967
1969
CC = ISD::SETLE;
1968
1970
LHS = I->Low ; MHS = SV; RHS = I->High ;
1969
1971
}
1970
- CaseBlock CB (CC, LHS, RHS, MHS, I->BB , FallThrough, CurBlock);
1972
+
1973
+ uint32_t ExtraWeight = I->ExtraWeight ;
1974
+ CaseBlock CB (CC, LHS, RHS, MHS, /* truebb */ I->BB , /* falsebb */ FallThrough,
1975
+ /* me */ CurBlock,
1976
+ /* trueweight */ ExtraWeight / 2 , /* falseweight */ ExtraWeight / 2 );
1971
1977
1972
1978
// If emitting the first comparison, just call visitSwitchCase to emit the
1973
1979
// code into the current block. Otherwise, push the CaseBlock onto the
@@ -2362,12 +2368,17 @@ size_t SelectionDAGBuilder::Clusterify(CaseVector& Cases,
2362
2368
const SwitchInst& SI) {
2363
2369
size_t numCmps = 0 ;
2364
2370
2371
+ BranchProbabilityInfo *BPI = FuncInfo.BPI ;
2365
2372
// Start with "simple" cases
2366
2373
for (size_t i = 1 ; i < SI.getNumSuccessors (); ++i) {
2367
- MachineBasicBlock *SMBB = FuncInfo.MBBMap [SI.getSuccessor (i)];
2374
+ BasicBlock *SuccBB = SI.getSuccessor (i);
2375
+ MachineBasicBlock *SMBB = FuncInfo.MBBMap [SuccBB];
2376
+
2377
+ uint32_t ExtraWeight = BPI ? BPI->getEdgeWeight (SI.getParent (), SuccBB) : 0 ;
2378
+
2368
2379
Cases.push_back (Case (SI.getSuccessorValue (i),
2369
2380
SI.getSuccessorValue (i),
2370
- SMBB));
2381
+ SMBB, ExtraWeight ));
2371
2382
}
2372
2383
std::sort (Cases.begin (), Cases.end (), CaseCmp ());
2373
2384
@@ -2387,6 +2398,16 @@ size_t SelectionDAGBuilder::Clusterify(CaseVector& Cases,
2387
2398
if ((nextValue - currentValue == 1 ) && (currentBB == nextBB)) {
2388
2399
I->High = J->High ;
2389
2400
J = Cases.erase (J);
2401
+
2402
+ if (BranchProbabilityInfo *BPI = FuncInfo.BPI ) {
2403
+ uint32_t CurWeight = currentBB->getBasicBlock () ?
2404
+ BPI->getEdgeWeight (SI.getParent (), currentBB->getBasicBlock ()) : 16 ;
2405
+ uint32_t NextWeight = nextBB->getBasicBlock () ?
2406
+ BPI->getEdgeWeight (SI.getParent (), nextBB->getBasicBlock ()) : 16 ;
2407
+
2408
+ BPI->setEdgeWeight (SI.getParent (), currentBB->getBasicBlock (),
2409
+ CurWeight + NextWeight);
2410
+ }
2390
2411
} else {
2391
2412
I = J++;
2392
2413
}
0 commit comments