@@ -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