@@ -372,7 +372,6 @@ bool Compiler::fgExpandRuntimeLookupsForCall(BasicBlock** pBlock, Statement* stm
372372 // Update preds in all new blocks
373373 //
374374 assert (prevBb->KindIs (BBJ_ALWAYS));
375- fgRemoveRefPred (prevBb->GetTargetEdge ());
376375
377376 {
378377 FlowEdge* const newEdge = fgAddRefPred (block, fastPathBb);
@@ -389,8 +388,7 @@ bool Compiler::fgExpandRuntimeLookupsForCall(BasicBlock** pBlock, Statement* stm
389388 if (needsSizeCheck)
390389 {
391390 // sizeCheckBb is the first block after prevBb
392- FlowEdge* const newEdge = fgAddRefPred (sizeCheckBb, prevBb);
393- prevBb->SetTargetEdge (newEdge);
391+ fgRedirectTargetEdge (prevBb, sizeCheckBb);
394392
395393 // sizeCheckBb flows into nullcheckBb in case if the size check passes
396394 {
@@ -406,8 +404,7 @@ bool Compiler::fgExpandRuntimeLookupsForCall(BasicBlock** pBlock, Statement* stm
406404 else
407405 {
408406 // nullcheckBb is the first block after prevBb
409- FlowEdge* const newEdge = fgAddRefPred (nullcheckBb, prevBb);
410- prevBb->SetTargetEdge (newEdge);
407+ fgRedirectTargetEdge (prevBb, nullcheckBb);
411408
412409 // No size check, nullcheckBb jumps to fast path
413410 // fallbackBb is only reachable from nullcheckBb (jump destination)
@@ -742,9 +739,7 @@ bool Compiler::fgExpandThreadLocalAccessForCallNativeAOT(BasicBlock** pBlock, St
742739 // fallback will just execute first time
743740 fallbackBb->bbSetRunRarely ();
744741
745- fgRemoveRefPred (prevBb->GetTargetEdge ());
746- FlowEdge* const newEdge = fgAddRefPred (tlsRootNullCondBB, prevBb);
747- prevBb->SetTargetEdge (newEdge);
742+ fgRedirectTargetEdge (prevBb, tlsRootNullCondBB);
748743
749744 // All blocks are expected to be in the same EH region
750745 assert (BasicBlock::sameEHRegion (prevBb, block));
@@ -1089,12 +1084,7 @@ bool Compiler::fgExpandThreadLocalAccessForCall(BasicBlock** pBlock, Statement*
10891084 // Update preds in all new blocks
10901085 //
10911086 assert (prevBb->KindIs (BBJ_ALWAYS));
1092- fgRemoveRefPred (prevBb->GetTargetEdge ());
1093-
1094- {
1095- FlowEdge* const newEdge = fgAddRefPred (maxThreadStaticBlocksCondBB, prevBb);
1096- prevBb->SetTargetEdge (newEdge);
1097- }
1087+ fgRedirectTargetEdge (prevBb, maxThreadStaticBlocksCondBB);
10981088
10991089 {
11001090 FlowEdge* const trueEdge = fgAddRefPred (fallbackBb, maxThreadStaticBlocksCondBB);
@@ -1462,8 +1452,10 @@ bool Compiler::fgExpandStaticInitForCall(BasicBlock** pBlock, Statement* stmt, G
14621452 // Update preds in all new blocks
14631453 //
14641454
1465- // Unlink block and prevBb
1466- fgRemoveRefPred (prevBb->GetTargetEdge ());
1455+ // Redirect prevBb from block to isInitedBb
1456+ fgRedirectTargetEdge (prevBb, isInitedBb);
1457+ prevBb->SetFlags (BBF_NONE_QUIRK);
1458+ assert (prevBb->JumpsToNext ());
14671459
14681460 {
14691461 // Block has two preds now: either isInitedBb or helperCallBb
@@ -1473,15 +1465,6 @@ bool Compiler::fgExpandStaticInitForCall(BasicBlock** pBlock, Statement* stmt, G
14731465 helperCallBb->SetFlags (BBF_NONE_QUIRK);
14741466 }
14751467
1476- {
1477- // prevBb always flows into isInitedBb
1478- assert (prevBb->KindIs (BBJ_ALWAYS));
1479- FlowEdge* const newEdge = fgAddRefPred (isInitedBb, prevBb);
1480- prevBb->SetTargetEdge (newEdge);
1481- prevBb->SetFlags (BBF_NONE_QUIRK);
1482- assert (prevBb->JumpsToNext ());
1483- }
1484-
14851468 {
14861469 // Both fastPathBb and helperCallBb have a single common pred - isInitedBb
14871470 FlowEdge* const trueEdge = fgAddRefPred (block, isInitedBb);
@@ -1792,17 +1775,10 @@ bool Compiler::fgVNBasedIntrinsicExpansionForCall_ReadUtf8(BasicBlock** pBlock,
17921775 //
17931776 // Update preds in all new blocks
17941777 //
1795- // block is no longer a predecessor of prevBb
1796- fgRemoveRefPred (prevBb->GetTargetEdge ());
1797-
1798- {
1799- // prevBb flows into lengthCheckBb
1800- assert (prevBb->KindIs (BBJ_ALWAYS));
1801- FlowEdge* const newEdge = fgAddRefPred (lengthCheckBb, prevBb);
1802- prevBb->SetTargetEdge (newEdge);
1803- prevBb->SetFlags (BBF_NONE_QUIRK);
1804- assert (prevBb->JumpsToNext ());
1805- }
1778+ // Redirect prevBb to lengthCheckBb
1779+ fgRedirectTargetEdge (prevBb, lengthCheckBb);
1780+ prevBb->SetFlags (BBF_NONE_QUIRK);
1781+ assert (prevBb->JumpsToNext ());
18061782
18071783 {
18081784 // lengthCheckBb has two successors: block and fastpathBb
@@ -2511,12 +2487,7 @@ bool Compiler::fgLateCastExpansionForCall(BasicBlock** pBlock, Statement* stmt,
25112487 }
25122488 }
25132489
2514- fgRemoveRefPred (firstBb->GetTargetEdge ());
2515-
2516- {
2517- FlowEdge* const newEdge = fgAddRefPred (nullcheckBb, firstBb);
2518- firstBb->SetTargetEdge (newEdge);
2519- }
2490+ fgRedirectTargetEdge (firstBb, nullcheckBb);
25202491
25212492 {
25222493 FlowEdge* const trueEdge = fgAddRefPred (lastBb, nullcheckBb);
0 commit comments