Skip to content

Commit a94c0a6

Browse files
Set jump kind and target during block creation
1 parent 82e6c60 commit a94c0a6

24 files changed

+451
-390
lines changed

src/coreclr/jit/block.cpp

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1421,7 +1421,7 @@ bool BasicBlock::endsWithTailCallConvertibleToLoop(Compiler* comp, GenTree** tai
14211421
* Allocate a basic block but don't append it to the current BB list.
14221422
*/
14231423

1424-
BasicBlock* Compiler::bbNewBasicBlock(BBjumpKinds jumpKind)
1424+
BasicBlock* Compiler::bbNewBasicBlock()
14251425
{
14261426
BasicBlock* block;
14271427

@@ -1472,15 +1472,6 @@ BasicBlock* Compiler::bbNewBasicBlock(BBjumpKinds jumpKind)
14721472

14731473
block->bbEntryState = nullptr;
14741474

1475-
/* Record the jump kind in the block */
1476-
1477-
block->SetJumpKind(jumpKind DEBUG_ARG(this));
1478-
1479-
if (jumpKind == BBJ_THROW)
1480-
{
1481-
block->bbSetRunRarely();
1482-
}
1483-
14841475
#ifdef DEBUG
14851476
if (verbose)
14861477
{
@@ -1531,6 +1522,33 @@ BasicBlock* Compiler::bbNewBasicBlock(BBjumpKinds jumpKind)
15311522
return block;
15321523
}
15331524

1525+
BasicBlock* Compiler::bbNewBasicBlock(BBjumpKinds jumpKind, BasicBlock* jumpDest /* = nullptr */)
1526+
{
1527+
BasicBlock* block = bbNewBasicBlock();
1528+
block->SetJumpKindAndTarget(jumpKind, jumpDest DEBUG_ARG(this));
1529+
1530+
if (jumpKind == BBJ_THROW)
1531+
{
1532+
block->bbSetRunRarely();
1533+
}
1534+
1535+
return block;
1536+
}
1537+
1538+
BasicBlock* Compiler::bbNewBasicBlock(BBswtDesc* jumpSwt)
1539+
{
1540+
BasicBlock* block = bbNewBasicBlock();
1541+
block->SetSwitchKindAndTarget(jumpSwt);
1542+
return block;
1543+
}
1544+
1545+
BasicBlock* Compiler::bbNewBasicBlock(BBjumpKinds jumpKind, unsigned jumpOffs)
1546+
{
1547+
BasicBlock* block = bbNewBasicBlock();
1548+
block->SetJumpKindAndTarget(jumpKind, jumpOffs);
1549+
return block;
1550+
}
1551+
15341552
//------------------------------------------------------------------------
15351553
// isBBCallAlwaysPair: Determine if this is the first block of a BBJ_CALLFINALLY/BBJ_ALWAYS pair
15361554
//

src/coreclr/jit/block.h

Lines changed: 55 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -543,15 +543,13 @@ struct BasicBlock : private LIR::Range
543543
return bbJumpKind;
544544
}
545545

546-
void SetJumpKind(BBjumpKinds jumpKind DEBUG_ARG(Compiler* compiler))
546+
void ChangeJumpKind(BBjumpKinds jumpKind)
547547
{
548-
#ifdef DEBUG
549-
// BBJ_NONE should only be assigned when optimizing jumps in Compiler::optOptimizeLayout
550-
// TODO: Change assert to check if compiler is in appropriate optimization phase to use BBJ_NONE
551-
// (right now, this assertion does the null check to avoid unused variable warnings)
552-
assert((jumpKind != BBJ_NONE) || (compiler != nullptr));
553-
#endif // DEBUG
548+
// If this block's jump kind requires a target, ensure it is already set
549+
assert(HasJump() || !KindIs(BBJ_ALWAYS, BBJ_CALLFINALLY, BBJ_COND, BBJ_EHCATCHRET, BBJ_LEAVE));
554550
bbJumpKind = jumpKind;
551+
// If new jump kind requires a target, ensure a target is already set
552+
assert(HasJump() || !KindIs(BBJ_ALWAYS, BBJ_CALLFINALLY, BBJ_COND, BBJ_EHCATCHRET, BBJ_LEAVE));
555553
}
556554

557555
BasicBlock* Prev() const
@@ -611,54 +609,83 @@ struct BasicBlock : private LIR::Range
611609
return bbJumpOffs;
612610
}
613611

614-
void SetJumpOffs(unsigned jumpOffs)
612+
void SetJumpKindAndTarget(BBjumpKinds jumpKind, unsigned jumpOffs)
615613
{
614+
bbJumpKind = jumpKind;
616615
bbJumpOffs = jumpOffs;
616+
assert(KindIs(BBJ_ALWAYS, BBJ_COND, BBJ_LEAVE));
617617
}
618618

619619
BasicBlock* GetJumpDest() const
620620
{
621+
// If bbJumpKind indicates this block has a jump, bbJumpDest cannot be null
622+
assert(HasJump() || !KindIs(BBJ_ALWAYS, BBJ_CALLFINALLY, BBJ_COND, BBJ_EHCATCHRET, BBJ_LEAVE));
621623
return bbJumpDest;
622624
}
623625

624626
void SetJumpDest(BasicBlock* jumpDest)
625627
{
628+
// If bbJumpKind indicates this block has a jump,
629+
// bbJumpDest should have previously been set in SetJumpKindAndTarget().
630+
assert(HasJump() || !KindIs(BBJ_ALWAYS, BBJ_CALLFINALLY, BBJ_COND, BBJ_EHCATCHRET, BBJ_LEAVE));
631+
632+
// SetJumpKindAndTarget() nulls jumpDest for non-jump kinds,
633+
// so don't use SetJumpDest() to null bbJumpDest without updating bbJumpKind.
626634
bbJumpDest = jumpDest;
635+
assert(HasJump());
627636
}
628637

629-
void SetJumpKindAndTarget(BBjumpKinds jumpKind, BasicBlock* jumpDest)
638+
void SetJumpKindAndTarget(BBjumpKinds jumpKind, BasicBlock* jumpDest DEBUG_ARG(Compiler* compiler))
630639
{
631-
assert(jumpDest != nullptr);
640+
#ifdef DEBUG
641+
// BBJ_NONE should only be assigned when optimizing jumps in Compiler::optOptimizeLayout
642+
// TODO: Change assert to check if compiler is in appropriate optimization phase to use BBJ_NONE
643+
//
644+
// (right now, this assertion does the null check to avoid unused variable warnings)
645+
assert((jumpKind != BBJ_NONE) || (compiler != nullptr));
646+
#endif // DEBUG
647+
632648
bbJumpKind = jumpKind;
633649
bbJumpDest = jumpDest;
634-
assert(KindIs(BBJ_ALWAYS, BBJ_CALLFINALLY, BBJ_COND, BBJ_EHCATCHRET, BBJ_LEAVE));
650+
651+
// If bbJumpKind indicates this block has a jump, bbJumpDest cannot be null
652+
assert(HasJump() || !KindIs(BBJ_ALWAYS, BBJ_CALLFINALLY, BBJ_COND, BBJ_EHCATCHRET, BBJ_LEAVE));
653+
}
654+
655+
void SetJumpKindAndTarget(BBjumpKinds jumpKind DEBUG_ARG(Compiler* compiler))
656+
{
657+
SetJumpKindAndTarget(jumpKind, nullptr DEBUG_ARG(compiler));
658+
}
659+
660+
bool HasJump() const
661+
{
662+
return (bbJumpDest != nullptr);
635663
}
636664

637665
bool HasJumpTo(const BasicBlock* jumpDest) const
638666
{
667+
assert(HasJump());
668+
assert(!KindIs(BBJ_SWITCH, BBJ_EHFINALLYRET));
639669
return (bbJumpDest == jumpDest);
640670
}
641671

642672
bool JumpsToNext() const
643673
{
674+
assert(HasJump());
644675
return (bbJumpDest == bbNext);
645676
}
646677

647678
BBswtDesc* GetJumpSwt() const
648679
{
680+
assert(KindIs(BBJ_SWITCH));
681+
assert(bbJumpSwt != nullptr);
649682
return bbJumpSwt;
650683
}
651684

652-
void SetJumpSwt(BBswtDesc* jumpSwt)
653-
{
654-
bbJumpSwt = jumpSwt;
655-
}
656-
657-
void SetJumpKindAndTarget(BBjumpKinds jumpKind, BBswtDesc* jumpSwt)
685+
void SetSwitchKindAndTarget(BBswtDesc* jumpSwt)
658686
{
659-
assert(jumpKind == BBJ_SWITCH);
660687
assert(jumpSwt != nullptr);
661-
bbJumpKind = jumpKind;
688+
bbJumpKind = BBJ_SWITCH;
662689
bbJumpSwt = jumpSwt;
663690
}
664691

@@ -1747,7 +1774,7 @@ inline BBArrayIterator BBEhfSuccList::end() const
17471774
inline BasicBlock::BBSuccList::BBSuccList(const BasicBlock* block)
17481775
{
17491776
assert(block != nullptr);
1750-
switch (block->GetJumpKind())
1777+
switch (block->bbJumpKind)
17511778
{
17521779
case BBJ_THROW:
17531780
case BBJ_RETURN:
@@ -1763,19 +1790,19 @@ inline BasicBlock::BBSuccList::BBSuccList(const BasicBlock* block)
17631790
case BBJ_ALWAYS:
17641791
case BBJ_EHCATCHRET:
17651792
case BBJ_LEAVE:
1766-
m_succs[0] = block->GetJumpDest();
1793+
m_succs[0] = block->bbJumpDest;
17671794
m_begin = &m_succs[0];
17681795
m_end = &m_succs[1];
17691796
break;
17701797

17711798
case BBJ_NONE:
1772-
m_succs[0] = block->Next();
1799+
m_succs[0] = block->bbNext;
17731800
m_begin = &m_succs[0];
17741801
m_end = &m_succs[1];
17751802
break;
17761803

17771804
case BBJ_COND:
1778-
m_succs[0] = block->Next();
1805+
m_succs[0] = block->bbNext;
17791806
m_begin = &m_succs[0];
17801807

17811808
// If both fall-through and branch successors are identical, then only include
@@ -1786,17 +1813,17 @@ inline BasicBlock::BBSuccList::BBSuccList(const BasicBlock* block)
17861813
}
17871814
else
17881815
{
1789-
m_succs[1] = block->GetJumpDest();
1816+
m_succs[1] = block->bbJumpDest;
17901817
m_end = &m_succs[2];
17911818
}
17921819
break;
17931820

17941821
case BBJ_SWITCH:
17951822
// We don't use the m_succs in-line data for switches; use the existing jump table in the block.
1796-
assert(block->GetJumpSwt() != nullptr);
1797-
assert(block->GetJumpSwt()->bbsDstTab != nullptr);
1798-
m_begin = block->GetJumpSwt()->bbsDstTab;
1799-
m_end = block->GetJumpSwt()->bbsDstTab + block->GetJumpSwt()->bbsCount;
1823+
assert(block->bbJumpSwt != nullptr);
1824+
assert(block->bbJumpSwt->bbsDstTab != nullptr);
1825+
m_begin = block->bbJumpSwt->bbsDstTab;
1826+
m_end = block->bbJumpSwt->bbsDstTab + block->bbJumpSwt->bbsCount;
18001827
break;
18011828

18021829
default:

src/coreclr/jit/codegenarm.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ BasicBlock* CodeGen::genCallFinally(BasicBlock* block)
125125

126126
assert(!block->IsLast());
127127
assert(block->Next()->KindIs(BBJ_ALWAYS));
128-
assert(!block->Next()->HasJumpTo(nullptr));
128+
assert(block->Next()->HasJump());
129129
assert(block->Next()->GetJumpDest()->bbFlags & BBF_FINALLY_TARGET);
130130

131131
bbFinallyRet = block->Next()->GetJumpDest();

src/coreclr/jit/codegencommon.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -856,7 +856,8 @@ BasicBlock* CodeGen::genCreateTempLabel()
856856
compiler->fgSafeBasicBlockCreation = true;
857857
#endif
858858

859-
BasicBlock* block = compiler->bbNewBasicBlock(BBJ_NONE);
859+
// Label doesn't need a jump kind
860+
BasicBlock* block = compiler->bbNewBasicBlock();
860861

861862
#ifdef DEBUG
862863
compiler->fgSafeBasicBlockCreation = false;

src/coreclr/jit/compiler.h

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3218,7 +3218,10 @@ class Compiler
32183218
bool fgSafeBasicBlockCreation;
32193219
#endif
32203220

3221-
BasicBlock* bbNewBasicBlock(BBjumpKinds jumpKind);
3221+
BasicBlock* bbNewBasicBlock();
3222+
BasicBlock* bbNewBasicBlock(BBjumpKinds jumpKind, BasicBlock* jumpDest = nullptr);
3223+
BasicBlock* bbNewBasicBlock(BBswtDesc* jumpSwt);
3224+
BasicBlock* bbNewBasicBlock(BBjumpKinds jumpKind, unsigned jumpOffs);
32223225

32233226
/*
32243227
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
@@ -4579,39 +4582,41 @@ class Compiler
45794582
}
45804583
}
45814584

4582-
BasicBlock* fgNewBasicBlock(BBjumpKinds jumpKind);
45834585
bool fgEnsureFirstBBisScratch();
45844586
bool fgFirstBBisScratch();
45854587
bool fgBBisScratch(BasicBlock* block);
45864588

45874589
void fgExtendEHRegionBefore(BasicBlock* block);
45884590
void fgExtendEHRegionAfter(BasicBlock* block);
45894591

4590-
BasicBlock* fgNewBBbefore(BBjumpKinds jumpKind, BasicBlock* block, bool extendRegion);
4592+
BasicBlock* fgNewBBbefore(BBjumpKinds jumpKind, BasicBlock* block, bool extendRegion, BasicBlock* jumpDest = nullptr);
45914593

4592-
BasicBlock* fgNewBBafter(BBjumpKinds jumpKind, BasicBlock* block, bool extendRegion);
4594+
BasicBlock* fgNewBBafter(BBjumpKinds jumpKind, BasicBlock* block, bool extendRegion, BasicBlock* jumpDest = nullptr);
45934595

4594-
BasicBlock* fgNewBBFromTreeAfter(BBjumpKinds jumpKind, BasicBlock* block, GenTree* tree, DebugInfo& debugInfo, bool updateSideEffects = false);
4596+
BasicBlock* fgNewBBFromTreeAfter(BBjumpKinds jumpKind, BasicBlock* block, GenTree* tree, DebugInfo& debugInfo, BasicBlock* jumpDest = nullptr, bool updateSideEffects = false);
45954597

45964598
BasicBlock* fgNewBBinRegion(BBjumpKinds jumpKind,
45974599
unsigned tryIndex,
45984600
unsigned hndIndex,
45994601
BasicBlock* nearBlk,
4602+
BasicBlock* jumpDest = nullptr,
46004603
bool putInFilter = false,
46014604
bool runRarely = false,
46024605
bool insertAtEnd = false);
46034606

46044607
BasicBlock* fgNewBBinRegion(BBjumpKinds jumpKind,
46054608
BasicBlock* srcBlk,
4609+
BasicBlock* jumpDest = nullptr,
46064610
bool runRarely = false,
46074611
bool insertAtEnd = false);
46084612

4609-
BasicBlock* fgNewBBinRegion(BBjumpKinds jumpKind);
4613+
BasicBlock* fgNewBBinRegion(BBjumpKinds jumpKind, BasicBlock* jumpDest = nullptr);
46104614

46114615
BasicBlock* fgNewBBinRegionWorker(BBjumpKinds jumpKind,
46124616
BasicBlock* afterBlk,
46134617
unsigned xcptnIndex,
4614-
bool putInTryRegion);
4618+
bool putInTryRegion,
4619+
BasicBlock* jumpDest = nullptr);
46154620

46164621
void fgInsertBBbefore(BasicBlock* insertBeforeBlk, BasicBlock* newBlk);
46174622
void fgInsertBBafter(BasicBlock* insertAfterBlk, BasicBlock* newBlk);

0 commit comments

Comments
 (0)