Skip to content

Commit 814d084

Browse files
author
Jianchun Xu
committed
[MERGE #1320 @jianchun] Merge remote-tracking branch 'origin/master' into linux
Merge pull request #1320 from jianchun:filinux
2 parents 7b34d80 + 56fe248 commit 814d084

18 files changed

+394
-211
lines changed

bin/ch/WScriptJsrt.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
// Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
44
//-------------------------------------------------------------------------------------------------------
55
#include "stdafx.h"
6-
#include <string>
76

87
MessageQueue* WScriptJsrt::messageQueue = nullptr;
98
std::map<std::string, JsModuleRecord> WScriptJsrt::moduleRecordMap;
@@ -1046,4 +1045,3 @@ JsErrorCode WScriptJsrt::NotifyModuleReadyCallback(_In_opt_ JsModuleRecord refer
10461045
}
10471046
return JsNoError;
10481047
}
1049-

bin/ch/stdafx.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#define ENABLE_TEST_HOOKS 1
2727
#include "CommonDefines.h"
2828
#include <map>
29+
#include <string>
2930

3031
#ifdef _WIN32
3132
#include <windows.h>

lib/Backend/GlobOpt.cpp

Lines changed: 100 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1061,9 +1061,6 @@ GlobOpt::MergePredBlocksValueMaps(BasicBlock *block)
10611061
this->KillAllObjectTypes();
10621062
}
10631063

1064-
this->blockData.capturedArgs = JitAnew(this->alloc, BVSparse<JitArenaAllocator>, this->alloc);
1065-
this->blockData.changedSyms = JitAnew(this->alloc, BVSparse<JitArenaAllocator>, this->alloc);
1066-
10671064
this->CopyBlockData(&block->globOptData, &this->blockData);
10681065

10691066
if (this->IsLoopPrePass())
@@ -1513,7 +1510,6 @@ GlobOpt::NulloutBlockData(GlobOptBlockData *data)
15131510
data->stackLiteralInitFldDataMap = nullptr;
15141511

15151512
data->capturedValues = nullptr;
1516-
data->capturedArgs = nullptr;
15171513
data->changedSyms = nullptr;
15181514

15191515
data->OnDataUnreferenced();
@@ -1562,6 +1558,8 @@ GlobOpt::InitBlockData()
15621558

15631559
data->stackLiteralInitFldDataMap = nullptr;
15641560

1561+
data->changedSyms = JitAnew(alloc, BVSparse<JitArenaAllocator>, alloc);
1562+
15651563
data->OnDataInitialized(alloc);
15661564
}
15671565

@@ -1610,9 +1608,7 @@ GlobOpt::ReuseBlockData(GlobOptBlockData *toData, GlobOptBlockData *fromData)
16101608

16111609
toData->stackLiteralInitFldDataMap = fromData->stackLiteralInitFldDataMap;
16121610

1613-
toData->capturedArgs = fromData->capturedArgs;
16141611
toData->changedSyms = fromData->changedSyms;
1615-
toData->capturedArgs->ClearAll();
16161612
toData->changedSyms->ClearAll();
16171613

16181614
toData->OnDataReused(fromData);
@@ -1651,9 +1647,7 @@ GlobOpt::CopyBlockData(GlobOptBlockData *toData, GlobOptBlockData *fromData)
16511647
toData->inlinedArgOutCount = fromData->inlinedArgOutCount;
16521648
toData->hasCSECandidates = fromData->hasCSECandidates;
16531649

1654-
toData->capturedArgs = fromData->capturedArgs;
16551650
toData->changedSyms = fromData->changedSyms;
1656-
toData->capturedArgs->ClearAll();
16571651
toData->changedSyms->ClearAll();
16581652

16591653
toData->stackLiteralInitFldDataMap = fromData->stackLiteralInitFldDataMap;
@@ -1769,6 +1763,9 @@ void GlobOpt::CloneBlockData(BasicBlock *const toBlock, GlobOptBlockData *const
17691763
toData->stackLiteralInitFldDataMap = nullptr;
17701764
}
17711765

1766+
toData->changedSyms = JitAnew(alloc, BVSparse<JitArenaAllocator>, alloc);
1767+
toData->changedSyms->Copy(fromData->changedSyms);
1768+
17721769
Assert(fromData->HasData());
17731770
toData->OnDataInitialized(alloc);
17741771
}
@@ -1829,6 +1826,60 @@ GlobOpt::CloneValues(BasicBlock *const toBlock, GlobOptBlockData *toData, GlobOp
18291826
ProcessValueKills(toBlock, toData);
18301827
}
18311828

1829+
template <typename CapturedList, typename CapturedItemsAreEqual>
1830+
void
1831+
GlobOpt::MergeCapturedValues(
1832+
GlobOptBlockData * toData,
1833+
SListBase<CapturedList> * toList,
1834+
SListBase<CapturedList> * fromList,
1835+
CapturedItemsAreEqual itemsAreEqual)
1836+
{
1837+
SListBase<CapturedList>::Iterator iterTo(toList);
1838+
SListBase<CapturedList>::Iterator iterFrom(fromList);
1839+
bool hasTo = iterTo.Next();
1840+
bool hasFrom = fromList == nullptr ? false : iterFrom.Next();
1841+
1842+
// to be conservative, only copy the captured value for common sym Ids
1843+
// in from and to CapturedList, mark all non-common sym Ids for re-capture
1844+
while (hasFrom && hasTo)
1845+
{
1846+
Sym * symFrom = iterFrom.Data().Key();
1847+
Sym * symTo = iterTo.Data().Key();
1848+
1849+
if (symFrom->m_id < symTo->m_id)
1850+
{
1851+
toData->changedSyms->Set(symFrom->m_id);
1852+
hasFrom = iterFrom.Next();
1853+
}
1854+
else if(symFrom->m_id > symTo->m_id)
1855+
{
1856+
toData->changedSyms->Set(symTo->m_id);
1857+
hasTo = iterTo.Next();
1858+
}
1859+
else
1860+
{
1861+
if (!itemsAreEqual(&iterFrom.Data(), &iterTo.Data()))
1862+
{
1863+
toData->changedSyms->Set(symTo->m_id);
1864+
}
1865+
1866+
hasFrom = iterFrom.Next();
1867+
hasTo = iterTo.Next();
1868+
}
1869+
}
1870+
bool hasRemain = hasFrom || hasTo;
1871+
if (hasRemain)
1872+
{
1873+
SListBase<CapturedList>::Iterator iterRemain(hasFrom ? iterFrom : iterTo);
1874+
do
1875+
{
1876+
Sym * symRemain = iterRemain.Data().Key();
1877+
toData->changedSyms->Set(symRemain->m_id);
1878+
hasRemain = iterRemain.Next();
1879+
} while (hasRemain);
1880+
}
1881+
}
1882+
18321883
void
18331884
GlobOpt::MergeBlockData(
18341885
GlobOptBlockData *toData,
@@ -1856,6 +1907,39 @@ GlobOpt::MergeBlockData(
18561907
toData->isTempSrc->And(fromData->isTempSrc);
18571908
toData->hasCSECandidates &= fromData->hasCSECandidates;
18581909

1910+
if (toData->capturedValues == nullptr)
1911+
{
1912+
toData->capturedValues = fromData->capturedValues;
1913+
toData->changedSyms->Or(fromData->changedSyms);
1914+
}
1915+
else
1916+
{
1917+
MergeCapturedValues(
1918+
toData,
1919+
&toData->capturedValues->constantValues,
1920+
fromData->capturedValues == nullptr ? nullptr : &fromData->capturedValues->constantValues,
1921+
[&](ConstantStackSymValue * symValueFrom, ConstantStackSymValue * symValueTo)
1922+
{
1923+
return symValueFrom->Value().IsEqual(symValueTo->Value());
1924+
});
1925+
1926+
MergeCapturedValues(
1927+
toData,
1928+
&toData->capturedValues->copyPropSyms,
1929+
fromData->capturedValues == nullptr ? nullptr : &fromData->capturedValues->copyPropSyms,
1930+
[&](CopyPropSyms * copyPropSymFrom, CopyPropSyms * copyPropSymTo)
1931+
{
1932+
if (copyPropSymFrom->Value()->m_id == copyPropSymTo->Value()->m_id)
1933+
{
1934+
Value * val = FindValue(copyPropSymFrom->Key());
1935+
Value * copyVal = FindValue(copyPropSymTo->Key());
1936+
return (val != nullptr && copyVal != nullptr &&
1937+
val->GetValueNumber() == copyVal->GetValueNumber());
1938+
}
1939+
return false;
1940+
});
1941+
}
1942+
18591943
if (fromData->maybeWrittenTypeSyms)
18601944
{
18611945
if (toData->maybeWrittenTypeSyms == nullptr)
@@ -2269,6 +2353,8 @@ GlobOpt::DeleteBlockData(GlobOptBlockData *data)
22692353
JitAdelete(alloc, data->stackLiteralInitFldDataMap);
22702354
}
22712355

2356+
JitAdelete(alloc, data->changedSyms);
2357+
22722358
data->OnDataDeleted();
22732359
}
22742360

@@ -5080,7 +5166,6 @@ GlobOpt::OptInstr(IR::Instr *&instr, bool* isInstrRemoved)
50805166

50815167
if (instr->HasBailOutInfo() && !this->IsLoopPrePass())
50825168
{
5083-
this->currentBlock->globOptData.capturedArgs->ClearAll();
50845169
this->currentBlock->globOptData.changedSyms->ClearAll();
50855170
this->currentBlock->globOptData.capturedValues =
50865171
this->currentBlock->globOptData.capturedValuesCandidate;
@@ -6477,7 +6562,7 @@ GlobOpt::CopyPropReplaceOpnd(IR::Instr * instr, IR::Opnd * opnd, StackSym * copy
64776562
// We're creating a copy of this operand to be reused in the same spot in the flow, so we can copy all
64786563
// flow sensitive fields. However, we will do only a type check here (no property access) and only for
64796564
// the sake of downstream instructions, so the flags pertaining to this property access are irrelevant.
6480-
IR::PropertySymOpnd* checkObjTypeOpnd = propertySymOpnd->CopyForTypeCheckOnly(instr->m_func);
6565+
IR::PropertySymOpnd* checkObjTypeOpnd = CreateOpndForTypeCheckOnly(propertySymOpnd, instr->m_func);
64816566
IR::Instr* checkObjTypeInstr = IR::Instr::New(Js::OpCode::CheckObjType, instr->m_func);
64826567
checkObjTypeInstr->SetSrc1(checkObjTypeOpnd);
64836568
checkObjTypeInstr->SetByteCodeOffset(instr);
@@ -7097,9 +7182,9 @@ GlobOpt::SetSymStoreDirect(ValueInfo * valueInfo, Sym * sym)
70977182
{
70987183
Sym * prevSymStore = valueInfo->GetSymStore();
70997184
if (prevSymStore && prevSymStore->IsStackSym() &&
7100-
prevSymStore->AsStackSym()->HasByteCodeRegSlot() &&
7101-
this->blockData.changedSyms)
7185+
prevSymStore->AsStackSym()->HasByteCodeRegSlot())
71027186
{
7187+
Assert(this->blockData.changedSyms != nullptr);
71037188
this->blockData.changedSyms->Set(prevSymStore->m_id);
71047189
}
71057190
valueInfo->SetSymStore(sym);
@@ -7122,8 +7207,9 @@ GlobOpt::SetValue(GlobOptBlockData *blockData, Value *val, Sym * sym)
71227207
else
71237208
{
71247209
SetValueToHashTable(blockData->symToValueMap, val, sym);
7125-
if (blockData->changedSyms && isStackSym && sym->AsStackSym()->HasByteCodeRegSlot())
7210+
if (isStackSym && sym->AsStackSym()->HasByteCodeRegSlot())
71267211
{
7212+
Assert(blockData->changedSyms != nullptr);
71277213
blockData->changedSyms->Set(sym->m_id);
71287214
}
71297215
}
@@ -21609,4 +21695,4 @@ ValueNumber JsUtil::ValueToKey<ValueNumber, Value *>::ToKey(Value *const &value)
2160921695
{
2161021696
Assert(value);
2161121697
return value->GetValueNumber();
21612-
}
21698+
}

lib/Backend/GlobOpt.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -954,7 +954,6 @@ class GlobOptBlockData
954954
callSequence(nullptr),
955955
capturedValuesCandidate(nullptr),
956956
capturedValues(nullptr),
957-
capturedArgs(nullptr),
958957
changedSyms(nullptr),
959958
hasCSECandidates(false),
960959
curFunc(func),
@@ -1008,7 +1007,6 @@ class GlobOptBlockData
10081007

10091008
CapturedValues * capturedValuesCandidate;
10101009
CapturedValues * capturedValues;
1011-
BVSparse<JitArenaAllocator> * capturedArgs;
10121010
BVSparse<JitArenaAllocator> * changedSyms;
10131011

10141012
uint inlinedArgOutCount;
@@ -1306,6 +1304,9 @@ class GlobOpt
13061304
void CloneBlockData(BasicBlock *const toBlock, BasicBlock *const fromBlock);
13071305
void CloneBlockData(BasicBlock *const toBlock, GlobOptBlockData *const toData, BasicBlock *const fromBlock);
13081306
void CloneValues(BasicBlock *const toBlock, GlobOptBlockData *toData, GlobOptBlockData *fromData);
1307+
1308+
template <typename CapturedList, typename CapturedItemsAreEqual>
1309+
void MergeCapturedValues(GlobOptBlockData * toData, SListBase<CapturedList> * toList, SListBase<CapturedList> * fromList, CapturedItemsAreEqual itemsAreEqual);
13091310
void MergeBlockData(GlobOptBlockData *toData, BasicBlock *toBlock, BasicBlock *fromBlock, BVSparse<JitArenaAllocator> *const symsRequiringCompensation, BVSparse<JitArenaAllocator> *const symsCreatedForMerge, bool forceTypeSpecOnLoopHeader);
13101311
void DeleteBlockData(GlobOptBlockData *data);
13111312
IR::Instr * OptInstr(IR::Instr *&instr, bool* isInstrCleared);
@@ -1316,6 +1317,7 @@ class GlobOpt
13161317
bool OptTagChecks(IR::Instr *instr);
13171318
void TryOptimizeInstrWithFixedDataProperty(IR::Instr * * const pInstr);
13181319
bool CheckIfPropOpEmitsTypeCheck(IR::Instr *instr, IR::PropertySymOpnd *opnd);
1320+
IR::PropertySymOpnd * CreateOpndForTypeCheckOnly(IR::PropertySymOpnd* opnd, Func* func);
13191321
bool FinishOptPropOp(IR::Instr *instr, IR::PropertySymOpnd *opnd, BasicBlock* block = nullptr, bool updateExistingValue = false, bool* emitsTypeCheckOut = nullptr, bool* changesTypeValueOut = nullptr);
13201322
void FinishOptHoistedPropOps(Loop * loop);
13211323
IR::Instr * SetTypeCheckBailOut(IR::Opnd *opnd, IR::Instr *instr, BailOutInfo *bailOutInfo);
@@ -1643,6 +1645,14 @@ class GlobOpt
16431645
static void TrackByteCodeSymUsed(IR::RegOpnd * opnd, BVSparse<JitArenaAllocator> * instrByteCodeStackSymUsed);
16441646
static void TrackByteCodeSymUsed(StackSym * sym, BVSparse<JitArenaAllocator> * instrByteCodeStackSymUsed);
16451647
void CaptureValues(BasicBlock *block, BailOutInfo * bailOutInfo);
1648+
void GlobOpt::CaptureValuesFromScratch(
1649+
BasicBlock * block,
1650+
SListBase<ConstantStackSymValue>::EditingIterator & bailOutConstValuesIter,
1651+
SListBase<CopyPropSyms>::EditingIterator & bailOutCopyPropIter);
1652+
void GlobOpt::CaptureValuesIncremental(
1653+
BasicBlock * block,
1654+
SListBase<ConstantStackSymValue>::EditingIterator & bailOutConstValuesIter,
1655+
SListBase<CopyPropSyms>::EditingIterator & bailOutCopyPropIter);
16461656
void CaptureCopyPropValue(BasicBlock * block, Sym * sym, Value * val, SListBase<CopyPropSyms>::EditingIterator & bailOutCopySymsIter);
16471657
void CaptureArguments(BasicBlock *block, BailOutInfo * bailOutInfo, JitArenaAllocator *allocator);
16481658
void CaptureByteCodeSymUses(IR::Instr * instr);

0 commit comments

Comments
 (0)