@@ -3584,6 +3584,8 @@ unsigned Compiler::acdHelper(SpecialCodeKind codeKind)
3584
3584
return CORINFO_HELP_THROWDIVZERO;
3585
3585
case SCK_ARITH_EXCPN:
3586
3586
return CORINFO_HELP_OVERFLOW;
3587
+ case SCK_FAIL_FAST:
3588
+ return CORINFO_HELP_FAIL_FAST;
3587
3589
default :
3588
3590
assert (!" Bad codeKind" );
3589
3591
return 0 ;
@@ -3608,8 +3610,10 @@ BasicBlock* Compiler::fgAddCodeRef(BasicBlock* srcBlk, unsigned refData, Special
3608
3610
// arg slots on the stack frame if there are no other calls.
3609
3611
compUsesThrowHelper = true ;
3610
3612
3611
- if (!fgUseThrowHelperBlocks ())
3613
+ if (!fgUseThrowHelperBlocks () && (kind != SCK_FAIL_FAST) )
3612
3614
{
3615
+ // We'll create a throw block in-place then (for better debugging)
3616
+ // It's not needed for fail fast, since it's not recoverable anyway.
3613
3617
return nullptr ;
3614
3618
}
3615
3619
@@ -3620,6 +3624,7 @@ BasicBlock* Compiler::fgAddCodeRef(BasicBlock* srcBlk, unsigned refData, Special
3620
3624
BBJ_THROW, // SCK_ARITH_EXCP, SCK_OVERFLOW
3621
3625
BBJ_THROW, // SCK_ARG_EXCPN
3622
3626
BBJ_THROW, // SCK_ARG_RNG_EXCPN
3627
+ BBJ_THROW, // SCK_FAIL_FAST
3623
3628
};
3624
3629
3625
3630
noway_assert (sizeof (jumpKinds) == SCK_COUNT); // sanity check
@@ -3695,6 +3700,9 @@ BasicBlock* Compiler::fgAddCodeRef(BasicBlock* srcBlk, unsigned refData, Special
3695
3700
case SCK_ARG_RNG_EXCPN:
3696
3701
msg = " for ARG_RNG_EXCPN" ;
3697
3702
break ;
3703
+ case SCK_FAIL_FAST:
3704
+ msg = " for FAIL_FAST" ;
3705
+ break ;
3698
3706
default :
3699
3707
msg = " for ??" ;
3700
3708
break ;
@@ -3712,8 +3720,7 @@ BasicBlock* Compiler::fgAddCodeRef(BasicBlock* srcBlk, unsigned refData, Special
3712
3720
3713
3721
/* Remember that we're adding a new basic block */
3714
3722
3715
- fgAddCodeModf = true ;
3716
- fgRngChkThrowAdded = true ;
3723
+ fgAddCodeModf = true ;
3717
3724
3718
3725
/* Now figure out what code to insert */
3719
3726
@@ -3743,6 +3750,10 @@ BasicBlock* Compiler::fgAddCodeRef(BasicBlock* srcBlk, unsigned refData, Special
3743
3750
helper = CORINFO_HELP_THROW_ARGUMENTOUTOFRANGEEXCEPTION;
3744
3751
break ;
3745
3752
3753
+ case SCK_FAIL_FAST:
3754
+ helper = CORINFO_HELP_FAIL_FAST;
3755
+ break ;
3756
+
3746
3757
default :
3747
3758
noway_assert (!" unexpected code addition kind" );
3748
3759
return nullptr ;
@@ -3759,7 +3770,6 @@ BasicBlock* Compiler::fgAddCodeRef(BasicBlock* srcBlk, unsigned refData, Special
3759
3770
tree = fgMorphArgs (tree);
3760
3771
3761
3772
// Store the tree in the new basic block.
3762
- assert (!srcBlk->isEmpty ());
3763
3773
if (!srcBlk->IsLIR ())
3764
3774
{
3765
3775
fgInsertStmtAtEnd (newBlk, fgNewStmtFromTree (tree));
@@ -3781,7 +3791,7 @@ BasicBlock* Compiler::fgAddCodeRef(BasicBlock* srcBlk, unsigned refData, Special
3781
3791
3782
3792
Compiler::AddCodeDsc* Compiler::fgFindExcptnTarget (SpecialCodeKind kind, unsigned refData)
3783
3793
{
3784
- assert (fgUseThrowHelperBlocks ());
3794
+ assert (fgUseThrowHelperBlocks () || (kind == SCK_FAIL_FAST) );
3785
3795
if (!(fgExcptnTargetCache[kind] && // Try the cached value first
3786
3796
fgExcptnTargetCache[kind]->acdData == refData))
3787
3797
{
0 commit comments