Skip to content

Commit 48d117e

Browse files
committed
Give loop's bailout info to bailout instructions in the loop landing pad
1 parent ff72e95 commit 48d117e

File tree

6 files changed

+54
-10
lines changed

6 files changed

+54
-10
lines changed

lib/Backend/GlobOpt.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,7 @@ GlobOpt::OptBlock(BasicBlock *block)
514514
if (instr->GetBailOutInfo() == oldBailOutInfo)
515515
{
516516
instr->PromoteAuxBailOut();
517-
FillBailOutInfo(block, instr->GetBailOutInfo());
517+
FillBailOutInfo(block, instr);
518518
}
519519
else
520520
{
@@ -2425,7 +2425,7 @@ GlobOpt::OptInstr(IR::Instr *&instr, bool* isInstrRemoved)
24252425
// Consider: Do we ever get post-op bailout here, and if so is the FillBailOutInfo call in the right place?
24262426
if (instr->HasBailOutInfo() && !this->IsLoopPrePass())
24272427
{
2428-
this->FillBailOutInfo(this->currentBlock, instr->GetBailOutInfo());
2428+
this->FillBailOutInfo(this->currentBlock, instr);
24292429
}
24302430

24312431
this->instrCountSinceLastCleanUp++;
@@ -2789,7 +2789,7 @@ GlobOpt::OptTagChecks(IR::Instr *instr)
27892789
bailOutInstr = IR::BailOutInstr::New(Js::OpCode::BailOnNotObject, IR::BailOutOnTaggedValue, instr, instr->m_func);
27902790
if (!this->IsLoopPrePass())
27912791
{
2792-
FillBailOutInfo(this->currentBlock, bailOutInstr->GetBailOutInfo());
2792+
FillBailOutInfo(this->currentBlock, bailOutInstr);
27932793
}
27942794
IR::RegOpnd *srcOpnd = regOpnd;
27952795
if (!srcOpnd)
@@ -11698,7 +11698,7 @@ GlobOpt::ToTypeSpecUse(IR::Instr *instr, IR::Opnd *opnd, BasicBlock *block, Valu
1169811698

1169911699
// Fill in bail out info if the FromVar is a bailout instr, and it wasn't hoisted as invariant.
1170011700
// If it was hoisted, the invariant code will fill out the bailout info with the loop landing pad bailout info.
11701-
this->FillBailOutInfo(block, newInstr->GetBailOutInfo());
11701+
this->FillBailOutInfo(block, newInstr);
1170211702

1170311703
if(valueInfo)
1170411704
{
@@ -15579,7 +15579,7 @@ GlobOpt::PreOptPeep(IR::Instr *instr)
1557915579
{
1558015580
if (!this->prePassLoop)
1558115581
{
15582-
FillBailOutInfo(this->currentBlock, instr->GetBailOutInfo());
15582+
FillBailOutInfo(this->currentBlock, instr);
1558315583
}
1558415584
// Already processed.
1558515585
return instr;
@@ -15598,7 +15598,7 @@ GlobOpt::PreOptPeep(IR::Instr *instr)
1559815598

1559915599
if (!this->currentBlock->loop)
1560015600
{
15601-
FillBailOutInfo(this->currentBlock, instr->GetBailOutInfo());
15601+
FillBailOutInfo(this->currentBlock, instr);
1560215602
}
1560315603
else
1560415604
{

lib/Backend/GlobOpt.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -867,7 +867,8 @@ class GlobOpt
867867
void EndTrackCall(IR::Instr * instr);
868868
void EndTrackingOfArgObjSymsForInlinee();
869869
void FillBailOutInfo(BasicBlock *block, BailOutInfo *bailOutInfo);
870-
870+
void FillBailOutInfo(BasicBlock *block, _In_ IR::Instr * instr);
871+
871872
static void MarkNonByteCodeUsed(IR::Instr * instr);
872873
static void MarkNonByteCodeUsed(IR::Opnd * opnd);
873874

lib/Backend/GlobOptBailOut.cpp

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1022,6 +1022,27 @@ GlobOpt::FillBailOutInfo(BasicBlock *block, BailOutInfo * bailOutInfo)
10221022
this->CaptureValues(block, bailOutInfo);
10231023
}
10241024

1025+
void
1026+
GlobOpt::FillBailOutInfo(BasicBlock *block, _In_ IR::Instr * instr)
1027+
{
1028+
AssertMsg(!this->isCallHelper, "Bail out can't be inserted the middle of CallHelper sequence");
1029+
Assert(instr->HasBailOutInfo());
1030+
1031+
if (this->isRecursiveCallOnLandingPad)
1032+
{
1033+
Assert(block->IsLandingPad());
1034+
Loop * loop = block->next->loop;
1035+
EnsureBailTarget(loop);
1036+
if (instr->GetBailOutInfo() != loop->bailOutInfo)
1037+
{
1038+
instr->ReplaceBailOutInfo(loop->bailOutInfo);
1039+
}
1040+
return;
1041+
}
1042+
1043+
FillBailOutInfo(block, instr->GetBailOutInfo());
1044+
}
1045+
10251046
IR::ByteCodeUsesInstr *
10261047
GlobOpt::InsertByteCodeUses(IR::Instr * instr, bool includeDef)
10271048
{
@@ -1374,7 +1395,7 @@ GlobOpt::GenerateBailAfterOperation(IR::Instr * *const pInstr, IR::BailOutKind k
13741395
{
13751396
this->currentBlock->SetLastInstr(bailOutInstr);
13761397
}
1377-
FillBailOutInfo(this->currentBlock, bailOutInstr->GetBailOutInfo());
1398+
FillBailOutInfo(this->currentBlock, bailOutInstr);
13781399
*pInstr = bailOutInstr;
13791400
}
13801401

@@ -1393,7 +1414,7 @@ GlobOpt::GenerateBailAtOperation(IR::Instr * *const pInstr, const IR::BailOutKin
13931414
{
13941415
this->currentBlock->SetLastInstr(bailOutInstr);
13951416
}
1396-
FillBailOutInfo(currentBlock, bailOutInstr->GetBailOutInfo());
1417+
FillBailOutInfo(currentBlock, bailOutInstr);
13971418
*pInstr = bailOutInstr;
13981419
}
13991420

lib/Backend/IR.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1216,9 +1216,10 @@ Instr::ReplaceBailOutInfo(BailOutInfo *newBailOutInfo)
12161216
Assert(false);
12171217
__assume(UNREACHED);
12181218
}
1219-
Assert(!oldBailOutInfo->wasCloned && !oldBailOutInfo->wasCopied);
1219+
12201220
if (oldBailOutInfo->bailOutInstr == this)
12211221
{
1222+
Assert(!oldBailOutInfo->wasCloned && !oldBailOutInfo->wasCopied);
12221223
JitArenaAllocator * alloc = this->m_func->m_alloc;
12231224
oldBailOutInfo->Clear(alloc);
12241225
JitAdelete(alloc, oldBailOutInfo);

test/Optimizer/rlexe.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1483,6 +1483,11 @@
14831483
<compile-flags>-mic:1 -off:simplejit -bgjit- -force:fixdataprops -lic:1</compile-flags>
14841484
</default>
14851485
</test>
1486+
<test>
1487+
<default>
1488+
<files>test150.js</files>
1489+
</default>
1490+
</test>
14861491
<test>
14871492
<default>
14881493
<files>IsIn_ArrayNoMissingValues.js</files>

test/Optimizer/test150.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//-------------------------------------------------------------------------------------------------------
2+
// Copyright (C) Microsoft. All rights reserved.
3+
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
4+
//-------------------------------------------------------------------------------------------------------
5+
6+
function func2() {
7+
for (; Object.prop1;) {}
8+
}
9+
var ary = [1];
10+
var uic8 = new Uint8ClampedArray();
11+
let i = 0;
12+
while (ary[uic8[1] >= 0 ? uic8[1] : 0]) {
13+
func2();
14+
if(i++ > 1000) break;
15+
}
16+
print("passed");

0 commit comments

Comments
 (0)