| Summary: | Introduce get_by_id like IC into get_by_val when the given name is String or Symbol | ||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Product: | WebKit | Reporter: | Yusuke Suzuki <ysuzuki> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Component: | JavaScriptCore | Assignee: | Yusuke Suzuki <ysuzuki> | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Status: | RESOLVED FIXED | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| Severity: | Normal | CC: | buildbot, cdumez, fpizlo, ggaren, mark.lam, msaboff, rniwa | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Priority: | P2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| Version: | 528+ (Nightly build) | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| Hardware: | Unspecified | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| OS: | Unspecified | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| Bug Depends on: | 147818 | ||||||||||||||||||||||||||||||||||||||||||||||||||||
| Bug Blocks: | |||||||||||||||||||||||||||||||||||||||||||||||||||||
| Attachments: |
|
||||||||||||||||||||||||||||||||||||||||||||||||||||
... or when the given name is a String Created attachment 257931 [details]
Patch
WIP: adding inlined self IC compiler into get_by_val
Created attachment 257942 [details]
Patch
WIP: adding identifier check patching into IC
Comment on attachment 257942 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=257942&action=review > Source/JavaScriptCore/bytecode/PolymorphicAccessStructureList.h:51 > + RefPtr<UniquedStringImpl> identifierForVal; This change shouldn't be necessary, since this class is only used for op_in, not op_get_by_id. > Source/JavaScriptCore/bytecode/StructureStubInfo.h:114 > + void initGetByValSelf(VM& vm, JSCell* owner, Structure* baseObjectStructure, const Identifier& propertyName) > + { > + initGetByIdSelf(vm, owner, baseObjectStructure); > + identifierForByVal = propertyName; > + } > + I don't like this. StructureStubInfo shouldn't know anything about get_by_val. It should be get_by_val's job to verify the index, and then create a StructureStubInfo on-demand that uses the right identifier. When you do that, the StructureStubInfo doesn't have to know about the identifier. > Source/JavaScriptCore/jit/JITInlineCacheGenerator.h:146 > +class JITGetByValGenerator : public JITGetByIdGenerator { > +public: > + JITGetByValGenerator() : JITGetByIdGenerator() { } > + > + JITGetByValGenerator( > + CodeBlock*, CodeOrigin, const RegisterSet&, JSValueRegs base, > + JSValueRegs value, GPRReg identifier, SpillRegistersMode spillMode); > + > + void generateFastPath(MacroAssembler&); > + > + MacroAssembler::JumpList slowPathJumps() const > + { > + MacroAssembler::JumpList jumpList; > + jumpList.append(m_structureCheck.m_jump); > + jumpList.append(m_identifierCheck.m_jump); > + return jumpList; > + } > + > + V_JITOperation_ESsiJJI slowPathFunction(); > + > +private: > + GPRReg m_identifier; > +}; Seems wrong. The right solution is to have the existing get_by_val inline caching generate a stub with an index check. That index check does not have to be patchable. > Source/JavaScriptCore/jit/JITPropertyAccess.cpp:232 > + // regT1 holds RefPtr<UniquedStringImpl> compatible structure. > + JITGetByValGenerator gen( > + m_codeBlock, CodeOrigin(m_bytecodeOffset), RegisterSet::specialRegisters(), > + JSValueRegs(regT0), JSValueRegs(regT0), regT1, DontSpill); > + gen.generateFastPath(*this); > + JumpList successCases; > + successCases.append(jump()); This should be generated on-demand on the fast path, instead of bloating the code on the slow path. Comment on attachment 257942 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=257942&action=review Thank you! Quite helpful. >> Source/JavaScriptCore/bytecode/PolymorphicAccessStructureList.h:51 >> + RefPtr<UniquedStringImpl> identifierForVal; > > This change shouldn't be necessary, since this class is only used for op_in, not op_get_by_id. Thanks. Dropped. >> Source/JavaScriptCore/bytecode/StructureStubInfo.h:114 >> + > > I don't like this. StructureStubInfo shouldn't know anything about get_by_val. It should be get_by_val's job to verify the index, and then create a StructureStubInfo on-demand that uses the right identifier. When you do that, the StructureStubInfo doesn't have to know about the identifier. You mean that only one identifier is allowed to be cached in the get_by_val place, correct? At first, I introduced the following polymorphic IC for get_by_val, [IC:1, ident:'A'] if (given subscript is not ident 'A') goto IC:2 ... get_by_id IC for IC:1... [IC:2, ident:'B'] if (given subscript is not ident 'B') goto IC:3 ... get_by_id IC for IC:2... [IC:3, ident:'B'] // the same ident name to IC:2, but access type may differ. if (given subscript is not ident 'B') goto IC:4 ... get_by_id IC for IC:3... If I understand your plan, you means the following. if (the given subscript is not the cached ident 'A') fail; [IC:1] ... get_by_id IC for IC:1... [IC:2] ... get_by_id IC for IC:2... [IC:3] ... get_by_id IC for IC:3... // IC layer is the almost same to the get_by_id's one. In the second case, we can keep IC layer completely unaware of identifier check because get_by_val layer already validate the given subscript is the cached identifier. (In reply to comment #5) > Comment on attachment 257942 [details] > Patch > > View in context: > https://bugs.webkit.org/attachment.cgi?id=257942&action=review > > Thank you! Quite helpful. > > >> Source/JavaScriptCore/bytecode/PolymorphicAccessStructureList.h:51 > >> + RefPtr<UniquedStringImpl> identifierForVal; > > > > This change shouldn't be necessary, since this class is only used for op_in, not op_get_by_id. > > Thanks. Dropped. > > >> Source/JavaScriptCore/bytecode/StructureStubInfo.h:114 > >> + > > > > I don't like this. StructureStubInfo shouldn't know anything about get_by_val. It should be get_by_val's job to verify the index, and then create a StructureStubInfo on-demand that uses the right identifier. When you do that, the StructureStubInfo doesn't have to know about the identifier. > > You mean that only one identifier is allowed to be cached in the get_by_val > place, correct? > > At first, I introduced the following polymorphic IC for get_by_val, > > [IC:1, ident:'A'] > if (given subscript is not ident 'A') > goto IC:2 > ... get_by_id IC for IC:1... > > [IC:2, ident:'B'] > if (given subscript is not ident 'B') > goto IC:3 > ... get_by_id IC for IC:2... > > [IC:3, ident:'B'] // the same ident name to IC:2, but access type may > differ. > if (given subscript is not ident 'B') > goto IC:4 > ... get_by_id IC for IC:3... > > > If I understand your plan, you means the following. > > if (the given subscript is not the cached ident 'A') > fail; > [IC:1] > ... get_by_id IC for IC:1... > > [IC:2] > ... get_by_id IC for IC:2... > > [IC:3] > ... get_by_id IC for IC:3... > // IC layer is the almost same to the get_by_id's one. > > In the second case, we can keep IC layer completely unaware of identifier > check because get_by_val layer already validate the given subscript is the > cached identifier. Yup, that's right (In reply to comment #6) > > Yup, that's right I've got it! OK, I'll update the patch to follow this design, it significantly reduces the IC layer's change! Created attachment 258031 [details]
Patch
WIP: Adding IC into baseline 64 JIT, baseline 32_64, DFG is not yet
Created attachment 258032 [details]
Patch
WIP: Adding IC into baseline 64 JIT. baseline 32_64, DFG, marking IC when the place is used as generic are not yet
Created attachment 258105 [details]
Patch
WIP: Adding baseline 32_64. DFG is not yet
Created attachment 258149 [details]
Patch
WIP: baseline fix. Working on DFG...
baseline layer is almost done. Now, I'm planning to implement DFG layer. Here is my plan, 1. Introduce a new DFG Node, CheckIdent. 2. Use StringIdentUse / SymbolUse with CheckIdent. 3. Before emitting GetById related ops for GetByVal, insert CheckIdent for the subscript. Created attachment 258153 [details]
Patch
WIP: adding SymbolUse. And fix bug in baseline side
Created attachment 258160 [details]
Patch
WIP: partial DFG/FTL. still fixing issues
In the currently proposed patch, I don't use CheckCell because the different Symbol / JSString cell can hold the expected identifier.
For Symbol, different cell holding the same identifier is the rare case.
var symbol1 = Symbol();
var object = {};
object[symbol1] = 42;
var symbol2 = Object.getOwnPropertySymbols(object)[0];
// Here, symbol1 and symbol2 indicates the same identifier, but the JSCell addresses are not the same.
But for String case, it is not so rare I guess.
function hello(name) {
return object[name];
}
noInline(hello);
function a() {
var string = 'prototype';
hello(string);
}
function b() {
var string = 'prototype';
hello(string);
}
a();
b();
Created attachment 258209 [details]
Patch
WIP: progress in string handling in DFG, still working on SymbolUse
Created attachment 258222 [details]
Patch
WIP: fixing crashes in DFG
Created attachment 258242 [details]
Patch
WIP: implementation is done, now running benchmarks
Created attachment 258246 [details]
Patch
WIP: fixed issues
Performance Results.
Benchmark report for SunSpider, LongSpider, V8Spider, and JSRegress on Yusukes-MacBook-Pro (MacBookPro11,3).
VMs tested:
"master" at /Users/yusukesuzuki/development/WebKit/WebKitBuild/master-for-gen3/Release/jsc
"species" at /Users/yusukesuzuki/development/WebKit/WebKitBuild/gen3/Release/jsc
Collected 4 samples per benchmark/VM, with 4 VM invocations per benchmark. Emitted a call to gc() between sample
measurements. Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific preciseTime() function to get
microsecond-level timing. Reporting benchmark execution times with 95% confidence intervals in milliseconds.
master species
SunSpider:
3d-cube 4.4421+-0.1373 ? 4.4938+-0.2017 ? might be 1.0117x slower
3d-morph 5.2539+-0.1642 ? 5.4995+-0.7748 ? might be 1.0467x slower
3d-raytrace 5.3616+-0.1164 5.3560+-0.3120
access-binary-trees 2.0035+-0.1363 ? 2.0813+-0.0164 ? might be 1.0388x slower
access-fannkuch 5.5674+-0.4500 5.4594+-0.1643 might be 1.0198x faster
access-nbody 2.4971+-0.0424 ? 2.6827+-0.5851 ? might be 1.0743x slower
access-nsieve 3.1160+-0.3489 3.0283+-0.0168 might be 1.0290x faster
bitops-3bit-bits-in-byte 1.4741+-0.0303 ? 1.5028+-0.0377 ? might be 1.0195x slower
bitops-bits-in-byte 3.5947+-0.9204 3.3135+-0.1061 might be 1.0849x faster
bitops-bitwise-and 2.0226+-0.0669 2.0049+-0.0812
bitops-nsieve-bits 3.1756+-0.7110 2.9510+-0.0503 might be 1.0761x faster
controlflow-recursive 2.0978+-0.1570 2.0319+-0.0338 might be 1.0324x faster
crypto-aes 3.9552+-0.3245 3.8408+-0.1452 might be 1.0298x faster
crypto-md5 2.5662+-0.2660 2.5242+-0.0771 might be 1.0166x faster
crypto-sha1 2.4197+-0.1816 ? 2.5527+-0.2507 ? might be 1.0549x slower
date-format-tofte 6.9675+-0.3037 6.8753+-0.6531 might be 1.0134x faster
date-format-xparb 4.6592+-0.1305 ? 4.6697+-0.1837 ?
math-cordic 2.8740+-0.2484 2.7986+-0.0515 might be 1.0270x faster
math-partial-sums 5.2408+-0.0563 ? 5.3026+-0.1072 ? might be 1.0118x slower
math-spectral-norm 1.8510+-0.0380 1.8447+-0.0476
regexp-dna 6.3317+-0.1154 ? 6.3854+-0.2599 ?
string-base64 4.4282+-0.3474 4.3973+-0.3080
string-fasta 5.9208+-0.4972 5.7447+-0.0309 might be 1.0307x faster
string-tagcloud 8.0621+-0.1160 ? 8.1893+-0.3404 ? might be 1.0158x slower
string-unpack-code 20.3472+-0.7518 ? 22.4705+-1.4263 ? might be 1.1044x slower
string-validate-input 4.5556+-0.1875 4.5268+-0.1930
<arithmetic> 4.6456+-0.0810 ? 4.7126+-0.0830 ? might be 1.0144x slower
master species
LongSpider:
3d-cube 788.5104+-7.1031 ? 794.5159+-14.8157 ?
3d-morph 1546.9291+-8.7013 1541.2802+-15.1348
3d-raytrace 635.7060+-5.8197 ? 637.9692+-15.0313 ?
access-binary-trees 820.4293+-5.8260 813.4664+-15.4834
access-fannkuch 280.5819+-1.6577 ? 335.7636+-138.7062 ? might be 1.1967x slower
access-nbody 525.3265+-11.2679 ? 527.3303+-11.4000 ?
access-nsieve 373.5825+-14.8546 ^ 354.3922+-3.7372 ^ definitely 1.0542x faster
bitops-3bit-bits-in-byte 41.2095+-1.8689 40.5767+-0.4060 might be 1.0156x faster
bitops-bits-in-byte 85.1035+-10.9336 83.1199+-5.2342 might be 1.0239x faster
bitops-nsieve-bits 414.9383+-10.8680 409.3783+-3.1136 might be 1.0136x faster
controlflow-recursive 429.6959+-9.4196 ? 435.9777+-16.0018 ? might be 1.0146x slower
crypto-aes 592.8259+-4.9213 590.2338+-4.0614
crypto-md5 479.8030+-1.2676 ? 502.2087+-42.5488 ? might be 1.0467x slower
crypto-sha1 653.0675+-4.8542 645.2822+-3.7021 might be 1.0121x faster
date-format-tofte 528.8321+-2.3000 525.9768+-31.3396
date-format-xparb 649.0792+-13.0377 640.5962+-6.3482 might be 1.0132x faster
hash-map 162.2410+-18.9961 156.6026+-3.0365 might be 1.0360x faster
math-cordic 499.1398+-4.8882 495.2929+-1.1802
math-partial-sums 502.1100+-4.4317 ? 505.5042+-5.2820 ?
math-spectral-norm 563.1696+-1.8095 563.0532+-4.5553
string-base64 360.5756+-15.5971 352.0096+-6.6049 might be 1.0243x faster
string-fasta 369.1275+-2.5965 ? 370.8400+-3.3582 ?
string-tagcloud 183.6224+-5.9776 180.4573+-0.6131 might be 1.0175x faster
<geometric> 401.7395+-4.3766 ? 401.9177+-7.0245 ? might be 1.0004x slower
master species
V8Spider:
crypto 50.2827+-1.4262 ? 50.8752+-2.4975 ? might be 1.0118x slower
deltablue 84.9785+-8.0150 82.3772+-14.1490 might be 1.0316x faster
earley-boyer 39.4887+-0.4282 ? 40.1658+-0.7787 ? might be 1.0171x slower
raytrace 29.7660+-2.0415 29.4099+-1.5646 might be 1.0121x faster
regexp 63.8270+-3.0747 63.3483+-0.6786
richards 70.5402+-2.3693 ? 70.6910+-2.5933 ?
splay 34.8151+-3.9969 33.6254+-2.3940 might be 1.0354x faster
<geometric> 50.0254+-1.0534 49.6261+-1.4227 might be 1.0080x faster
master species
JSRegress:
abc-forward-loop-equal 29.7699+-0.8810 ? 29.8286+-0.7802 ?
abc-postfix-backward-loop 29.5397+-1.1902 ? 29.6401+-0.2869 ?
abc-simple-backward-loop 29.5812+-0.5782 29.3205+-0.7110
abc-simple-forward-loop 29.2620+-0.9747 ? 29.4747+-1.6174 ?
abc-skippy-loop 21.3585+-1.0552 ? 22.2303+-3.1231 ? might be 1.0408x slower
abs-boolean 2.4760+-0.0457 ? 2.4854+-0.0916 ?
adapt-to-double-divide 16.5992+-0.3484 ? 16.9543+-1.6345 ? might be 1.0214x slower
aliased-arguments-getbyval 1.1517+-0.1043 1.1428+-0.1570
allocate-big-object 2.9448+-0.4917 2.7939+-0.5487 might be 1.0540x faster
arguments-named-and-reflective 11.1030+-0.5950 ? 11.1687+-0.6669 ?
arguments-out-of-bounds 10.0645+-0.4167 9.7751+-0.4799 might be 1.0296x faster
arguments-strict-mode 9.6418+-0.8168 9.6406+-0.3072
arguments 8.6718+-0.2952 ? 8.7939+-0.8420 ? might be 1.0141x slower
arity-mismatch-inlining 0.8503+-0.0366 0.8075+-0.0796 might be 1.0531x faster
array-access-polymorphic-structure 6.0428+-0.3265 6.0057+-0.4470
array-nonarray-polymorhpic-access 25.1509+-1.1862 24.6328+-0.8690 might be 1.0210x faster
array-prototype-every 76.1085+-1.6862 ? 77.2085+-0.6563 ? might be 1.0145x slower
array-prototype-forEach 75.9246+-2.3946 ? 75.9965+-0.8777 ?
array-prototype-map 82.7963+-1.0656 ? 83.1780+-1.5287 ?
array-prototype-reduce 91.0179+-53.0369 73.0562+-4.5362 might be 1.2459x faster
array-prototype-reduceRight 71.7922+-3.9629 71.3085+-0.4620
array-prototype-some 76.4712+-2.0568 ? 77.5084+-0.4317 ? might be 1.0136x slower
array-splice-contiguous 21.4180+-0.6371 21.3235+-1.1481
array-with-double-add 3.4208+-0.1032 ? 3.4612+-0.2265 ? might be 1.0118x slower
array-with-double-increment 3.4728+-1.2509 3.1915+-0.3961 might be 1.0881x faster
array-with-double-mul-add 4.3173+-0.3194 4.3008+-0.2876
array-with-double-sum 3.2119+-0.0411 ? 3.2183+-0.0370 ?
array-with-int32-add-sub 5.9630+-0.1739 5.9352+-0.0739
array-with-int32-or-double-sum 3.2280+-0.0301 3.2188+-0.0229
ArrayBuffer-DataView-alloc-large-long-lived
28.2720+-2.4650 27.4775+-0.2457 might be 1.0289x faster
ArrayBuffer-DataView-alloc-long-lived 12.7273+-0.6942 12.6464+-0.6886
ArrayBuffer-Int32Array-byteOffset 3.6003+-0.0828 ? 3.7080+-0.1915 ? might be 1.0299x slower
ArrayBuffer-Int8Array-alloc-large-long-lived
27.5381+-0.3343 ? 28.3159+-2.6325 ? might be 1.0282x slower
ArrayBuffer-Int8Array-alloc-long-lived-buffer
20.5453+-0.4426 20.5187+-0.4079
ArrayBuffer-Int8Array-alloc-long-lived 13.0433+-2.5018 11.7849+-0.4536 might be 1.1068x faster
ArrayBuffer-Int8Array-alloc 10.2642+-0.0943 ? 10.7675+-1.4762 ? might be 1.0490x slower
asmjs_bool_bug 7.2306+-0.0698 ? 7.4948+-0.3141 ? might be 1.0365x slower
assign-custom-setter-polymorphic 2.6484+-0.1868 2.5128+-0.0535 might be 1.0540x faster
assign-custom-setter 3.6039+-0.1641 3.4631+-0.2513 might be 1.0407x faster
basic-set 8.0643+-0.1772 ? 8.4390+-0.4250 ? might be 1.0465x slower
big-int-mul 3.5850+-0.2029 3.5020+-0.0700 might be 1.0237x faster
boolean-test 2.9070+-0.0551 ? 3.0471+-0.4749 ? might be 1.0482x slower
branch-fold 3.6533+-0.0786 3.6484+-0.0781
branch-on-string-as-boolean 16.5993+-0.6741 16.5320+-0.5459
by-val-generic 7.2444+-0.8123 6.3353+-0.1992 might be 1.1435x faster
call-spread-apply 26.8419+-0.6531 26.6405+-0.5037
call-spread-call 21.7241+-1.2665 21.0806+-0.6363 might be 1.0305x faster
captured-assignments 0.4415+-0.0612 0.4010+-0.0054 might be 1.1009x faster
cast-int-to-double 5.0946+-0.0749 ? 5.1187+-0.0169 ?
cell-argument 6.2999+-0.3781 ? 6.3842+-0.0212 ? might be 1.0134x slower
cfg-simplify 2.9525+-0.5096 2.7837+-0.1163 might be 1.0606x faster
chain-getter-access 8.1428+-0.0986 8.0204+-0.0891 might be 1.0153x faster
cmpeq-obj-to-obj-other 11.9151+-0.6244 11.4652+-2.2493 might be 1.0392x faster
constant-test 4.8922+-0.1319 ? 4.9088+-0.0918 ?
create-lots-of-functions 9.1223+-0.4366 ? 9.4798+-0.7190 ? might be 1.0392x slower
cse-new-array-buffer 2.3235+-0.1908 2.2791+-0.3743 might be 1.0195x faster
cse-new-array 2.2679+-0.2411 ? 2.2711+-0.2457 ?
DataView-custom-properties 32.2412+-0.7142 ? 32.2668+-0.3819 ?
delay-tear-off-arguments-strictmode 12.6199+-0.1107 ? 12.8565+-0.4830 ? might be 1.0187x slower
deltablue-varargs 151.3510+-4.5925 ? 152.1316+-11.5518 ?
destructuring-arguments 170.6247+-4.0783 168.3606+-0.5212 might be 1.0134x faster
destructuring-parameters-overridden-by-function
0.4482+-0.0730 0.4413+-0.0712 might be 1.0158x faster
destructuring-swap 4.8115+-0.1757 4.7328+-0.0311 might be 1.0166x faster
direct-arguments-getbyval 1.0618+-0.0406 ? 1.1099+-0.1510 ? might be 1.0453x slower
div-boolean-double 5.4202+-0.0301 ? 5.4555+-0.1404 ?
div-boolean 8.2736+-0.1153 ? 8.6228+-0.5151 ? might be 1.0422x slower
double-get-by-val-out-of-bounds 4.2249+-0.1336 4.1757+-0.2424 might be 1.0118x faster
double-pollution-getbyval 8.8760+-0.1794 8.7523+-0.1010 might be 1.0141x faster
double-pollution-putbyoffset 3.7828+-0.1348 3.6426+-0.1994 might be 1.0385x faster
double-real-use 26.3260+-4.0902 26.1821+-3.7775
double-to-int32-typed-array-no-inline 2.0786+-0.1241 ? 2.1222+-0.0882 ? might be 1.0210x slower
double-to-int32-typed-array 1.7986+-0.1374 1.7803+-0.0686 might be 1.0103x faster
double-to-uint32-typed-array-no-inline 2.1990+-0.1566 2.1404+-0.0418 might be 1.0273x faster
double-to-uint32-typed-array 1.8464+-0.0552 ? 1.9167+-0.2174 ? might be 1.0381x slower
elidable-new-object-dag 34.0302+-1.1429 33.5905+-0.3361 might be 1.0131x faster
elidable-new-object-roflcopter 33.1310+-0.9349 33.0817+-0.6415
elidable-new-object-then-call 32.2158+-3.3141 31.5032+-0.7944 might be 1.0226x faster
elidable-new-object-tree 36.5908+-1.1906 36.3511+-0.4197
empty-string-plus-int 4.7625+-0.0738 ? 4.7922+-0.1061 ?
emscripten-cube2hash 32.9211+-18.2414 28.4130+-4.0757 might be 1.1587x faster
exit-length-on-plain-object 12.4725+-0.1131 ? 13.0193+-1.6203 ? might be 1.0438x slower
external-arguments-getbyval 1.1725+-0.0280 ? 1.1985+-0.1270 ? might be 1.0221x slower
external-arguments-putbyval 2.2204+-0.1449 ? 2.2900+-0.2097 ? might be 1.0314x slower
fixed-typed-array-storage-var-index 1.1561+-0.0162 ? 1.1821+-0.0479 ? might be 1.0225x slower
fixed-typed-array-storage 0.8467+-0.0356 ? 0.8663+-0.0529 ? might be 1.0231x slower
Float32Array-matrix-mult 3.8981+-0.0956 ? 3.9576+-0.2181 ? might be 1.0153x slower
Float32Array-to-Float64Array-set 46.3846+-0.2725 ^ 45.7115+-0.2316 ^ definitely 1.0147x faster
Float64Array-alloc-long-lived 57.1180+-0.7057 ? 57.9312+-1.8843 ? might be 1.0142x slower
Float64Array-to-Int16Array-set 56.0037+-0.7759 ? 57.0682+-0.5906 ? might be 1.0190x slower
fold-double-to-int 12.6547+-0.0677 ? 14.9647+-7.0806 ? might be 1.1825x slower
fold-get-by-id-to-multi-get-by-offset-rare-int
10.7536+-0.3539 10.6722+-1.0550
fold-get-by-id-to-multi-get-by-offset 9.6079+-0.5963 9.3177+-0.5188 might be 1.0311x faster
fold-multi-get-by-offset-to-get-by-offset
8.6090+-2.4057 8.3649+-1.4544 might be 1.0292x faster
fold-multi-get-by-offset-to-poly-get-by-offset
7.7923+-0.5900 ? 7.8386+-2.4597 ?
fold-multi-put-by-offset-to-poly-put-by-offset
7.9594+-0.8225 7.4425+-1.1981 might be 1.0695x faster
fold-multi-put-by-offset-to-put-by-offset
5.8245+-0.6515 4.5423+-2.0912 might be 1.2823x faster
fold-multi-put-by-offset-to-replace-or-transition-put-by-offset
8.6542+-0.4720 8.5228+-1.2366 might be 1.0154x faster
fold-put-by-id-to-multi-put-by-offset 9.1339+-0.5704 8.8630+-0.5600 might be 1.0306x faster
fold-put-structure 5.8349+-0.5400 4.8110+-0.9734 might be 1.2128x faster
for-of-iterate-array-entries 11.7175+-0.4114 ? 11.7197+-0.2821 ?
for-of-iterate-array-keys 3.4621+-0.2076 ? 3.4626+-0.4146 ?
for-of-iterate-array-values 3.3162+-0.1397 ? 3.4852+-0.3870 ? might be 1.0510x slower
fround 18.9590+-1.1417 18.7536+-1.2086 might be 1.0110x faster
ftl-library-inlining-dataview 56.8015+-0.1752 56.7598+-0.1634
ftl-library-inlining 109.4910+-3.1652 ? 110.6372+-0.1823 ? might be 1.0105x slower
function-dot-apply 2.1013+-0.3940 2.0200+-0.0467 might be 1.0402x faster
function-test 2.6605+-0.0584 ? 2.8417+-0.2165 ? might be 1.0681x slower
function-with-eval 97.8994+-4.7749 ? 100.4015+-0.9963 ? might be 1.0256x slower
gcse-poly-get-less-obvious 14.7258+-1.0534 14.6083+-0.8778
gcse-poly-get 14.2435+-0.1949 ? 14.3100+-0.2055 ?
gcse 3.8340+-0.0114 ? 4.4080+-1.7529 ? might be 1.1497x slower
get-by-id-bimorphic-check-structure-elimination-simple
2.7872+-0.5376 2.5944+-0.0850 might be 1.0743x faster
get-by-id-bimorphic-check-structure-elimination
5.9355+-0.5136 5.8470+-0.2297 might be 1.0151x faster
get-by-id-chain-from-try-block 5.5346+-0.1672 ? 5.5804+-0.3280 ?
get-by-id-check-structure-elimination 4.4974+-0.2108 4.4138+-0.1891 might be 1.0189x faster
get-by-id-proto-or-self 14.3176+-0.5053 ? 14.5444+-0.6473 ? might be 1.0158x slower
get-by-id-quadmorphic-check-structure-elimination-simple
2.8770+-0.0244 ? 2.9467+-0.2196 ? might be 1.0242x slower
get-by-id-self-or-proto 14.9907+-0.4067 14.4217+-0.1830 might be 1.0395x faster
get-by-val-out-of-bounds 3.8903+-0.1935 ? 3.9290+-0.1666 ?
get_callee_monomorphic 2.1942+-0.0224 ? 2.3598+-0.1827 ? might be 1.0755x slower
get_callee_polymorphic 3.3834+-0.4102 3.2679+-0.1662 might be 1.0353x faster
getter-no-activation 4.8980+-0.2415 4.7859+-0.0461 might be 1.0234x faster
getter-prototype 9.7903+-0.0407 9.7812+-0.1269
getter-richards 111.8770+-6.7980 109.7151+-8.0887 might be 1.0197x faster
getter 5.5632+-1.0854 ? 5.7562+-0.9685 ? might be 1.0347x slower
global-object-access-with-mutating-structure
5.4990+-0.3501 ? 5.5385+-0.1702 ?
global-var-const-infer-fire-from-opt 0.8905+-0.3334 ? 0.9818+-0.3227 ? might be 1.1025x slower
global-var-const-infer 0.7963+-0.1160 0.7308+-0.0915 might be 1.0897x faster
HashMap-put-get-iterate-keys 26.3725+-2.9933 24.6560+-1.7447 might be 1.0696x faster
HashMap-put-get-iterate 26.4857+-0.6282 26.0379+-3.4881 might be 1.0172x faster
HashMap-string-put-get-iterate 24.7594+-1.1073 24.6116+-0.3142
hoist-make-rope 8.4910+-1.1115 ? 8.7054+-0.3044 ? might be 1.0253x slower
hoist-poly-check-structure-effectful-loop
4.1788+-0.1618 ? 4.3397+-0.3972 ? might be 1.0385x slower
hoist-poly-check-structure 3.3596+-0.0914 3.3214+-0.2146 might be 1.0115x faster
imul-double-only 6.7939+-0.4750 ? 7.6957+-3.4184 ? might be 1.1327x slower
imul-int-only 8.0528+-0.4212 ? 8.1362+-0.3284 ? might be 1.0104x slower
imul-mixed 6.7883+-0.6212 ? 6.7985+-0.7286 ?
in-four-cases 17.9020+-1.0203 ? 18.0396+-0.8050 ?
in-one-case-false 9.6515+-0.4709 9.3350+-0.1946 might be 1.0339x faster
in-one-case-true 9.3435+-0.2701 ? 9.5897+-0.5854 ? might be 1.0263x slower
in-two-cases 9.6006+-0.2639 ? 9.6505+-0.4463 ?
indexed-properties-in-objects 2.8294+-0.0441 ? 2.8736+-0.1679 ? might be 1.0156x slower
infer-closure-const-then-mov-no-inline 3.0706+-0.0711 ? 3.0843+-0.0235 ?
infer-closure-const-then-mov 17.1558+-0.8498 ? 17.2297+-0.4785 ?
infer-closure-const-then-put-to-scope-no-inline
11.7187+-0.4845 11.5814+-0.2329 might be 1.0119x faster
infer-closure-const-then-put-to-scope 21.9412+-0.3872 ? 22.3874+-1.1001 ? might be 1.0203x slower
infer-closure-const-then-reenter-no-inline
51.1894+-2.7923 50.4775+-0.8512 might be 1.0141x faster
infer-closure-const-then-reenter 21.8628+-1.0202 ? 22.5497+-0.8483 ? might be 1.0314x slower
infer-constant-global-property 3.4045+-0.0645 ? 3.4892+-0.2183 ? might be 1.0249x slower
infer-constant-property 2.6395+-0.0717 ? 2.6599+-0.1109 ?
infer-one-time-closure-ten-vars 8.4910+-0.6401 8.2740+-0.0711 might be 1.0262x faster
infer-one-time-closure-two-vars 8.2279+-0.8786 8.0695+-0.4509 might be 1.0196x faster
infer-one-time-closure 8.1662+-0.4612 7.9400+-0.3176 might be 1.0285x faster
infer-one-time-deep-closure 12.8440+-0.3560 12.7947+-0.0969
inline-arguments-access 3.6111+-0.0277 ? 3.9910+-0.6712 ? might be 1.1052x slower
inline-arguments-aliased-access 3.7323+-0.5300 3.6496+-0.0479 might be 1.0227x faster
inline-arguments-local-escape 3.6747+-0.3622 3.5471+-0.1388 might be 1.0360x faster
inline-get-scoped-var 4.7475+-0.2866 ? 4.7833+-0.2128 ?
inlined-put-by-id-transition 10.1800+-0.5413 10.0977+-0.7294
int-or-other-abs-then-get-by-val 4.9277+-0.1037 4.9095+-0.2062
int-or-other-abs-zero-then-get-by-val 16.0681+-0.1798 ? 16.8925+-1.3282 ? might be 1.0513x slower
int-or-other-add-then-get-by-val 4.1453+-0.2495 ? 4.3477+-0.7737 ? might be 1.0488x slower
int-or-other-add 4.9329+-0.1382 4.8906+-0.1180
int-or-other-div-then-get-by-val 3.6992+-0.0186 ? 3.7823+-0.1003 ? might be 1.0225x slower
int-or-other-max-then-get-by-val 4.1141+-0.2619 4.1075+-0.2795
int-or-other-min-then-get-by-val 4.0002+-0.1036 ? 4.0076+-0.0698 ?
int-or-other-mod-then-get-by-val 4.1971+-1.5502 3.5962+-0.1587 might be 1.1671x faster
int-or-other-mul-then-get-by-val 3.6850+-0.1556 3.6807+-0.2300
int-or-other-neg-then-get-by-val 4.5453+-0.0628 4.4965+-0.0764 might be 1.0108x faster
int-or-other-neg-zero-then-get-by-val 16.9505+-0.9618 16.1080+-0.5020 might be 1.0523x faster
int-or-other-sub-then-get-by-val 4.0965+-0.0829 ? 4.1602+-0.1662 ? might be 1.0156x slower
int-or-other-sub 3.4294+-0.0711 ? 3.5988+-0.6928 ? might be 1.0494x slower
int-overflow-local 4.3768+-0.1376 4.3364+-0.0600
Int16Array-alloc-long-lived 41.5735+-0.2470 ? 41.9340+-0.2652 ?
Int16Array-bubble-sort-with-byteLength 18.0026+-0.6704 17.4546+-0.0742 might be 1.0314x faster
Int16Array-bubble-sort 18.0396+-0.7140 17.9244+-0.6932
Int16Array-load-int-mul 1.4271+-0.0250 1.4128+-0.0225 might be 1.0101x faster
Int16Array-to-Int32Array-set 43.9025+-0.7663 ? 43.9420+-0.3733 ?
Int32Array-alloc-large 13.4488+-1.9227 12.5812+-0.9974 might be 1.0690x faster
Int32Array-alloc-long-lived 47.2234+-1.3629 46.9676+-0.4791
Int32Array-alloc 3.0242+-0.2044 2.8520+-0.4095 might be 1.0604x faster
Int32Array-Int8Array-view-alloc 6.3730+-0.3099 6.1794+-0.2116 might be 1.0313x faster
int52-spill 4.7095+-0.0504 4.6277+-0.1747 might be 1.0177x faster
Int8Array-alloc-long-lived 37.8190+-0.5641 37.6501+-0.4242
Int8Array-load-with-byteLength 3.6814+-0.6272 3.4052+-0.0394 might be 1.0811x faster
Int8Array-load 3.5141+-0.1616 ? 3.6225+-0.5894 ? might be 1.0308x slower
integer-divide 10.5410+-0.2708 10.5345+-0.1396
integer-modulo 1.6906+-0.1272 1.6370+-0.0543 might be 1.0327x faster
is-boolean-fold-tricky 3.7990+-0.1732 3.7748+-0.0982
is-boolean-fold 2.6460+-0.0345 2.6210+-0.0258
is-function-fold-tricky-internal-function
10.1613+-0.6169 ? 10.2540+-0.6348 ?
is-function-fold-tricky 4.1035+-0.0473 ? 4.1683+-0.1107 ? might be 1.0158x slower
is-function-fold 2.6306+-0.0461 ? 2.6603+-0.0144 ? might be 1.0113x slower
is-number-fold-tricky 4.1483+-0.3181 4.0336+-0.0685 might be 1.0284x faster
is-number-fold 2.6247+-0.0558 ? 2.6347+-0.0439 ?
is-object-or-null-fold-functions 2.6850+-0.0365 2.6661+-0.0627
is-object-or-null-fold-less-tricky 4.1434+-0.1085 4.0593+-0.0757 might be 1.0207x faster
is-object-or-null-fold-tricky 5.4694+-0.6924 5.3790+-0.1182 might be 1.0168x faster
is-object-or-null-fold 2.7084+-0.1519 2.6651+-0.0778 might be 1.0163x faster
is-object-or-null-trickier-function 4.2421+-0.2235 4.1407+-0.1268 might be 1.0245x faster
is-object-or-null-trickier-internal-function
10.7381+-0.0802 ? 10.8066+-0.2724 ?
is-object-or-null-tricky-function 4.1374+-0.2265 4.1229+-0.0695
is-object-or-null-tricky-internal-function
8.0170+-0.1021 ^ 7.7703+-0.0942 ^ definitely 1.0317x faster
is-string-fold-tricky 4.0544+-0.0539 ? 4.0830+-0.0234 ?
is-string-fold 2.6703+-0.0774 ? 2.7097+-0.2455 ? might be 1.0148x slower
is-undefined-fold-tricky 3.3063+-0.0459 ? 3.4030+-0.1776 ? might be 1.0293x slower
is-undefined-fold 2.6517+-0.0924 ? 2.7287+-0.1933 ? might be 1.0290x slower
large-int-captured 3.9443+-0.2219 ? 4.0725+-0.4048 ? might be 1.0325x slower
large-int-neg 14.1100+-0.1482 13.9017+-0.3177 might be 1.0150x faster
large-int 14.0574+-0.5634 ? 14.2667+-1.3795 ? might be 1.0149x slower
load-varargs-elimination 21.3287+-0.3804 ? 22.5045+-3.1011 ? might be 1.0551x slower
logical-not-weird-types 2.8763+-0.1448 ? 2.9423+-0.0723 ? might be 1.0229x slower
logical-not 4.3137+-0.1360 ? 4.3282+-0.1878 ?
lots-of-fields 9.2881+-0.2891 ? 9.5942+-0.8139 ? might be 1.0330x slower
make-indexed-storage 2.8361+-0.1921 ? 2.9334+-0.1857 ? might be 1.0343x slower
make-rope-cse 3.5526+-0.0097 ? 3.6516+-0.2698 ? might be 1.0278x slower
marsaglia-larger-ints 32.8149+-0.8726 32.4540+-1.3049 might be 1.0111x faster
marsaglia-osr-entry 21.2482+-0.8927 ? 21.7032+-0.3043 ? might be 1.0214x slower
math-with-out-of-bounds-array-values 22.0703+-0.7103 22.0688+-0.2293
max-boolean 2.6968+-0.1069 ? 2.7150+-0.0466 ?
method-on-number 17.6138+-0.5722 ? 18.0164+-1.1441 ? might be 1.0229x slower
min-boolean 2.7150+-0.1145 2.6466+-0.1178 might be 1.0258x faster
minus-boolean-double 3.2562+-0.3939 3.1330+-0.0617 might be 1.0393x faster
minus-boolean 2.3325+-0.0431 2.3247+-0.0377
misc-strict-eq 30.2216+-0.3339 ? 31.1416+-0.7061 ? might be 1.0304x slower
mod-boolean-double 11.2772+-0.2061 ? 11.5609+-0.5537 ? might be 1.0252x slower
mod-boolean 8.4266+-0.0555 8.3825+-0.1288
mul-boolean-double 3.6218+-0.0448 3.6191+-0.0992
mul-boolean 2.9425+-0.2510 2.8053+-0.0501 might be 1.0489x faster
neg-boolean 3.1428+-0.0872 ? 3.1545+-0.1182 ?
negative-zero-divide 0.3248+-0.0290 0.3181+-0.0073 might be 1.0209x faster
negative-zero-modulo 0.3102+-0.0093 ? 0.3309+-0.0495 ? might be 1.0665x slower
negative-zero-negate 0.2969+-0.0076 ? 0.3175+-0.0365 ? might be 1.0695x slower
nested-function-parsing 43.4650+-0.9715 ? 44.0468+-2.9912 ? might be 1.0134x slower
new-array-buffer-dead 88.7622+-0.2306 88.6266+-0.5743
new-array-buffer-push 6.0338+-0.2018 5.9204+-0.1499 might be 1.0192x faster
new-array-dead 14.7570+-0.9570 13.7540+-0.8935 might be 1.0729x faster
new-array-push 3.3917+-0.1371 ? 3.4887+-0.2795 ? might be 1.0286x slower
no-inline-constructor 30.9003+-0.1012 ? 31.8352+-2.4617 ? might be 1.0303x slower
number-test 2.9755+-0.1896 2.8355+-0.0725 might be 1.0494x faster
object-closure-call 4.8755+-0.0970 4.8148+-0.1008 might be 1.0126x faster
object-get-own-property-symbols-on-large-array
4.2015+-0.3714 3.9218+-0.3859 might be 1.0713x faster
object-test 2.6755+-0.0617 2.6234+-0.0431 might be 1.0198x faster
obvious-sink-pathology-taken 101.2598+-1.9175 100.0127+-0.1691 might be 1.0125x faster
obvious-sink-pathology 96.0794+-1.2597 95.3389+-1.1346
obviously-elidable-new-object 28.0063+-2.9332 27.5768+-2.7027 might be 1.0156x faster
plus-boolean-arith 2.5155+-0.3387 2.4147+-0.0654 might be 1.0417x faster
plus-boolean-double 3.0900+-0.1252 ? 3.1278+-0.1931 ? might be 1.0122x slower
plus-boolean 2.6046+-0.0636 2.5690+-0.0542 might be 1.0139x faster
poly-chain-access-different-prototypes-simple
3.2819+-0.1221 ? 3.3821+-0.2546 ? might be 1.0305x slower
poly-chain-access-different-prototypes 2.8660+-0.0917 ? 2.8868+-0.0864 ?
poly-chain-access-simpler 3.2675+-0.1314 ? 3.4135+-0.1091 ? might be 1.0447x slower
poly-chain-access 3.4247+-0.4846 3.2943+-0.0465 might be 1.0396x faster
poly-stricteq 50.5822+-0.1720 ? 50.5966+-1.0234 ?
polymorphic-array-call 1.2535+-0.1304 ? 1.3660+-0.4669 ? might be 1.0897x slower
polymorphic-get-by-id 2.9049+-0.1015 2.8870+-0.2276
polymorphic-put-by-id 25.2823+-1.3753 ? 25.4573+-1.1253 ?
polymorphic-structure 13.1565+-0.2775 ? 13.4051+-0.2549 ? might be 1.0189x slower
polyvariant-monomorphic-get-by-id 6.3972+-0.5008 ? 7.2760+-0.6441 ? might be 1.1374x slower
proto-getter-access 8.1420+-0.1529 8.1098+-0.2040
prototype-access-with-mutating-prototype 5.5105+-0.1039 5.4703+-0.2735
put-by-id-replace-and-transition 7.3156+-0.6418 ? 8.5057+-2.3822 ? might be 1.1627x slower
put-by-id-slightly-polymorphic 2.6802+-0.1490 ? 2.7071+-0.2766 ? might be 1.0100x slower
put-by-id 9.5447+-0.3086 ? 9.5797+-0.0845 ?
put-by-val-direct 0.3208+-0.0071 ? 0.3367+-0.0691 ? might be 1.0497x slower
put-by-val-large-index-blank-indexing-type
5.5825+-0.2697 5.5275+-0.0375
put-by-val-machine-int 2.3799+-0.2163 ? 2.5018+-0.1967 ? might be 1.0512x slower
rare-osr-exit-on-local 14.6082+-0.4175 ? 14.7549+-0.5519 ? might be 1.0100x slower
register-pressure-from-osr 16.5098+-0.4731 ? 17.1824+-2.5024 ? might be 1.0407x slower
repeat-multi-get-by-offset 22.1600+-0.1069 21.7976+-0.5485 might be 1.0166x faster
setter-prototype 8.1597+-1.7976 7.3476+-0.1534 might be 1.1105x faster
setter 5.7278+-0.5682 5.6282+-0.7011 might be 1.0177x faster
simple-activation-demo 24.7805+-0.9209 ? 26.8917+-9.0112 ? might be 1.0852x slower
simple-getter-access 10.3787+-0.1121 ? 10.5609+-0.4113 ? might be 1.0175x slower
simple-poly-call-nested 9.0065+-0.3466 8.4673+-0.4956 might be 1.0637x faster
simple-poly-call 1.2806+-0.2041 ? 1.3272+-0.1139 ? might be 1.0364x slower
sin-boolean 18.0939+-1.1833 17.7176+-1.0239 might be 1.0212x faster
singleton-scope 58.5159+-0.6226 58.1296+-0.2962
sink-function 8.9607+-0.4399 ? 9.8867+-1.1264 ? might be 1.1033x slower
sink-huge-activation 16.5263+-0.6274 ? 17.5684+-5.8159 ? might be 1.0631x slower
sinkable-new-object-dag 56.7819+-0.8681 55.7200+-1.7374 might be 1.0191x faster
sinkable-new-object-taken 43.6000+-0.5271 ? 43.8685+-3.0546 ?
sinkable-new-object 29.4683+-0.5391 ? 30.3748+-1.8943 ? might be 1.0308x slower
slow-array-profile-convergence 2.5283+-0.0845 ? 2.5414+-0.0999 ?
slow-convergence 2.4059+-0.0708 ? 2.4415+-0.0488 ? might be 1.0148x slower
slow-ternaries 17.9447+-0.7392 ? 18.0928+-0.4861 ?
sorting-benchmark 17.2123+-1.0968 ? 17.2232+-0.7246 ?
sparse-conditional 1.1472+-0.0526 1.1425+-0.0378
splice-to-remove 12.7194+-0.6260 12.4108+-0.3095 might be 1.0249x faster
string-char-code-at 15.7216+-2.7282 14.4878+-0.0856 might be 1.0852x faster
string-concat-object 2.2806+-0.5152 2.1243+-0.0876 might be 1.0736x faster
string-concat-pair-object 2.0753+-0.0606 ? 2.0829+-0.1340 ?
string-concat-pair-simple 9.7499+-1.1561 9.2743+-0.5603 might be 1.0513x faster
string-concat-simple 9.0132+-0.2008 ? 9.4243+-0.7312 ? might be 1.0456x slower
string-cons-repeat 6.5491+-0.1516 6.5002+-0.1045
string-cons-tower 6.7784+-0.0179 6.7314+-0.3514
string-equality 15.4356+-0.7737 15.4108+-0.6197
string-get-by-val-big-char 6.6782+-0.0549 6.6772+-0.1265
string-get-by-val-out-of-bounds-insane 3.3538+-0.0671 ? 3.4036+-0.1881 ? might be 1.0149x slower
string-get-by-val-out-of-bounds 4.3325+-0.4684 4.0910+-0.1360 might be 1.0590x faster
string-get-by-val 2.8041+-0.0503 2.7958+-0.0696
string-hash 1.9043+-0.1914 1.8528+-0.1253 might be 1.0278x faster
string-long-ident-equality 12.9851+-0.4882 12.6245+-0.1309 might be 1.0286x faster
string-out-of-bounds 10.5247+-0.5959 ? 10.5648+-0.6471 ?
string-repeat-arith 27.9309+-0.8506 27.6654+-0.7512
string-sub 53.6057+-0.6612 53.2411+-0.2445
string-test 2.7765+-0.0606 2.7443+-0.0845 might be 1.0117x faster
string-var-equality 26.1039+-0.9837 ? 26.8226+-0.5124 ? might be 1.0275x slower
structure-hoist-over-transitions 2.8682+-0.7464 2.4961+-0.2343 might be 1.1491x faster
substring-concat-weird 36.0753+-0.4236 35.9692+-0.4650
substring-concat 39.8434+-0.1905 39.5881+-0.7653
substring 45.4606+-0.5773 45.1267+-0.4564
switch-char-constant 2.7171+-0.1493 2.7039+-0.0915
switch-char 5.7884+-0.9033 ? 5.9066+-0.5719 ? might be 1.0204x slower
switch-constant 7.3373+-0.6961 7.1603+-0.6167 might be 1.0247x faster
switch-string-basic-big-var 15.5952+-0.1135 ? 17.5072+-5.0370 ? might be 1.1226x slower
switch-string-basic-big 15.0492+-0.2287 ? 15.1172+-0.5228 ?
switch-string-basic-var 13.3960+-0.1981 13.3311+-0.1666
switch-string-basic 13.1674+-0.5421 ? 13.3748+-0.6946 ? might be 1.0157x slower
switch-string-big-length-tower-var 18.2630+-0.7682 18.1558+-1.3322
switch-string-length-tower-var 13.2280+-0.2848 13.1790+-0.1228
switch-string-length-tower 11.9094+-0.5585 11.7681+-0.1899 might be 1.0120x faster
switch-string-short 11.7844+-0.2561 ? 12.1565+-0.6522 ? might be 1.0316x slower
switch 11.3233+-0.8330 ? 12.0585+-1.1326 ? might be 1.0649x slower
tear-off-arguments-simple 2.9579+-0.2473 ? 3.1749+-0.1875 ? might be 1.0734x slower
tear-off-arguments 4.2675+-0.3626 4.0541+-0.3540 might be 1.0526x faster
temporal-structure 12.1464+-0.1680 ? 12.1511+-0.2309 ?
to-int32-boolean 13.3193+-0.1749 ? 13.4550+-0.3960 ? might be 1.0102x slower
try-catch-get-by-val-cloned-arguments 14.2219+-0.2938 ? 14.8055+-0.6385 ? might be 1.0410x slower
try-catch-get-by-val-direct-arguments 6.5555+-0.2867 6.5004+-0.6654
try-catch-get-by-val-scoped-arguments 7.6108+-0.3731 ? 7.7600+-0.3963 ? might be 1.0196x slower
typed-array-get-set-by-val-profiling 27.5575+-0.8147 ? 28.2671+-0.7165 ? might be 1.0257x slower
undefined-property-access 228.9573+-2.7614 228.2759+-3.2179
undefined-test 2.8958+-0.0527 2.8327+-0.0474 might be 1.0223x faster
unprofiled-licm 14.7143+-1.6529 14.5198+-0.3085 might be 1.0134x faster
varargs-call 13.6003+-0.3095 13.5673+-0.2192
varargs-construct-inline 22.3518+-1.0009 21.9247+-0.2330 might be 1.0195x faster
varargs-construct 20.3560+-0.5621 ? 20.6396+-0.7666 ? might be 1.0139x slower
varargs-inline 8.5709+-0.1958 ? 8.5728+-0.1470 ?
varargs-strict-mode 9.2747+-0.4051 9.0939+-0.1043 might be 1.0199x faster
varargs 9.2289+-0.4953 ? 9.2654+-0.3837 ?
weird-inlining-const-prop 2.0995+-0.3127 2.0768+-0.1419 might be 1.0110x faster
<geometric> 7.8221+-0.0691 7.8045+-0.0549 might be 1.0022x faster
master species
Geomean of preferred means:
<scaled-result> 29.2321+-0.1248 ? 29.2646+-0.1912 ? might be 1.0011x slower
I'll add some synthetic benchmarks to js/regress to measure the performance benefit. Comment on attachment 258246 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=258246&action=review Looks pretty good! > Source/JavaScriptCore/bytecode/GetByIdStatus.cpp:82 > + // Only tiers higher than LLInt use GetById IC for op_get_by_val. > + if (instruction[0].u.opcode == LLInt::getOpcode(op_get_by_val)) > + return GetByIdStatus(NoInformation, false); > + Remove this. > Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h:2191 > + case CheckIdent: { > + AbstractValue& value = forNode(node->child1()); > + UniquedStringImpl* uid = node->uidOperand(); > + ASSERT(uid->isSymbol() ? !(value.m_type & ~SpecSymbol) : !(value.m_type & ~SpecStringIdent)); // Edge filtering should have already ensured this. > + > + JSValue childConstant = value.value(); > + if (childConstant) { > + if (uid->isSymbol()) { > + ASSERT(childConstant.isSymbol()); > + if (asSymbol(childConstant)->privateName().uid() == uid) { > + m_state.setFoundConstants(true); > + break; > + } > + } else { > + ASSERT(childConstant.isString()); > + if (asString(childConstant)->tryGetValueImpl() == uid) { > + m_state.setFoundConstants(true); > + break; > + } > + } > + } > + > + filter(value, uid->isSymbol() ? SpecSymbol : SpecStringIdent); > + break; > + } > + Why can't you just use CheckCell for the symbol case? > Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp:3416 > + GetByIdStatus getByIdStatus = GetByIdStatus::computeFor( > + m_inlineStackTop->m_profiledBlock, m_dfgCodeBlock, > + m_inlineStackTop->m_stubInfos, m_dfgStubInfos, > + currentCodeOrigin(), uid); It would be much better if the ByValInfo simply had a pointer to the StructureStubInfo rather than using the search. It just reduces confusion. > Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp:3877 > + case CheckIdent: { > + SpeculateCellOperand operand(this, node->child1()); > + UniquedStringImpl* uid = node->uidOperand(); > + if (uid->isSymbol()) { > + speculateSymbol(node->child1(), operand.gpr()); > + speculationCheck( > + BadConstantCache, JSValueSource::unboxedCell(operand.gpr()), node->child1(), > + m_jit.branchPtr( > + JITCompiler::NotEqual, > + JITCompiler::Address(operand.gpr(), Symbol::offsetOfPrivateName()), > + TrustedImmPtr(uid))); > + } else { > + speculateString(node->child1(), operand.gpr()); > + speculateStringIdent(node->child1(), operand.gpr()); > + speculationCheck( > + BadConstantCache, JSValueSource::unboxedCell(operand.gpr()), node->child1(), > + m_jit.branchPtr( > + JITCompiler::NotEqual, > + JITCompiler::Address(operand.gpr(), JSString::offsetOfValue()), > + TrustedImmPtr(uid))); > + } > + noResult(node); > + break; > + } > + This is identical to 32_64, so you should move this into a helper method in SpeculativeJIT.cpp. Created attachment 258259 [details]
Patch
WIP: added synthetic benchmarks
Comment on attachment 258246 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=258246&action=review Thank you for your review! I'll fix and add tests more! BTW, I've taken the benchmark result with the synthetic benchmark and it shows the significant performance improvement. I'll paste the data. >> Source/JavaScriptCore/bytecode/GetByIdStatus.cpp:82 >> + > > Remove this. Without it, we hit the assertion. GetByIdStatus::computeFromLLInt can be used even in the DFG layer; When there's no stubInfo or no good information in baseline JIT, we attempt to retrieve the cached data from the bytecode. But at that time, we assume the byte code structure is the same to the get_by_id's structure. For example, after this guard, we attempt to retrieve the cached Structure data by `Structure* structure = instruction[4].u.structure.get();`. However, get_by_val does not have the cached data and its byte code structure is not the same to the get_by_id, it looks up the incorrect data. So before querying the information to the byte code, we need to exit when our byte code is the op_get_by_val. >> Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h:2191 >> + > > Why can't you just use CheckCell for the symbol case? Because different Symbol cells may have the same UniquedStringImpl pointer. For example, var symbol1 = Symbol(); var object = { [symbol1]: 42 }; var symbol2 = Object.getOwnPropertySymbols(object)[0]; symbol1 === symbol2; // true In the above case, symbol1 and symbol2's cell addresses are different. But they are identical symbols and === returns true. The reason of this Symbol design is keeping the keys (UniquedStringImpl) of PropertyTable ref-counted objects. Currently, since PropertyTable does not have the GC-managed keys, GC marking for the keys of PropertyTable is not necessary. However, if we would like to ensure that the uniqued Symbol has the same cell address, we need to store JSCell into PropertyTable (because Object.getOwnPropertySymbols retrieves the stored Symbols from the PropertyTable). This is the reason why I don't use CheckCell here. But if the above is so rare, we can use CheckCell. (In that case, the identical Symbol that cell address is different from the cached one will be trapped by the Check). What do you think of? In this patch, I chose the conservative one, because it just adds the one pointer cmp. >> Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp:3416 >> + currentCodeOrigin(), uid); > > It would be much better if the ByValInfo simply had a pointer to the StructureStubInfo rather than using the search. It just reduces confusion. Make sense. I'll change it. >> Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp:3877 >> + > > This is identical to 32_64, so you should move this into a helper method in SpeculativeJIT.cpp. Yup. Fixed. Took the benchmark result with the synthetic benchmarks.
I created the synthetic benchmarks by replacing the simple property load to the keyed property load (string/symbol) in get-by-id tests.
In these synthetic benchmarks, we can see the significant improvements.
get-by-val-with-string-bimorphic-check-structure-elimination-simple
16.5967+-0.4758 ^ 2.8365+-0.0836 ^ definitely 5.8511x faster
get-by-val-with-string-bimorphic-check-structure-elimination
159.0656+-16.9380 ^ 6.1069+-0.1558 ^ definitely 26.0467x faster
get-by-val-with-string-chain-from-try-block
57.4618+-0.5759 ^ 6.0807+-0.0573 ^ definitely 9.4498x faster
get-by-val-with-string-check-structure-elimination
155.9463+-3.5247 ^ 5.1890+-0.1835 ^ definitely 30.0534x faster
get-by-val-with-string-proto-or-self 81.2487+-0.4708 ^ 15.9272+-0.6116 ^ definitely 5.1013x faster
get-by-val-with-string-quadmorphic-check-structure-elimination-simple
17.0365+-0.4200 ^ 3.1665+-0.0832 ^ definitely 5.3802x faster
get-by-val-with-string-self-or-proto 84.5067+-3.5284 ^ 15.0821+-2.8224 ^ definitely 5.6031x faster
get-by-val-with-symbol-bimorphic-check-structure-elimination-simple
20.7055+-0.2109 ^ 3.1497+-0.2031 ^ definitely 6.5738x faster
get-by-val-with-symbol-bimorphic-check-structure-elimination
214.7433+-3.2197 ^ 12.5195+-0.1043 ^ definitely 17.1528x faster
get-by-val-with-symbol-chain-from-try-block
55.7058+-0.5459 ^ 5.5362+-0.0413 ^ definitely 10.0621x faster
get-by-val-with-symbol-check-structure-elimination
216.8141+-8.4962 ^ 11.2656+-0.3372 ^ definitely 19.2457x faster
get-by-val-with-symbol-proto-or-self 86.2183+-7.0921 ^ 14.7553+-0.4601 ^ definitely 5.8432x faster
get-by-val-with-symbol-quadmorphic-check-structure-elimination-simple
21.1835+-0.6959 ^ 3.9880+-0.2135 ^ definitely 5.3118x faster
get-by-val-with-symbol-self-or-proto 84.8233+-3.3899 ^ 15.2491+-2.5444 ^ definitely 5.5625x faster
Benchmark report for SunSpider, LongSpider, V8Spider, and JSRegress on Yusukes-MacBook-Pro (MacBookPro11,3).
VMs tested:
"master" at /Users/yusukesuzuki/development/WebKit/WebKitBuild/master-for-gen3/Release/jsc
"ic" at /Users/yusukesuzuki/development/WebKit/WebKitBuild/gen3/Release/jsc
Collected 4 samples per benchmark/VM, with 4 VM invocations per benchmark. Emitted a call to gc() between sample
measurements. Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific preciseTime() function to get
microsecond-level timing. Reporting benchmark execution times with 95% confidence intervals in milliseconds.
master ic
SunSpider:
3d-cube 4.5061+-0.1864 4.4308+-0.0950 might be 1.0170x faster
3d-morph 5.2783+-0.0892 5.2742+-0.1140
3d-raytrace 5.4130+-0.3892 5.2312+-0.2109 might be 1.0347x faster
access-binary-trees 1.9473+-0.1193 ? 2.0628+-0.0647 ? might be 1.0593x slower
access-fannkuch 5.4220+-0.2670 ? 5.4478+-0.2469 ?
access-nbody 2.4488+-0.0185 ? 2.5257+-0.0912 ? might be 1.0314x slower
access-nsieve 3.0256+-0.1036 ? 3.0655+-0.2050 ? might be 1.0132x slower
bitops-3bit-bits-in-byte 1.4593+-0.0224 ? 1.4597+-0.0374 ?
bitops-bits-in-byte 3.3196+-0.1149 ? 3.3661+-0.1493 ? might be 1.0140x slower
bitops-bitwise-and 2.0109+-0.0248 ? 2.1132+-0.3029 ? might be 1.0509x slower
bitops-nsieve-bits 2.9825+-0.0947 2.9686+-0.0783
controlflow-recursive 2.0908+-0.1971 2.0790+-0.1711
crypto-aes 3.8330+-0.0975 ? 3.9208+-0.3324 ? might be 1.0229x slower
crypto-md5 2.5238+-0.0927 2.5103+-0.1317
crypto-sha1 2.4263+-0.2911 ? 2.4716+-0.2807 ? might be 1.0186x slower
date-format-tofte 6.8016+-0.5178 ? 7.0287+-0.3892 ? might be 1.0334x slower
date-format-xparb 4.5285+-0.0452 ? 4.6973+-0.1302 ? might be 1.0373x slower
math-cordic 2.7971+-0.0713 ? 2.7977+-0.0328 ?
math-partial-sums 5.3138+-0.1713 5.2889+-0.2971
math-spectral-norm 1.8542+-0.0551 1.8389+-0.1132
regexp-dna 6.6273+-0.2131 6.4658+-0.4476 might be 1.0250x faster
string-base64 4.3295+-0.1128 ? 4.5088+-0.1876 ? might be 1.0414x slower
string-fasta 5.8812+-0.6335 ? 6.1553+-1.0152 ? might be 1.0466x slower
string-tagcloud 8.3981+-0.5528 8.1196+-0.1045 might be 1.0343x faster
string-unpack-code 20.1628+-0.6362 ! 22.3915+-1.1593 ! definitely 1.1105x slower
string-validate-input 4.6333+-0.4851 ? 4.6422+-0.4175 ?
<arithmetic> 4.6160+-0.0478 ! 4.7255+-0.0474 ! definitely 1.0237x slower
master ic
LongSpider:
3d-cube 791.0432+-18.5779 788.4193+-10.8144
3d-morph 1543.2888+-17.4282 ? 1546.7055+-31.8569 ?
3d-raytrace 640.7548+-10.3491 ? 643.8240+-28.9444 ?
access-binary-trees 822.7232+-12.2385 807.9534+-10.7356 might be 1.0183x faster
access-fannkuch 279.8994+-3.2449 ? 282.3763+-4.7996 ?
access-nbody 522.4695+-9.6376 ? 525.7476+-13.2838 ?
access-nsieve 359.7466+-23.5464 ? 365.9318+-18.9876 ? might be 1.0172x slower
bitops-3bit-bits-in-byte 40.4962+-0.2546 ? 40.6217+-0.4088 ?
bitops-bits-in-byte 84.7415+-9.5191 81.1366+-2.9425 might be 1.0444x faster
bitops-nsieve-bits 415.5988+-7.9518 ? 416.1710+-4.7352 ?
controlflow-recursive 426.4429+-6.6786 ? 433.5562+-8.6467 ? might be 1.0167x slower
crypto-aes 594.7900+-8.5788 593.7809+-8.1703
crypto-md5 487.3068+-20.9533 484.4505+-6.5202
crypto-sha1 660.2870+-21.6250 655.1801+-20.3008
date-format-tofte 522.1642+-8.7396 ? 529.1572+-51.1482 ? might be 1.0134x slower
date-format-xparb 643.4039+-9.2441 ? 647.6032+-17.4016 ?
hash-map 156.0631+-1.7168 155.4410+-3.5298
math-cordic 500.4175+-7.1873 ? 505.8081+-19.4932 ? might be 1.0108x slower
math-partial-sums 501.2220+-2.0337 ? 507.3282+-7.7805 ? might be 1.0122x slower
math-spectral-norm 563.5121+-3.4513 561.7708+-4.6388
string-base64 353.7440+-10.2550 ? 356.0417+-7.2752 ?
string-fasta 373.7512+-9.1677 368.3592+-11.2935 might be 1.0146x faster
string-tagcloud 183.1396+-3.3564 182.4936+-3.8331
<geometric> 400.0236+-1.5609 ? 400.0934+-2.3883 ? might be 1.0002x slower
master ic
V8Spider:
crypto 50.9653+-3.5288 50.0366+-1.8741 might be 1.0186x faster
deltablue 83.9847+-3.3590 ? 86.1243+-4.7579 ? might be 1.0255x slower
earley-boyer 40.6653+-1.4962 39.5864+-0.5821 might be 1.0273x faster
raytrace 29.6778+-1.3322 29.4772+-0.2173
regexp 63.1942+-1.0416 63.1226+-1.2123
richards 71.0677+-2.9372 ? 71.0881+-2.8129 ?
splay 35.3669+-2.2527 34.8724+-2.2875 might be 1.0142x faster
<geometric> 50.3361+-0.7549 50.0407+-0.5679 might be 1.0059x faster
master ic
JSRegress:
abc-forward-loop-equal 30.0537+-1.0779 ? 30.8722+-2.6802 ? might be 1.0272x slower
abc-postfix-backward-loop 29.6234+-1.0561 29.5703+-0.9807
abc-simple-backward-loop 29.1990+-0.5233 29.1407+-0.8259
abc-simple-forward-loop 29.0687+-0.6981 29.0257+-0.5424
abc-skippy-loop 21.4830+-1.0857 ? 22.6586+-4.8729 ? might be 1.0547x slower
abs-boolean 2.4900+-0.0967 2.4585+-0.0491 might be 1.0128x faster
adapt-to-double-divide 16.6475+-0.9396 ? 16.6955+-1.5213 ?
aliased-arguments-getbyval 1.1654+-0.1319 1.1520+-0.1280 might be 1.0117x faster
allocate-big-object 2.5038+-0.5076 ? 2.5396+-0.4717 ? might be 1.0143x slower
arguments-named-and-reflective 11.0630+-0.4240 10.9445+-0.2442 might be 1.0108x faster
arguments-out-of-bounds 10.0179+-0.5013 9.8790+-0.5402 might be 1.0141x faster
arguments-strict-mode 9.5928+-0.6278 9.5662+-0.0833
arguments 8.7693+-0.8023 8.7657+-0.7788
arity-mismatch-inlining 0.7955+-0.0473 ? 0.8185+-0.0716 ? might be 1.0288x slower
array-access-polymorphic-structure 6.0287+-0.5458 5.8382+-0.1530 might be 1.0326x faster
array-nonarray-polymorhpic-access 25.3541+-0.9062 25.2221+-1.6841
array-prototype-every 76.1805+-1.5767 ? 78.7808+-5.4329 ? might be 1.0341x slower
array-prototype-forEach 75.7393+-3.6781 ? 75.9307+-1.6564 ?
array-prototype-map 84.3550+-2.1620 82.4070+-0.7841 might be 1.0236x faster
array-prototype-reduce 72.3664+-2.9269 72.0828+-0.8172
array-prototype-reduceRight 72.2051+-4.3792 ? 73.5477+-3.6403 ? might be 1.0186x slower
array-prototype-some 76.4762+-2.4698 ? 77.2705+-0.6471 ? might be 1.0104x slower
array-splice-contiguous 22.9786+-3.1169 21.5265+-0.7571 might be 1.0675x faster
array-with-double-add 3.4945+-0.2549 3.4141+-0.1009 might be 1.0236x faster
array-with-double-increment 3.3145+-0.7887 3.0610+-0.0649 might be 1.0828x faster
array-with-double-mul-add 4.2083+-0.0950 4.1967+-0.1417
array-with-double-sum 3.2417+-0.1797 ? 3.2692+-0.3362 ?
array-with-int32-add-sub 5.9650+-0.1307 5.9304+-0.1315
array-with-int32-or-double-sum 3.3198+-0.2409 3.3042+-0.2380
ArrayBuffer-DataView-alloc-large-long-lived
27.0820+-0.7209 ? 28.6622+-3.1633 ? might be 1.0583x slower
ArrayBuffer-DataView-alloc-long-lived 12.8344+-1.2304 12.6420+-0.4090 might be 1.0152x faster
ArrayBuffer-Int32Array-byteOffset 3.6450+-0.1004 ? 3.6862+-0.1385 ? might be 1.0113x slower
ArrayBuffer-Int8Array-alloc-large-long-lived
27.3160+-0.7655 ? 27.9276+-0.7288 ? might be 1.0224x slower
ArrayBuffer-Int8Array-alloc-long-lived-buffer
20.5570+-0.5047 ? 20.6299+-0.3587 ?
ArrayBuffer-Int8Array-alloc-long-lived 12.1424+-1.2470 12.1045+-0.5368
ArrayBuffer-Int8Array-alloc 10.4152+-0.1982 ? 10.6712+-2.2444 ? might be 1.0246x slower
asmjs_bool_bug 7.2469+-0.1494 ? 7.3589+-0.6257 ? might be 1.0155x slower
assign-custom-setter-polymorphic 2.7024+-0.1577 2.5838+-0.1474 might be 1.0459x faster
assign-custom-setter 3.5137+-0.0265 3.4824+-0.1230
basic-set 8.0480+-0.5031 ? 8.2711+-0.6938 ? might be 1.0277x slower
big-int-mul 3.4704+-0.1283 ? 3.5745+-0.4285 ? might be 1.0300x slower
boolean-test 2.8940+-0.1724 ? 2.9016+-0.1789 ?
branch-fold 3.6278+-0.1051 3.6093+-0.0419
branch-on-string-as-boolean 17.0270+-1.0520 16.2050+-1.2806 might be 1.0507x faster
by-val-generic 7.0802+-0.1136 ^ 6.1342+-0.0995 ^ definitely 1.1542x faster
call-spread-apply 26.9998+-1.5464 ? 27.1991+-0.7522 ?
call-spread-call 21.3356+-0.4643 ? 21.4627+-0.4815 ?
captured-assignments 0.4048+-0.0104 ? 0.5085+-0.1280 ? might be 1.2563x slower
cast-int-to-double 5.1025+-0.1124 ? 5.1614+-0.1056 ? might be 1.0115x slower
cell-argument 6.7629+-0.7433 6.3916+-0.0759 might be 1.0581x faster
cfg-simplify 2.8324+-0.0827 2.7885+-0.0717 might be 1.0158x faster
chain-getter-access 8.0778+-0.1365 ? 8.1362+-0.2567 ?
cmpeq-obj-to-obj-other 11.6960+-2.5012 ? 11.8879+-0.6519 ? might be 1.0164x slower
constant-test 4.9355+-0.1876 ? 4.9589+-0.2609 ?
create-lots-of-functions 9.5223+-0.9009 9.3412+-1.1892 might be 1.0194x faster
cse-new-array-buffer 2.1813+-0.3114 ? 2.2402+-0.2245 ? might be 1.0270x slower
cse-new-array 2.2167+-0.1193 ? 2.3522+-0.2272 ? might be 1.0611x slower
DataView-custom-properties 31.7247+-0.3670 ? 32.2556+-0.5026 ? might be 1.0167x slower
delay-tear-off-arguments-strictmode 12.6840+-0.2121 12.6255+-0.4939
deltablue-varargs 150.7839+-3.9880 148.8137+-2.0582 might be 1.0132x faster
destructuring-arguments 172.5414+-9.0393 170.3826+-2.7860 might be 1.0127x faster
destructuring-parameters-overridden-by-function
0.4373+-0.0290 0.4166+-0.0227 might be 1.0495x faster
destructuring-swap 4.8110+-0.1423 4.7805+-0.0710
direct-arguments-getbyval 1.3237+-0.6213 1.0981+-0.0561 might be 1.2054x faster
div-boolean-double 5.4883+-0.1495 5.4247+-0.0643 might be 1.0117x faster
div-boolean 8.3151+-0.2006 8.2507+-0.0405
double-get-by-val-out-of-bounds 4.2078+-0.2162 ? 4.2740+-0.1251 ? might be 1.0157x slower
double-pollution-getbyval 8.8814+-0.4869 8.8245+-0.1171
double-pollution-putbyoffset 3.7744+-0.0997 ? 3.8420+-0.2035 ? might be 1.0179x slower
double-real-use 28.8740+-4.3833 27.4067+-3.2338 might be 1.0535x faster
double-to-int32-typed-array-no-inline 2.0283+-0.0312 ? 2.1310+-0.1465 ? might be 1.0507x slower
double-to-int32-typed-array 1.8045+-0.1948 1.7753+-0.0557 might be 1.0165x faster
double-to-uint32-typed-array-no-inline 2.1562+-0.0357 ? 2.1646+-0.1683 ?
double-to-uint32-typed-array 1.8292+-0.0430 ? 1.8865+-0.1087 ? might be 1.0314x slower
elidable-new-object-dag 33.4952+-0.4722 ? 33.5610+-0.5642 ?
elidable-new-object-roflcopter 32.9953+-0.6405 ? 33.0920+-0.9969 ?
elidable-new-object-then-call 31.5687+-1.0288 31.3320+-0.1586
elidable-new-object-tree 36.0278+-1.1210 35.7741+-0.2702
empty-string-plus-int 4.7555+-0.1532 ? 4.8630+-0.2076 ? might be 1.0226x slower
emscripten-cube2hash 25.5869+-2.0357 ? 27.3534+-2.8877 ? might be 1.0690x slower
exit-length-on-plain-object 12.6803+-0.1499 12.6462+-0.3039
external-arguments-getbyval 1.2192+-0.0906 1.2120+-0.2899
external-arguments-putbyval 2.1339+-0.0597 ? 2.1469+-0.1509 ?
fixed-typed-array-storage-var-index 1.1711+-0.0348 ? 1.1755+-0.0432 ?
fixed-typed-array-storage 0.8570+-0.0375 ? 0.8647+-0.0615 ?
Float32Array-matrix-mult 3.8823+-0.0342 ? 3.9951+-0.2986 ? might be 1.0291x slower
Float32Array-to-Float64Array-set 46.4118+-0.4951 45.8417+-0.5012 might be 1.0124x faster
Float64Array-alloc-long-lived 63.9164+-21.2429 57.6821+-1.0872 might be 1.1081x faster
Float64Array-to-Int16Array-set 56.0638+-0.5899 ? 57.0617+-0.7873 ? might be 1.0178x slower
fold-double-to-int 12.7698+-0.2738 ? 12.8621+-0.3174 ?
fold-get-by-id-to-multi-get-by-offset-rare-int
10.3785+-0.6380 10.3499+-0.9452
fold-get-by-id-to-multi-get-by-offset 9.4462+-1.0353 9.3065+-0.3964 might be 1.0150x faster
fold-multi-get-by-offset-to-get-by-offset
8.2914+-0.7147 8.0195+-1.7515 might be 1.0339x faster
fold-multi-get-by-offset-to-poly-get-by-offset
8.5839+-0.3509 8.2466+-1.1053 might be 1.0409x faster
fold-multi-put-by-offset-to-poly-put-by-offset
7.9665+-0.8602 ? 8.1009+-1.2228 ? might be 1.0169x slower
fold-multi-put-by-offset-to-put-by-offset
5.7908+-0.7895 5.4766+-1.0657 might be 1.0574x faster
fold-multi-put-by-offset-to-replace-or-transition-put-by-offset
8.6194+-1.1897 8.1522+-0.3775 might be 1.0573x faster
fold-put-by-id-to-multi-put-by-offset 8.9785+-0.8859 ? 9.1616+-0.6681 ? might be 1.0204x slower
fold-put-structure 5.5519+-0.3904 ? 5.8249+-1.3497 ? might be 1.0492x slower
for-of-iterate-array-entries 11.9767+-0.9750 11.7587+-0.2991 might be 1.0185x faster
for-of-iterate-array-keys 3.3994+-0.2595 3.2938+-0.1204 might be 1.0321x faster
for-of-iterate-array-values 3.2826+-0.0966 ? 3.3901+-0.2182 ? might be 1.0328x slower
fround 18.4531+-1.1817 ? 18.9709+-1.2117 ? might be 1.0281x slower
ftl-library-inlining-dataview 57.4711+-2.0469 ? 58.7903+-3.9333 ? might be 1.0230x slower
ftl-library-inlining 109.3882+-3.8830 ? 110.6230+-1.9971 ? might be 1.0113x slower
function-dot-apply 1.9760+-0.0364 ? 2.0642+-0.1285 ? might be 1.0447x slower
function-test 3.1268+-0.8564 2.7007+-0.0672 might be 1.1577x faster
function-with-eval 99.2381+-6.1207 ? 100.0663+-0.8504 ?
gcse-poly-get-less-obvious 14.3934+-0.1825 ? 14.6484+-0.7170 ? might be 1.0177x slower
gcse-poly-get 14.8282+-1.1272 14.3573+-0.2533 might be 1.0328x faster
gcse 3.9464+-0.2146 3.8522+-0.1461 might be 1.0244x faster
get-by-id-bimorphic-check-structure-elimination-simple
2.6003+-0.0273 ? 2.6581+-0.1065 ? might be 1.0222x slower
get-by-id-bimorphic-check-structure-elimination
5.9382+-0.0713 ? 6.0562+-0.4375 ? might be 1.0199x slower
get-by-id-chain-from-try-block 5.7463+-0.6255 5.6213+-0.1595 might be 1.0222x faster
get-by-id-check-structure-elimination 4.4406+-0.1237 ? 4.4449+-0.1763 ?
get-by-id-proto-or-self 14.9828+-1.2209 ? 15.1975+-2.5202 ? might be 1.0143x slower
get-by-id-quadmorphic-check-structure-elimination-simple
2.8806+-0.0280 2.8749+-0.0572
get-by-id-self-or-proto 14.8922+-0.5601 ? 14.9418+-1.3630 ?
get-by-val-out-of-bounds 3.9588+-0.1057 ? 4.0720+-0.1623 ? might be 1.0286x slower
get-by-val-with-string-bimorphic-check-structure-elimination-simple
16.5967+-0.4758 ^ 2.8365+-0.0836 ^ definitely 5.8511x faster
get-by-val-with-string-bimorphic-check-structure-elimination
159.0656+-16.9380 ^ 6.1069+-0.1558 ^ definitely 26.0467x faster
get-by-val-with-string-chain-from-try-block
57.4618+-0.5759 ^ 6.0807+-0.0573 ^ definitely 9.4498x faster
get-by-val-with-string-check-structure-elimination
155.9463+-3.5247 ^ 5.1890+-0.1835 ^ definitely 30.0534x faster
get-by-val-with-string-proto-or-self 81.2487+-0.4708 ^ 15.9272+-0.6116 ^ definitely 5.1013x faster
get-by-val-with-string-quadmorphic-check-structure-elimination-simple
17.0365+-0.4200 ^ 3.1665+-0.0832 ^ definitely 5.3802x faster
get-by-val-with-string-self-or-proto 84.5067+-3.5284 ^ 15.0821+-2.8224 ^ definitely 5.6031x faster
get-by-val-with-symbol-bimorphic-check-structure-elimination-simple
20.7055+-0.2109 ^ 3.1497+-0.2031 ^ definitely 6.5738x faster
get-by-val-with-symbol-bimorphic-check-structure-elimination
214.7433+-3.2197 ^ 12.5195+-0.1043 ^ definitely 17.1528x faster
get-by-val-with-symbol-chain-from-try-block
55.7058+-0.5459 ^ 5.5362+-0.0413 ^ definitely 10.0621x faster
get-by-val-with-symbol-check-structure-elimination
216.8141+-8.4962 ^ 11.2656+-0.3372 ^ definitely 19.2457x faster
get-by-val-with-symbol-proto-or-self 86.2183+-7.0921 ^ 14.7553+-0.4601 ^ definitely 5.8432x faster
get-by-val-with-symbol-quadmorphic-check-structure-elimination-simple
21.1835+-0.6959 ^ 3.9880+-0.2135 ^ definitely 5.3118x faster
get-by-val-with-symbol-self-or-proto 84.8233+-3.3899 ^ 15.2491+-2.5444 ^ definitely 5.5625x faster
get_callee_monomorphic 2.3127+-0.4509 2.3068+-0.1076
get_callee_polymorphic 3.1740+-0.1884 ? 3.1942+-0.2252 ?
getter-no-activation 4.9962+-0.3830 ? 5.1016+-0.4321 ? might be 1.0211x slower
getter-prototype 9.7526+-0.1497 ? 10.0040+-0.2550 ? might be 1.0258x slower
getter-richards 113.8470+-7.6272 ? 115.1240+-4.5420 ? might be 1.0112x slower
getter 5.7007+-0.4479 5.4846+-0.4917 might be 1.0394x faster
global-object-access-with-mutating-structure
5.4905+-0.3229 5.4680+-0.3865
global-var-const-infer-fire-from-opt 0.8808+-0.0609 ? 0.8958+-0.1397 ? might be 1.0170x slower
global-var-const-infer 0.8923+-0.2494 0.6699+-0.0536 might be 1.3320x faster
HashMap-put-get-iterate-keys 25.5889+-1.1357 ? 26.6037+-1.0487 ? might be 1.0397x slower
HashMap-put-get-iterate 26.9578+-1.3875 26.0773+-0.8283 might be 1.0338x faster
HashMap-string-put-get-iterate 24.5955+-0.7787 ? 25.2663+-1.5949 ? might be 1.0273x slower
hoist-make-rope 8.3801+-1.6270 8.0985+-1.1184 might be 1.0348x faster
hoist-poly-check-structure-effectful-loop
4.4520+-0.2683 4.2322+-0.0863 might be 1.0519x faster
hoist-poly-check-structure 3.2402+-0.0413 ? 3.2536+-0.0973 ?
imul-double-only 6.7079+-0.3280 6.5486+-0.1276 might be 1.0243x faster
imul-int-only 8.6476+-2.0182 8.5016+-1.5223 might be 1.0172x faster
imul-mixed 7.0402+-0.6620 6.3264+-0.1927 might be 1.1128x faster
in-four-cases 17.7960+-0.6873 17.6276+-0.7162
in-one-case-false 9.3752+-0.3104 9.2017+-0.4216 might be 1.0189x faster
in-one-case-true 9.4937+-0.7693 9.2600+-0.3349 might be 1.0252x faster
in-two-cases 9.5584+-0.2559 ? 9.6278+-0.2096 ?
indexed-properties-in-objects 2.8907+-0.1358 2.7913+-0.0470 might be 1.0356x faster
infer-closure-const-then-mov-no-inline 3.2858+-0.4467 3.1042+-0.2231 might be 1.0585x faster
infer-closure-const-then-mov 17.1546+-0.7240 ? 17.3882+-0.3568 ? might be 1.0136x slower
infer-closure-const-then-put-to-scope-no-inline
11.8483+-0.5653 11.5943+-0.2568 might be 1.0219x faster
infer-closure-const-then-put-to-scope 22.0144+-0.3175 ? 22.0267+-0.7505 ?
infer-closure-const-then-reenter-no-inline
50.4915+-0.3229 ? 50.7253+-1.1495 ?
infer-closure-const-then-reenter 22.5633+-0.3557 21.8904+-0.8214 might be 1.0307x faster
infer-constant-global-property 3.4335+-0.1306 3.4108+-0.0543
infer-constant-property 2.6550+-0.2005 ? 2.7490+-0.1966 ? might be 1.0354x slower
infer-one-time-closure-ten-vars 8.3107+-0.3889 ? 8.3748+-0.5453 ?
infer-one-time-closure-two-vars 8.1473+-0.9840 8.0375+-0.7708 might be 1.0137x faster
infer-one-time-closure 8.0068+-0.3677 7.7707+-0.2177 might be 1.0304x faster
infer-one-time-deep-closure 12.7358+-0.0553 ? 12.9529+-0.4200 ? might be 1.0170x slower
inline-arguments-access 3.7807+-0.4762 3.6426+-0.2422 might be 1.0379x faster
inline-arguments-aliased-access 3.9130+-0.6915 3.8362+-0.5006 might be 1.0200x faster
inline-arguments-local-escape 3.5757+-0.1683 ? 3.7398+-0.4702 ? might be 1.0459x slower
inline-get-scoped-var 4.6948+-0.1002 ? 4.8898+-0.8955 ? might be 1.0415x slower
inlined-put-by-id-transition 10.2622+-0.3160 ? 10.5986+-1.0593 ? might be 1.0328x slower
int-or-other-abs-then-get-by-val 4.8037+-0.0530 ? 4.8188+-0.0252 ?
int-or-other-abs-zero-then-get-by-val 16.6164+-0.1879 16.3861+-1.5570 might be 1.0141x faster
int-or-other-add-then-get-by-val 4.0724+-0.0433 ? 4.1166+-0.1935 ? might be 1.0109x slower
int-or-other-add 5.0552+-0.5491 4.9098+-0.2256 might be 1.0296x faster
int-or-other-div-then-get-by-val 3.7727+-0.0809 ? 3.8228+-0.0599 ? might be 1.0133x slower
int-or-other-max-then-get-by-val 4.0409+-0.0730 ? 4.0650+-0.1192 ?
int-or-other-min-then-get-by-val 4.1051+-0.2752 4.0048+-0.0719 might be 1.0251x faster
int-or-other-mod-then-get-by-val 3.8770+-0.9322 3.6398+-0.1658 might be 1.0651x faster
int-or-other-mul-then-get-by-val 3.8525+-0.4743 3.7280+-0.1258 might be 1.0334x faster
int-or-other-neg-then-get-by-val 4.5042+-0.1179 ? 4.5272+-0.0338 ?
int-or-other-neg-zero-then-get-by-val 16.3231+-0.4250 16.2153+-0.3164
int-or-other-sub-then-get-by-val 4.1186+-0.0455 ? 4.1513+-0.1132 ?
int-or-other-sub 3.4278+-0.1080 3.3870+-0.0212 might be 1.0121x faster
int-overflow-local 4.4594+-0.3225 4.3752+-0.1315 might be 1.0192x faster
Int16Array-alloc-long-lived 41.8088+-0.7015 41.6959+-0.3545
Int16Array-bubble-sort-with-byteLength 17.6238+-0.6352 ? 17.8835+-0.5579 ? might be 1.0147x slower
Int16Array-bubble-sort 18.1519+-0.4862 17.7014+-0.4270 might be 1.0254x faster
Int16Array-load-int-mul 1.4247+-0.0263 1.4186+-0.0388
Int16Array-to-Int32Array-set 43.4698+-0.2966 ? 44.3127+-2.5445 ? might be 1.0194x slower
Int32Array-alloc-large 12.2001+-0.4898 12.1370+-0.6324
Int32Array-alloc-long-lived 47.6998+-1.7815 ? 47.9178+-2.6621 ?
Int32Array-alloc 2.9587+-0.2623 2.9166+-0.2946 might be 1.0144x faster
Int32Array-Int8Array-view-alloc 6.2930+-0.2934 ? 6.3657+-0.2296 ? might be 1.0116x slower
int52-spill 4.7586+-0.1909 4.6968+-0.0674 might be 1.0132x faster
Int8Array-alloc-long-lived 37.9685+-0.8420 37.6459+-1.0518
Int8Array-load-with-byteLength 3.4937+-0.2736 ? 3.5670+-0.5000 ? might be 1.0210x slower
Int8Array-load 3.4156+-0.0423 ? 3.7365+-1.0211 ? might be 1.0939x slower
integer-divide 10.7360+-0.6053 10.4426+-0.2141 might be 1.0281x faster
integer-modulo 1.6437+-0.0739 ? 1.6617+-0.0606 ? might be 1.0109x slower
is-boolean-fold-tricky 3.7881+-0.1034 3.7656+-0.0700
is-boolean-fold 2.6248+-0.0830 2.6185+-0.0105
is-function-fold-tricky-internal-function
9.8317+-0.1052 ! 10.0838+-0.1151 ! definitely 1.0256x slower
is-function-fold-tricky 4.0807+-0.0288 ? 4.0965+-0.0800 ?
is-function-fold 2.6817+-0.1773 ? 2.7688+-0.4204 ? might be 1.0325x slower
is-number-fold-tricky 4.0207+-0.0586 ? 4.0362+-0.1637 ?
is-number-fold 2.6602+-0.0660 2.6113+-0.0343 might be 1.0187x faster
is-object-or-null-fold-functions 2.6815+-0.0736 ? 2.7150+-0.1834 ? might be 1.0125x slower
is-object-or-null-fold-less-tricky 4.1033+-0.0823 ? 4.1922+-0.2337 ? might be 1.0217x slower
is-object-or-null-fold-tricky 5.5417+-0.5189 5.4083+-0.1927 might be 1.0247x faster
is-object-or-null-fold 2.6960+-0.1037 2.6714+-0.1028
is-object-or-null-trickier-function 4.1300+-0.0618 ? 4.1743+-0.1322 ? might be 1.0107x slower
is-object-or-null-trickier-internal-function
10.8643+-0.8544 10.7941+-0.5771
is-object-or-null-tricky-function 4.1400+-0.1339 4.1337+-0.1506
is-object-or-null-tricky-internal-function
7.9790+-0.1140 ^ 7.7640+-0.0825 ^ definitely 1.0277x faster
is-string-fold-tricky 4.0426+-0.1271 ? 4.0930+-0.2263 ? might be 1.0125x slower
is-string-fold 2.5998+-0.0576 ? 2.6743+-0.1711 ? might be 1.0287x slower
is-undefined-fold-tricky 3.3176+-0.0724 ? 3.3867+-0.1158 ? might be 1.0208x slower
is-undefined-fold 2.6765+-0.0882 ? 2.7340+-0.2361 ? might be 1.0215x slower
large-int-captured 4.0942+-0.4224 ? 4.1098+-0.3132 ?
large-int-neg 14.3474+-0.3727 14.1842+-0.7061 might be 1.0115x faster
large-int 14.5178+-2.3199 13.7233+-0.2817 might be 1.0579x faster
load-varargs-elimination 21.3078+-0.6497 ? 22.1442+-2.9163 ? might be 1.0393x slower
logical-not-weird-types 2.9006+-0.1517 ? 3.0139+-0.1267 ? might be 1.0391x slower
logical-not 4.2464+-0.2003 ? 4.3265+-0.0365 ? might be 1.0189x slower
lots-of-fields 9.3025+-0.9719 ? 9.4965+-0.5661 ? might be 1.0209x slower
make-indexed-storage 2.9373+-0.2004 ? 3.1711+-0.6658 ? might be 1.0796x slower
make-rope-cse 3.5499+-0.0612 ? 3.6827+-0.2377 ? might be 1.0374x slower
marsaglia-larger-ints 32.7367+-1.0159 32.2327+-0.7716 might be 1.0156x faster
marsaglia-osr-entry 21.6396+-0.4231 21.5110+-0.6586
math-with-out-of-bounds-array-values 22.5603+-1.7020 21.7775+-0.7220 might be 1.0359x faster
max-boolean 2.8182+-0.1344 2.7590+-0.1328 might be 1.0215x faster
method-on-number 17.6478+-0.5618 17.3157+-0.3655 might be 1.0192x faster
min-boolean 2.8058+-0.3906 2.6862+-0.0725 might be 1.0446x faster
minus-boolean-double 3.3328+-0.7726 3.1166+-0.1780 might be 1.0693x faster
minus-boolean 2.3170+-0.0319 ? 2.3920+-0.1255 ? might be 1.0324x slower
misc-strict-eq 31.7790+-3.7257 ? 32.2416+-4.7732 ? might be 1.0146x slower
mod-boolean-double 11.6855+-0.6673 11.2781+-0.2680 might be 1.0361x faster
mod-boolean 8.3864+-0.1013 ? 8.4064+-0.1041 ?
mul-boolean-double 3.6141+-0.0955 ? 3.6227+-0.1202 ?
mul-boolean 2.8126+-0.1273 2.7705+-0.0136 might be 1.0152x faster
neg-boolean 3.1097+-0.0249 ? 3.1384+-0.1724 ?
negative-zero-divide 0.3192+-0.0056 ? 0.3385+-0.0543 ? might be 1.0604x slower
negative-zero-modulo 0.3318+-0.0560 0.3180+-0.0076 might be 1.0434x faster
negative-zero-negate 0.2996+-0.0113 ? 0.3119+-0.0725 ? might be 1.0409x slower
nested-function-parsing 43.4634+-1.6322 ? 44.4222+-1.4576 ? might be 1.0221x slower
new-array-buffer-dead 90.0935+-4.8931 88.1594+-0.6447 might be 1.0219x faster
new-array-buffer-push 5.9678+-0.5861 5.8485+-0.2375 might be 1.0204x faster
new-array-dead 14.0865+-0.9414 13.8478+-1.1052 might be 1.0172x faster
new-array-push 3.4360+-0.1723 3.3928+-0.1143 might be 1.0128x faster
no-inline-constructor 31.2711+-1.4134 30.9416+-0.3684 might be 1.0106x faster
number-test 2.8951+-0.0950 2.7813+-0.0452 might be 1.0409x faster
object-closure-call 4.8591+-0.0647 4.8211+-0.1138
object-get-own-property-symbols-on-large-array
3.9437+-0.2944 3.9195+-0.3905
object-test 2.7380+-0.2640 2.5953+-0.0614 might be 1.0550x faster
obvious-sink-pathology-taken 100.0546+-1.1161 ? 100.0757+-2.0640 ?
obvious-sink-pathology 95.4774+-1.0972 ? 95.9965+-1.4028 ?
obviously-elidable-new-object 28.7104+-0.7263 ? 28.9206+-0.9761 ?
plus-boolean-arith 2.4061+-0.0557 2.3718+-0.1084 might be 1.0145x faster
plus-boolean-double 3.1611+-0.1731 3.1190+-0.0868 might be 1.0135x faster
plus-boolean 2.5880+-0.0297 2.5385+-0.0481 might be 1.0195x faster
poly-chain-access-different-prototypes-simple
3.3421+-0.1634 3.2525+-0.1724 might be 1.0275x faster
poly-chain-access-different-prototypes 2.8566+-0.0341 ? 2.9828+-0.4111 ? might be 1.0442x slower
poly-chain-access-simpler 3.3285+-0.3143 3.2377+-0.0859 might be 1.0280x faster
poly-chain-access 3.4400+-0.3879 3.3204+-0.1759 might be 1.0360x faster
poly-stricteq 50.7266+-0.5307 50.4144+-0.6992
polymorphic-array-call 1.2325+-0.0701 1.2260+-0.1412
polymorphic-get-by-id 2.9222+-0.1934 2.8051+-0.0288 might be 1.0418x faster
polymorphic-put-by-id 25.0705+-1.0584 ? 25.3945+-0.8882 ? might be 1.0129x slower
polymorphic-structure 14.0344+-2.1259 13.4887+-0.5759 might be 1.0405x faster
polyvariant-monomorphic-get-by-id 6.6714+-0.6163 6.4736+-1.0308 might be 1.0305x faster
proto-getter-access 8.0905+-0.0882 ? 8.3773+-0.4198 ? might be 1.0354x slower
prototype-access-with-mutating-prototype 5.5437+-0.2404 5.4427+-0.2774 might be 1.0185x faster
put-by-id-replace-and-transition 7.5699+-0.4169 7.5623+-0.2603
put-by-id-slightly-polymorphic 2.6542+-0.0620 ? 2.7104+-0.2412 ? might be 1.0212x slower
put-by-id 9.8120+-0.4540 9.6747+-0.4031 might be 1.0142x faster
put-by-val-direct 0.3683+-0.1260 0.3175+-0.0133 might be 1.1601x faster
put-by-val-large-index-blank-indexing-type
5.2212+-0.1176 ? 5.2824+-0.3658 ? might be 1.0117x slower
put-by-val-machine-int 2.5113+-0.0847 ? 2.6469+-0.8582 ? might be 1.0540x slower
rare-osr-exit-on-local 14.9490+-0.7253 14.7712+-0.2161 might be 1.0120x faster
register-pressure-from-osr 16.6539+-0.3779 16.3945+-0.2223 might be 1.0158x faster
repeat-multi-get-by-offset 22.1014+-0.4708 ? 22.1138+-1.0625 ?
setter-prototype 7.4880+-0.2751 7.4642+-0.3362
setter 5.5328+-0.6193 5.2954+-0.2147 might be 1.0448x faster
simple-activation-demo 24.7289+-1.0662 ? 25.1277+-0.2314 ? might be 1.0161x slower
simple-getter-access 10.4507+-0.2909 10.4015+-0.2182
simple-poly-call-nested 8.3712+-0.5018 ? 8.4255+-0.3781 ?
simple-poly-call 1.2905+-0.1821 1.2588+-0.0562 might be 1.0252x faster
sin-boolean 18.7183+-2.1584 17.8596+-0.8745 might be 1.0481x faster
singleton-scope 58.1535+-0.2038 ? 58.2785+-0.3933 ?
sink-function 9.5920+-0.7913 ? 9.7534+-1.5597 ? might be 1.0168x slower
sink-huge-activation 16.6191+-0.4560 16.0523+-0.6541 might be 1.0353x faster
sinkable-new-object-dag 56.3972+-2.1846 55.3115+-1.2717 might be 1.0196x faster
sinkable-new-object-taken 43.3087+-0.5820 42.5683+-1.1931 might be 1.0174x faster
sinkable-new-object 29.2473+-0.3695 ? 29.7477+-0.7806 ? might be 1.0171x slower
slow-array-profile-convergence 2.4986+-0.0866 ? 2.5920+-0.1790 ? might be 1.0374x slower
slow-convergence 2.4487+-0.1562 ? 2.5582+-0.2740 ? might be 1.0447x slower
slow-ternaries 18.6605+-1.6760 18.0271+-0.5941 might be 1.0351x faster
sorting-benchmark 17.6808+-0.3586 17.3516+-1.1010 might be 1.0190x faster
sparse-conditional 1.1463+-0.0445 1.1072+-0.0240 might be 1.0353x faster
splice-to-remove 12.8918+-0.6147 12.5009+-0.7072 might be 1.0313x faster
string-char-code-at 14.5019+-0.4601 14.4352+-0.1246
string-concat-object 2.0878+-0.1212 ? 2.1030+-0.1848 ?
string-concat-pair-object 2.0812+-0.1967 2.0726+-0.2272
string-concat-pair-simple 9.2979+-0.3359 9.1434+-0.4280 might be 1.0169x faster
string-concat-simple 8.9615+-0.2060 ? 9.7712+-1.4786 ? might be 1.0904x slower
string-cons-repeat 6.5225+-0.2409 ? 6.9440+-1.5579 ? might be 1.0646x slower
string-cons-tower 6.6834+-0.2593 ? 6.8284+-0.3455 ? might be 1.0217x slower
string-equality 15.3698+-0.1808 ? 15.5172+-0.3100 ?
string-get-by-val-big-char 6.8362+-0.0975 6.6856+-0.2136 might be 1.0225x faster
string-get-by-val-out-of-bounds-insane 3.4365+-0.1759 ? 3.9693+-1.1782 ? might be 1.1550x slower
string-get-by-val-out-of-bounds 4.1465+-0.0926 ? 4.3064+-0.4937 ? might be 1.0386x slower
string-get-by-val 2.8103+-0.0557 ? 2.8831+-0.1181 ? might be 1.0259x slower
string-hash 1.8105+-0.0190 ? 1.8584+-0.0767 ? might be 1.0265x slower
string-long-ident-equality 12.9005+-0.2755 12.7304+-0.0614 might be 1.0134x faster
string-out-of-bounds 10.3660+-0.3834 ? 10.7194+-1.0893 ? might be 1.0341x slower
string-repeat-arith 27.5140+-0.2342 ! 28.0633+-0.2770 ! definitely 1.0200x slower
string-sub 53.6074+-1.4075 ? 55.7162+-7.1900 ? might be 1.0393x slower
string-test 2.8265+-0.1305 2.7583+-0.1283 might be 1.0247x faster
string-var-equality 26.3168+-1.1164 25.9203+-0.4529 might be 1.0153x faster
structure-hoist-over-transitions 2.4930+-0.0886 2.4456+-0.0102 might be 1.0194x faster
substring-concat-weird 35.7770+-0.2653 ? 36.1920+-0.3919 ? might be 1.0116x slower
substring-concat 39.6733+-0.5806 39.3905+-0.6336
substring 45.5066+-0.7311 45.1768+-0.1436
switch-char-constant 2.7495+-0.1425 2.6462+-0.0576 might be 1.0390x faster
switch-char 6.0709+-0.8773 5.6507+-0.5664 might be 1.0744x faster
switch-constant 7.1635+-0.6283 ? 7.8036+-0.7469 ? might be 1.0894x slower
switch-string-basic-big-var 15.6725+-0.3339 ? 15.7533+-0.1839 ?
switch-string-basic-big 15.1431+-0.2799 ? 15.1807+-0.3392 ?
switch-string-basic-var 13.8256+-1.6402 13.3617+-0.1827 might be 1.0347x faster
switch-string-basic 12.9390+-0.0495 ? 13.5512+-1.7534 ? might be 1.0473x slower
switch-string-big-length-tower-var 18.5471+-0.7808 ? 18.5516+-1.9329 ?
switch-string-length-tower-var 13.3881+-0.5836 ? 13.9417+-1.1930 ? might be 1.0414x slower
switch-string-length-tower 11.7260+-0.1627 ? 12.2424+-0.5196 ? might be 1.0440x slower
switch-string-short 11.7860+-0.1683 ? 11.9857+-0.5704 ? might be 1.0169x slower
switch 11.8536+-1.4330 11.6588+-1.3389 might be 1.0167x faster
tear-off-arguments-simple 3.1273+-0.1622 3.0305+-0.2614 might be 1.0319x faster
tear-off-arguments 4.2202+-0.1894 4.2013+-0.7336
temporal-structure 12.2952+-0.7897 11.9983+-0.1372 might be 1.0247x faster
to-int32-boolean 13.5245+-0.5253 13.2473+-0.3789 might be 1.0209x faster
try-catch-get-by-val-cloned-arguments 14.2535+-0.4058 ? 14.2844+-0.4846 ?
try-catch-get-by-val-direct-arguments 6.9117+-0.8697 6.4756+-0.1930 might be 1.0674x faster
try-catch-get-by-val-scoped-arguments 7.7064+-0.0125 ? 7.7660+-0.1859 ?
typed-array-get-set-by-val-profiling 28.0833+-2.1037 27.9802+-2.1297
undefined-property-access 236.2343+-17.2694 227.1995+-0.9422 might be 1.0398x faster
undefined-test 2.8528+-0.0512 ? 2.8562+-0.1184 ?
unprofiled-licm 14.2900+-0.2094 ? 14.9983+-2.1569 ? might be 1.0496x slower
varargs-call 13.7018+-0.5624 13.5074+-0.3624 might be 1.0144x faster
varargs-construct-inline 22.4340+-1.1255 ? 22.4819+-0.7830 ?
varargs-construct 20.3312+-0.5679 20.1297+-0.4562 might be 1.0100x faster
varargs-inline 8.5654+-0.1521 ? 8.6833+-0.7405 ? might be 1.0138x slower
varargs-strict-mode 9.2223+-0.3813 9.1475+-0.1536
varargs 9.0954+-0.3004 ? 9.2607+-0.2929 ? might be 1.0182x slower
weird-inlining-const-prop 2.1112+-0.1683 ? 2.3151+-0.5194 ? might be 1.0966x slower
<geometric> 8.4998+-0.0217 ^ 7.7731+-0.0213 ^ definitely 1.0935x faster
master ic
Geomean of preferred means:
<scaled-result> 29.8129+-0.1256 ^ 29.2838+-0.1509 ^ definitely 1.0181x faster
Comment on attachment 258246 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=258246&action=review >>> Source/JavaScriptCore/bytecode/GetByIdStatus.cpp:82 >>> + >> >> Remove this. > > Without it, we hit the assertion. > GetByIdStatus::computeFromLLInt can be used even in the DFG layer; When there's no stubInfo or no good information in baseline JIT, we attempt to retrieve the cached data from the bytecode. > > But at that time, we assume the byte code structure is the same to the get_by_id's structure. > For example, after this guard, we attempt to retrieve the cached Structure data by `Structure* structure = instruction[4].u.structure.get();`. > However, get_by_val does not have the cached data and its byte code structure is not the same to the get_by_id, it looks up the incorrect data. > So before querying the information to the byte code, we need to exit when our byte code is the op_get_by_val. This code will be unnecessary if you store a StructureStubInfo* inside the ByValInfo, and then call GetByIdStatus::computeForStubInfo() directly. You'll have to make that method public. >>> Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h:2191 >>> + >> >> Why can't you just use CheckCell for the symbol case? > > Because different Symbol cells may have the same UniquedStringImpl pointer. > For example, > > var symbol1 = Symbol(); > var object = { [symbol1]: 42 }; > var symbol2 = Object.getOwnPropertySymbols(object)[0]; > symbol1 === symbol2; // true > > In the above case, symbol1 and symbol2's cell addresses are different. But they are identical symbols and === returns true. > > The reason of this Symbol design is keeping the keys (UniquedStringImpl) of PropertyTable ref-counted objects. > Currently, since PropertyTable does not have the GC-managed keys, GC marking for the keys of PropertyTable is not necessary. > However, if we would like to ensure that the uniqued Symbol has the same cell address, we need to store JSCell into PropertyTable (because Object.getOwnPropertySymbols retrieves the stored Symbols from the PropertyTable). > > This is the reason why I don't use CheckCell here. > But if the above is so rare, we can use CheckCell. (In that case, the identical Symbol that cell address is different from the cached one will be trapped by the Check). > What do you think of? In this patch, I chose the conservative one, because it just adds the one pointer cmp. I think what you're doing now is fine. We can optimize to CheckCell if we also profile whether the Symbol cell is always the same. But I think you're taking the right approach and getting the more conservative case working first. Comment on attachment 258246 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=258246&action=review >>>> Source/JavaScriptCore/bytecode/GetByIdStatus.cpp:82 >>>> + >>> >>> Remove this. >> >> Without it, we hit the assertion. >> GetByIdStatus::computeFromLLInt can be used even in the DFG layer; When there's no stubInfo or no good information in baseline JIT, we attempt to retrieve the cached data from the bytecode. >> >> But at that time, we assume the byte code structure is the same to the get_by_id's structure. >> For example, after this guard, we attempt to retrieve the cached Structure data by `Structure* structure = instruction[4].u.structure.get();`. >> However, get_by_val does not have the cached data and its byte code structure is not the same to the get_by_id, it looks up the incorrect data. >> So before querying the information to the byte code, we need to exit when our byte code is the op_get_by_val. > > This code will be unnecessary if you store a StructureStubInfo* inside the ByValInfo, and then call GetByIdStatus::computeForStubInfo() directly. You'll have to make that method public. I've got it. It makes the code clear :D >>>> Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h:2191 >>>> + >>> >>> Why can't you just use CheckCell for the symbol case? >> >> Because different Symbol cells may have the same UniquedStringImpl pointer. >> For example, >> >> var symbol1 = Symbol(); >> var object = { [symbol1]: 42 }; >> var symbol2 = Object.getOwnPropertySymbols(object)[0]; >> symbol1 === symbol2; // true >> >> In the above case, symbol1 and symbol2's cell addresses are different. But they are identical symbols and === returns true. >> >> The reason of this Symbol design is keeping the keys (UniquedStringImpl) of PropertyTable ref-counted objects. >> Currently, since PropertyTable does not have the GC-managed keys, GC marking for the keys of PropertyTable is not necessary. >> However, if we would like to ensure that the uniqued Symbol has the same cell address, we need to store JSCell into PropertyTable (because Object.getOwnPropertySymbols retrieves the stored Symbols from the PropertyTable). >> >> This is the reason why I don't use CheckCell here. >> But if the above is so rare, we can use CheckCell. (In that case, the identical Symbol that cell address is different from the cached one will be trapped by the Check). >> What do you think of? In this patch, I chose the conservative one, because it just adds the one pointer cmp. > > I think what you're doing now is fine. We can optimize to CheckCell if we also profile whether the Symbol cell is always the same. But I think you're taking the right approach and getting the more conservative case working first. OK, so before the real symbol use case is figured out by the profiler, use CheckIdent for Symbol now. Created attachment 258270 [details]
Patch
Created attachment 258271 [details]
Patch
32bit build fix
Created attachment 258272 [details]
Patch
32bit build fix, and checked with run-javascriptcore-tests --32-bit
Comment on attachment 258272 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=258272&action=review Added notes. > Source/JavaScriptCore/bytecode/ExitKind.h:35 > + BadIdent, // We exited because we made an incorrect assumption about what identifier we would see. Usually used for cached Id check in get_by_val. Added new ExitKind BadIdent. This can be used if we would like to check the CheckIdent's exits and leverage it for the further compilation. > Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp:3407 > + ByValInfo* byValInfo = m_inlineStackTop->m_byValInfos.get(CodeOrigin(currentCodeOrigin().bytecodeIndex)); ByValInfo is the part of CodeBlock. Now protected by ConcurrentJITLocker. > Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp:4602 > +} Moved to DFGSpeculativeJIT.cpp. after checking in the Octane/Kraken, I've seen some perf regression. If it is ensured, I'll add a path to record a slow path for incorrect ident and use the generic one if we saw it. To improve this, we need to record tookSlowPath in byValInfo (not stubInfo, because stubInfo->tookSlowPath is used for the case that "the id is the same, but structures are different / non-cachable). So looking up byValInfo by binary search in each time is not good I think (it's now highly used). So I would like to change byValInfo to stubInfo like one; allocated by Bag, operation takes the immediate byValInfo pointer. In my plan, byValInfo holds the ArrayProfile*. And current ArrayProfile* in the operation side is replaced by ByValInfo*. (If there's a room, we can pass the both) Created attachment 258296 [details]
Patch
Fix the performance regressions
Performance results including Octane and Kraken.
Benchmark report for SunSpider, LongSpider, V8Spider, Octane, Kraken, and JSRegress on Yusukes-MacBook-Pro (MacBookPro11,3).
VMs tested:
"master" at /Users/yusukesuzuki/development/WebKit/WebKitBuild/master-for-gen3/Release/jsc
"ic" at /Users/yusukesuzuki/development/WebKit/WebKitBuild/gen3/Release/jsc
Collected 4 samples per benchmark/VM, with 4 VM invocations per benchmark. Emitted a call to gc() between sample measurements.
Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific preciseTime() function to get microsecond-level
timing. Reporting benchmark execution times with 95% confidence intervals in milliseconds.
master ic
SunSpider:
3d-cube 4.5282+-0.2485 ? 4.9453+-0.7707 ? might be 1.0921x slower
3d-morph 5.3310+-0.1991 ? 5.4410+-0.2284 ? might be 1.0206x slower
3d-raytrace 5.8653+-0.8088 5.5945+-0.3632 might be 1.0484x faster
access-binary-trees 2.0560+-0.1181 ? 2.1602+-0.1669 ? might be 1.0507x slower
access-fannkuch 5.5486+-0.2242 ? 5.7419+-0.6789 ? might be 1.0348x slower
access-nbody 2.4963+-0.0439 ? 2.5289+-0.1304 ? might be 1.0131x slower
access-nsieve 3.0986+-0.1591 3.0718+-0.0874
bitops-3bit-bits-in-byte 1.5406+-0.1011 1.4664+-0.0355 might be 1.0506x faster
bitops-bits-in-byte 3.2902+-0.0964 3.2783+-0.0971
bitops-bitwise-and 2.0684+-0.2158 ? 2.0852+-0.2163 ?
bitops-nsieve-bits 2.9742+-0.0596 2.9232+-0.0656 might be 1.0175x faster
controlflow-recursive 2.1710+-0.1297 2.0672+-0.0367 might be 1.0502x faster
crypto-aes 4.0428+-0.3877 3.9308+-0.1072 might be 1.0285x faster
crypto-md5 2.5234+-0.1070 2.4905+-0.0859 might be 1.0132x faster
crypto-sha1 2.3946+-0.1902 ? 2.5060+-0.2005 ? might be 1.0465x slower
date-format-tofte 6.8201+-0.2537 6.7677+-0.1506
date-format-xparb 4.6736+-0.2267 ? 4.7784+-0.2501 ? might be 1.0224x slower
math-cordic 2.8085+-0.0535 2.7977+-0.0656
math-partial-sums 5.3309+-0.3371 ? 5.5550+-0.4766 ? might be 1.0420x slower
math-spectral-norm 1.8878+-0.2383 1.8329+-0.0530 might be 1.0299x faster
regexp-dna 6.7020+-0.8181 ? 6.8414+-1.0744 ? might be 1.0208x slower
string-base64 4.4441+-0.4511 ? 4.6030+-0.6046 ? might be 1.0358x slower
string-fasta 5.9281+-0.2114 ? 6.1610+-0.7233 ? might be 1.0393x slower
string-tagcloud 8.1575+-0.1615 ? 8.3894+-0.4561 ? might be 1.0284x slower
string-unpack-code 20.3569+-0.7611 ? 20.3917+-1.1216 ?
string-validate-input 4.5994+-0.3102 ? 4.6462+-0.3575 ? might be 1.0102x slower
<arithmetic> 4.6784+-0.0156 ? 4.7306+-0.1227 ? might be 1.0112x slower
master ic
LongSpider:
3d-cube 806.5562+-13.3674 803.4470+-15.8815
3d-morph 1563.4717+-13.7225 ? 1583.1520+-40.2826 ? might be 1.0126x slower
3d-raytrace 646.5690+-2.9499 ? 648.3439+-13.3386 ?
access-binary-trees 833.2377+-12.8893 828.8545+-10.4351
access-fannkuch 292.1420+-11.9482 291.2977+-2.5443
access-nbody 533.2036+-11.5947 530.7414+-10.3930
access-nsieve 370.8472+-11.2058 ? 377.9310+-14.2696 ? might be 1.0191x slower
bitops-3bit-bits-in-byte 40.9683+-0.5645 ? 41.2922+-1.1724 ?
bitops-bits-in-byte 84.0946+-6.1807 ? 86.5445+-7.4637 ? might be 1.0291x slower
bitops-nsieve-bits 419.8147+-14.8998 ? 420.5725+-6.5100 ?
controlflow-recursive 436.5338+-8.3128 ? 441.2347+-6.7535 ? might be 1.0108x slower
crypto-aes 579.6600+-21.7291 ? 602.8971+-27.3378 ? might be 1.0401x slower
crypto-md5 488.2917+-11.5858 ? 497.6625+-13.5016 ? might be 1.0192x slower
crypto-sha1 662.7828+-8.6205 ? 667.2480+-28.4731 ?
date-format-tofte 542.8038+-27.8694 529.8138+-13.7247 might be 1.0245x faster
date-format-xparb 655.6882+-15.4961 ? 660.0057+-14.6466 ?
hash-map 157.9012+-2.9534 ? 160.4095+-5.5077 ? might be 1.0159x slower
math-cordic 505.8448+-3.0814 ? 518.2212+-12.0568 ? might be 1.0245x slower
math-partial-sums 519.8271+-7.3856 518.5653+-11.9173
math-spectral-norm 578.2445+-17.4989 577.4418+-4.8732
string-base64 361.4495+-11.1843 ? 369.2320+-7.2116 ? might be 1.0215x slower
string-fasta 370.2538+-4.2847 ? 377.1550+-10.1899 ? might be 1.0186x slower
string-tagcloud 185.2253+-6.7053 183.9490+-4.4700
<geometric> 405.8323+-0.9512 ? 409.0743+-4.0670 ? might be 1.0080x slower
master ic
V8Spider:
crypto 53.5570+-12.4800 52.8669+-8.1601 might be 1.0131x faster
deltablue 86.6597+-7.9606 83.1719+-10.9821 might be 1.0419x faster
earley-boyer 41.5284+-3.4938 40.8287+-2.1071 might be 1.0171x faster
raytrace 29.9363+-3.4531 29.6315+-2.5639 might be 1.0103x faster
regexp 66.0772+-3.4537 63.9864+-1.1605 might be 1.0327x faster
richards 72.3815+-1.8120 ? 72.6858+-6.2021 ?
splay 35.7101+-1.2082 34.3097+-1.9061 might be 1.0408x faster
<geometric> 51.5981+-0.9070 50.5330+-0.8915 might be 1.0211x faster
master ic
Octane:
encrypt 0.20956+-0.00657 ? 0.21101+-0.00603 ?
decrypt 3.54623+-0.13018 3.52265+-0.04455
deltablue x2 0.16130+-0.00226 ? 0.16394+-0.00374 ? might be 1.0164x slower
earley 0.31011+-0.00337 ? 0.31156+-0.00470 ?
boyer 4.43421+-0.36312 4.39971+-0.26433
navier-stokes x2 5.22529+-0.04478 ? 5.24537+-0.08282 ?
raytrace x2 1.03838+-0.08028 ? 1.04428+-0.08834 ?
richards x2 0.10505+-0.00248 ? 0.10737+-0.00493 ? might be 1.0221x slower
splay x2 0.35686+-0.00530 ? 0.36002+-0.00939 ?
regexp x2 26.18337+-1.12246 25.68211+-0.74344 might be 1.0195x faster
pdfjs x2 38.63998+-0.56690 38.62293+-0.36230
mandreel x2 46.29668+-0.37778 ? 46.40727+-0.85481 ?
gbemu x2 35.21303+-0.19831 ? 35.52619+-0.76761 ?
closure 0.58360+-0.00624 ? 0.59320+-0.00658 ? might be 1.0165x slower
jquery 7.50638+-0.09588 ? 7.56682+-0.17575 ?
box2d x2 10.57968+-0.40023 10.42192+-0.18990 might be 1.0151x faster
zlib x2 389.06496+-5.31756 385.30068+-34.70982
typescript x2 673.87708+-31.35682 ? 690.84283+-23.27015 ? might be 1.0252x slower
<geometric> 5.84413+-0.05191 ? 5.86659+-0.03748 ? might be 1.0038x slower
master ic
Kraken:
ai-astar 246.713+-8.875 232.316+-16.921 might be 1.0620x faster
audio-beat-detection 59.483+-0.857 59.074+-0.352
audio-dft 101.256+-3.284 99.410+-3.223 might be 1.0186x faster
audio-fft 35.688+-0.219 ? 35.698+-0.189 ?
audio-oscillator 64.880+-1.876 ? 65.061+-5.336 ?
imaging-darkroom 61.867+-2.631 61.193+-1.386 might be 1.0110x faster
imaging-desaturate 57.659+-2.871 53.909+-6.815 might be 1.0696x faster
imaging-gaussian-blur 88.789+-4.806 87.531+-5.359 might be 1.0144x faster
json-parse-financial 40.382+-0.386 ! 42.575+-1.446 ! definitely 1.0543x slower
json-stringify-tinderbox 22.748+-1.462 ? 23.567+-1.554 ? might be 1.0360x slower
stanford-crypto-aes 43.192+-3.254 42.372+-0.650 might be 1.0194x faster
stanford-crypto-ccm 36.771+-3.066 35.113+-1.615 might be 1.0472x faster
stanford-crypto-pbkdf2 98.899+-3.531 98.791+-6.183
stanford-crypto-sha256-iterative 38.111+-3.312 ? 39.925+-2.583 ? might be 1.0476x slower
<arithmetic> 71.174+-1.609 69.752+-1.036 might be 1.0204x faster
master ic
JSRegress:
abc-forward-loop-equal 29.1677+-0.3676 ? 30.3741+-1.0654 ? might be 1.0414x slower
abc-postfix-backward-loop 29.7617+-1.0127 ? 30.9985+-2.7965 ? might be 1.0416x slower
abc-simple-backward-loop 30.0283+-0.7175 ? 30.2725+-2.9063 ?
abc-simple-forward-loop 30.4447+-1.8540 29.9425+-1.9338 might be 1.0168x faster
abc-skippy-loop 21.5685+-0.5921 21.5358+-0.9275
abs-boolean 2.4841+-0.1485 ? 2.5024+-0.1864 ?
adapt-to-double-divide 17.0173+-0.7320 ? 17.5393+-1.9958 ? might be 1.0307x slower
aliased-arguments-getbyval 1.1360+-0.0695 ? 1.4144+-0.5924 ? might be 1.2450x slower
allocate-big-object 2.3381+-0.2634 ? 2.4282+-0.3081 ? might be 1.0385x slower
arguments-named-and-reflective 11.2994+-0.5595 10.9318+-0.3130 might be 1.0336x faster
arguments-out-of-bounds 9.9373+-0.6874 9.8275+-0.2430 might be 1.0112x faster
arguments-strict-mode 9.9556+-0.6040 9.7040+-0.7970 might be 1.0259x faster
arguments 8.4682+-0.4456 ? 9.3926+-3.1602 ? might be 1.1092x slower
arity-mismatch-inlining 0.8540+-0.0754 0.7855+-0.0282 might be 1.0873x faster
array-access-polymorphic-structure 6.2924+-0.6596 6.1773+-0.2479 might be 1.0186x faster
array-nonarray-polymorhpic-access 26.1734+-0.6319 25.6730+-1.4229 might be 1.0195x faster
array-prototype-every 77.7406+-2.2229 ? 82.9680+-3.7002 ? might be 1.0672x slower
array-prototype-forEach 76.2050+-0.8694 ? 80.7188+-4.5448 ? might be 1.0592x slower
array-prototype-map 84.6564+-3.5170 83.4708+-3.0334 might be 1.0142x faster
array-prototype-reduce 75.4187+-6.0351 73.7213+-0.7984 might be 1.0230x faster
array-prototype-reduceRight 72.2633+-1.7126 ? 74.4540+-3.3253 ? might be 1.0303x slower
array-prototype-some 78.7365+-1.5492 ? 82.9426+-6.7842 ? might be 1.0534x slower
array-splice-contiguous 21.8065+-1.2714 ? 21.9171+-4.2385 ?
array-with-double-add 3.4127+-0.1246 ? 3.4438+-0.1419 ?
array-with-double-increment 3.0817+-0.0428 3.0614+-0.1056
array-with-double-mul-add 4.3383+-0.2766 4.2430+-0.0908 might be 1.0225x faster
array-with-double-sum 3.1752+-0.0318 ? 3.2064+-0.0802 ?
array-with-int32-add-sub 6.0149+-0.1640 5.9641+-0.1148
array-with-int32-or-double-sum 3.3884+-0.1952 3.3590+-0.2799
ArrayBuffer-DataView-alloc-large-long-lived
30.1981+-3.0663 28.2600+-0.7667 might be 1.0686x faster
ArrayBuffer-DataView-alloc-long-lived 14.1130+-3.8732 13.5988+-3.5600 might be 1.0378x faster
ArrayBuffer-Int32Array-byteOffset 3.6795+-0.2217 ? 3.7097+-0.2037 ?
ArrayBuffer-Int8Array-alloc-large-long-lived
28.4406+-1.3244 28.0223+-0.3597 might be 1.0149x faster
ArrayBuffer-Int8Array-alloc-long-lived-buffer
21.0040+-0.8972 ? 22.0151+-3.7864 ? might be 1.0481x slower
ArrayBuffer-Int8Array-alloc-long-lived 13.4361+-2.9611 12.7405+-2.1225 might be 1.0546x faster
ArrayBuffer-Int8Array-alloc 11.2585+-2.4529 10.7628+-0.3935 might be 1.0461x faster
asmjs_bool_bug 7.3057+-0.5780 ? 7.7534+-0.6956 ? might be 1.0613x slower
assign-custom-setter-polymorphic 2.6929+-0.2065 2.6733+-0.0691
assign-custom-setter 3.5984+-0.1068 3.5750+-0.1629
basic-set 8.2795+-0.2557 8.2755+-1.1139
big-int-mul 3.5844+-0.0950 3.5359+-0.0911 might be 1.0137x faster
boolean-test 2.9197+-0.0451 ? 2.9272+-0.0560 ?
branch-fold 3.7108+-0.1101 3.6453+-0.0257 might be 1.0180x faster
branch-on-string-as-boolean 17.0079+-1.2331 16.5284+-0.6909 might be 1.0290x faster
by-val-generic 7.1727+-0.4127 ^ 6.1404+-0.0561 ^ definitely 1.1681x faster
call-spread-apply 27.0648+-1.1430 ? 27.1664+-2.0285 ?
call-spread-call 21.7117+-0.6298 21.5172+-0.7480
captured-assignments 0.4089+-0.0279 0.4040+-0.0115 might be 1.0121x faster
cast-int-to-double 5.2700+-0.2375 ? 5.3121+-0.6351 ?
cell-argument 6.2390+-0.2873 ? 6.3619+-0.0820 ? might be 1.0197x slower
cfg-simplify 2.8525+-0.1148 ? 3.0408+-0.6041 ? might be 1.0660x slower
chain-getter-access 8.3180+-0.4650 8.1072+-0.1264 might be 1.0260x faster
cmpeq-obj-to-obj-other 11.3422+-1.9220 ? 11.7698+-2.3866 ? might be 1.0377x slower
constant-test 5.1288+-0.6526 4.9953+-0.2795 might be 1.0267x faster
create-lots-of-functions 9.1982+-0.5133 ? 9.2998+-0.2678 ? might be 1.0110x slower
cse-new-array-buffer 2.2253+-0.3185 ? 2.3232+-0.1369 ? might be 1.0440x slower
cse-new-array 2.3522+-0.2789 ? 2.5048+-0.5870 ? might be 1.0648x slower
DataView-custom-properties 33.0352+-1.2929 32.6660+-0.6440 might be 1.0113x faster
delay-tear-off-arguments-strictmode 12.6254+-0.2109 12.4064+-0.6531 might be 1.0177x faster
deltablue-varargs 150.7604+-5.4167 ? 152.8066+-10.2665 ? might be 1.0136x slower
destructuring-arguments 172.4597+-8.7627 ? 173.9924+-6.6813 ?
destructuring-parameters-overridden-by-function
0.4433+-0.0292 ? 0.4434+-0.0577 ?
destructuring-swap 4.8577+-0.1368 ? 4.9005+-0.3716 ?
direct-arguments-getbyval 1.1785+-0.1606 1.1710+-0.2048
div-boolean-double 5.4214+-0.1228 ? 5.5844+-0.5406 ? might be 1.0300x slower
div-boolean 8.5823+-0.4712 8.5172+-0.3914
double-get-by-val-out-of-bounds 4.2925+-0.1244 4.1372+-0.1546 might be 1.0375x faster
double-pollution-getbyval 8.8160+-0.1214 ? 8.9195+-0.2575 ? might be 1.0117x slower
double-pollution-putbyoffset 3.7980+-0.3552 3.7867+-0.0967
double-real-use 27.2012+-6.8952 ? 27.9280+-3.3763 ? might be 1.0267x slower
double-to-int32-typed-array-no-inline 2.0956+-0.1633 ? 2.1830+-0.1824 ? might be 1.0417x slower
double-to-int32-typed-array 1.7710+-0.0962 1.7433+-0.0884 might be 1.0159x faster
double-to-uint32-typed-array-no-inline 2.2479+-0.2060 ? 2.2887+-0.2850 ? might be 1.0181x slower
double-to-uint32-typed-array 1.9516+-0.4006 1.8837+-0.0655 might be 1.0361x faster
elidable-new-object-dag 33.9432+-0.3194 ? 34.1952+-0.6967 ?
elidable-new-object-roflcopter 33.0228+-0.7013 ? 33.4571+-1.8343 ? might be 1.0132x slower
elidable-new-object-then-call 31.7800+-1.7496 31.4551+-0.3465 might be 1.0103x faster
elidable-new-object-tree 36.3247+-0.5103 36.1536+-0.8549
empty-string-plus-int 4.8400+-0.2318 ? 4.8997+-0.2301 ? might be 1.0123x slower
emscripten-cube2hash 25.8115+-1.1323 ? 26.9389+-2.2364 ? might be 1.0437x slower
exit-length-on-plain-object 12.9287+-0.3684 12.8127+-0.3865
external-arguments-getbyval 1.2049+-0.1040 1.1964+-0.0792
external-arguments-putbyval 2.3903+-0.4688 2.1387+-0.0838 might be 1.1176x faster
fixed-typed-array-storage-var-index 1.1642+-0.0212 1.1472+-0.0311 might be 1.0148x faster
fixed-typed-array-storage 0.8970+-0.0906 0.8878+-0.0892 might be 1.0104x faster
Float32Array-matrix-mult 4.0172+-0.3712 3.9800+-0.1968
Float32Array-to-Float64Array-set 49.6502+-2.9084 47.0181+-1.8577 might be 1.0560x faster
Float64Array-alloc-long-lived 58.2575+-1.3154 ? 58.8754+-2.2412 ? might be 1.0106x slower
Float64Array-to-Int16Array-set 56.4810+-0.4996 ? 58.0217+-2.3804 ? might be 1.0273x slower
fold-double-to-int 12.8971+-0.3155 ? 13.1835+-0.4332 ? might be 1.0222x slower
fold-get-by-id-to-multi-get-by-offset-rare-int
10.7560+-0.9063 ? 11.1981+-0.6799 ? might be 1.0411x slower
fold-get-by-id-to-multi-get-by-offset 9.3020+-0.8969 ? 9.5156+-0.2223 ? might be 1.0230x slower
fold-multi-get-by-offset-to-get-by-offset
8.6063+-0.5919 8.1846+-1.6486 might be 1.0515x faster
fold-multi-get-by-offset-to-poly-get-by-offset
7.0126+-1.7065 ? 7.8588+-1.2012 ? might be 1.1207x slower
fold-multi-put-by-offset-to-poly-put-by-offset
7.8015+-0.5103 7.7626+-0.1840
fold-multi-put-by-offset-to-put-by-offset
6.4243+-0.6443 5.2300+-1.6441 might be 1.2283x faster
fold-multi-put-by-offset-to-replace-or-transition-put-by-offset
8.6768+-0.5188 ? 8.6882+-1.1950 ?
fold-put-by-id-to-multi-put-by-offset 9.2865+-1.5285 9.2689+-0.7901
fold-put-structure 5.6344+-0.7204 5.3468+-0.9463 might be 1.0538x faster
for-of-iterate-array-entries 11.9245+-0.3526 ? 12.2877+-0.4724 ? might be 1.0305x slower
for-of-iterate-array-keys 3.4141+-0.3316 ? 3.4384+-0.2072 ?
for-of-iterate-array-values 3.2635+-0.1525 ? 3.5128+-0.4783 ? might be 1.0764x slower
fround 19.1564+-2.3145 ? 19.3178+-0.6534 ?
ftl-library-inlining-dataview 57.3265+-0.8368 57.2940+-1.0177
ftl-library-inlining 111.8422+-5.9276 111.5262+-1.6971
function-dot-apply 2.0342+-0.0686 ? 2.1002+-0.1914 ? might be 1.0324x slower
function-test 2.6610+-0.0605 ? 2.6829+-0.0930 ?
function-with-eval 99.6140+-4.4358 ? 104.6570+-5.1615 ? might be 1.0506x slower
gcse-poly-get-less-obvious 14.8087+-0.3191 14.5642+-0.1521 might be 1.0168x faster
gcse-poly-get 14.6140+-0.5203 ? 14.9162+-1.2164 ? might be 1.0207x slower
gcse 4.0215+-0.3739 ? 4.1222+-0.5814 ? might be 1.0250x slower
get-by-id-bimorphic-check-structure-elimination-simple
2.6721+-0.1027 2.6370+-0.0190 might be 1.0133x faster
get-by-id-bimorphic-check-structure-elimination
6.0050+-0.2015 ? 6.0337+-0.3043 ?
get-by-id-chain-from-try-block 5.5519+-0.1072 ? 5.6056+-0.3163 ?
get-by-id-check-structure-elimination 4.7066+-1.0565 4.5632+-0.3450 might be 1.0314x faster
get-by-id-proto-or-self 15.3929+-1.5138 15.3365+-1.6511
get-by-id-quadmorphic-check-structure-elimination-simple
2.9600+-0.1126 ? 2.9903+-0.1856 ? might be 1.0102x slower
get-by-id-self-or-proto 15.8895+-2.8521 15.2098+-1.9768 might be 1.0447x faster
get-by-val-out-of-bounds 3.9747+-0.2050 3.8967+-0.2508 might be 1.0200x faster
get-by-val-with-string-bimorphic-check-structure-elimination-simple
16.8729+-1.0286 ^ 2.8460+-0.0471 ^ definitely 5.9286x faster
get-by-val-with-string-bimorphic-check-structure-elimination
157.2448+-6.4139 ^ 6.0943+-0.2173 ^ definitely 25.8019x faster
get-by-val-with-string-chain-from-try-block
58.6890+-3.1887 ^ 6.1861+-0.2062 ^ definitely 9.4872x faster
get-by-val-with-string-check-structure-elimination
160.3820+-5.4887 ^ 5.1985+-0.1929 ^ definitely 30.8517x faster
get-by-val-with-string-proto-or-self 86.8782+-10.0196 ^ 14.9386+-0.4761 ^ definitely 5.8157x faster
get-by-val-with-string-quadmorphic-check-structure-elimination-simple
17.3953+-0.6354 ^ 3.1753+-0.0271 ^ definitely 5.4783x faster
get-by-val-with-string-self-or-proto 84.3212+-4.3619 ^ 16.6210+-1.1146 ^ definitely 5.0732x faster
get-by-val-with-symbol-bimorphic-check-structure-elimination-simple
20.6809+-0.5903 ^ 3.2062+-0.3275 ^ definitely 6.4503x faster
get-by-val-with-symbol-bimorphic-check-structure-elimination
222.3325+-8.4368 ^ 12.5363+-0.0705 ^ definitely 17.7351x faster
get-by-val-with-symbol-chain-from-try-block
57.6683+-3.4113 ^ 5.6364+-0.3109 ^ definitely 10.2314x faster
get-by-val-with-symbol-check-structure-elimination
218.3550+-5.9924 ^ 11.2866+-0.0587 ^ definitely 19.3465x faster
get-by-val-with-symbol-proto-or-self 88.8642+-4.6145 ^ 15.6275+-2.4054 ^ definitely 5.6864x faster
get-by-val-with-symbol-quadmorphic-check-structure-elimination-simple
21.8210+-1.9445 ^ 3.9825+-0.2270 ^ definitely 5.4792x faster
get-by-val-with-symbol-self-or-proto 86.5010+-3.7340 ^ 14.6815+-0.6708 ^ definitely 5.8918x faster
get_callee_monomorphic 2.3016+-0.2917 2.1713+-0.0970 might be 1.0600x faster
get_callee_polymorphic 3.2027+-0.0661 ? 3.3007+-0.2332 ? might be 1.0306x slower
getter-no-activation 4.9512+-0.3263 ? 4.9687+-0.1755 ?
getter-prototype 9.9618+-0.1017 9.8992+-0.1713
getter-richards 123.9999+-8.3831 110.3110+-10.0817 might be 1.1241x faster
getter 5.7173+-0.7573 5.4483+-0.3909 might be 1.0494x faster
global-object-access-with-mutating-structure
5.5243+-0.1308 ? 5.7130+-0.5435 ? might be 1.0342x slower
global-var-const-infer-fire-from-opt 0.9075+-0.0858 0.8495+-0.0494 might be 1.0683x faster
global-var-const-infer 0.7606+-0.1246 ? 0.7736+-0.1883 ? might be 1.0171x slower
HashMap-put-get-iterate-keys 25.9922+-2.9405 ? 27.0355+-3.5112 ? might be 1.0401x slower
HashMap-put-get-iterate 27.2526+-2.3463 26.7664+-1.6821 might be 1.0182x faster
HashMap-string-put-get-iterate 25.4446+-1.6380 ? 25.8789+-1.8800 ? might be 1.0171x slower
hoist-make-rope 7.4523+-0.3199 ? 8.4576+-0.7597 ? might be 1.1349x slower
hoist-poly-check-structure-effectful-loop
4.2081+-0.2210 4.1558+-0.0916 might be 1.0126x faster
hoist-poly-check-structure 3.3506+-0.0737 3.2533+-0.0744 might be 1.0299x faster
imul-double-only 6.6213+-0.3132 ? 7.1595+-0.6789 ? might be 1.0813x slower
imul-int-only 8.3401+-1.2264 8.0038+-0.1704 might be 1.0420x faster
imul-mixed 6.7751+-0.6916 6.7377+-0.8769
in-four-cases 17.9575+-0.6242 ? 18.0943+-0.9951 ?
in-one-case-false 9.4940+-0.2245 9.3679+-0.4159 might be 1.0135x faster
in-one-case-true 9.2741+-0.1625 ? 9.6844+-0.9073 ? might be 1.0442x slower
in-two-cases 10.0246+-0.5165 9.6175+-0.4733 might be 1.0423x faster
indexed-properties-in-objects 2.8920+-0.1017 2.8472+-0.0552 might be 1.0157x faster
infer-closure-const-then-mov-no-inline 3.1927+-0.1615 3.0829+-0.1133 might be 1.0356x faster
infer-closure-const-then-mov 17.4760+-0.3793 16.9493+-0.2557 might be 1.0311x faster
infer-closure-const-then-put-to-scope-no-inline
12.0032+-0.2387 11.6786+-0.5139 might be 1.0278x faster
infer-closure-const-then-put-to-scope 22.0292+-0.8473 21.8784+-0.6954
infer-closure-const-then-reenter-no-inline
51.3146+-1.2408 ? 53.3607+-4.6672 ? might be 1.0399x slower
infer-closure-const-then-reenter 22.9749+-2.0646 22.3560+-0.7597 might be 1.0277x faster
infer-constant-global-property 3.3776+-0.0702 ? 3.4828+-0.0459 ? might be 1.0312x slower
infer-constant-property 2.7252+-0.1827 2.6159+-0.0467 might be 1.0418x faster
infer-one-time-closure-ten-vars 8.5019+-0.2477 ? 8.8345+-0.5685 ? might be 1.0391x slower
infer-one-time-closure-two-vars 8.4255+-0.6041 7.7767+-0.1320 might be 1.0834x faster
infer-one-time-closure 8.2621+-0.6275 7.8984+-0.3699 might be 1.0460x faster
infer-one-time-deep-closure 13.2109+-1.0035 ? 13.8286+-3.1377 ? might be 1.0468x slower
inline-arguments-access 3.7803+-0.3006 3.6257+-0.2589 might be 1.0426x faster
inline-arguments-aliased-access 3.8494+-0.6692 3.7727+-0.2718 might be 1.0203x faster
inline-arguments-local-escape 3.8195+-0.4821 3.7311+-0.1639 might be 1.0237x faster
inline-get-scoped-var 4.6532+-0.1400 ? 4.6552+-0.0913 ?
inlined-put-by-id-transition 10.4027+-1.1515 10.2960+-1.0971 might be 1.0104x faster
int-or-other-abs-then-get-by-val 4.9631+-0.2848 4.8627+-0.0706 might be 1.0206x faster
int-or-other-abs-zero-then-get-by-val 16.4810+-1.2627 ? 16.7546+-1.0640 ? might be 1.0166x slower
int-or-other-add-then-get-by-val 4.3486+-0.9129 4.1300+-0.2131 might be 1.0529x faster
int-or-other-add 5.0022+-0.2279 4.9957+-0.1536
int-or-other-div-then-get-by-val 3.7665+-0.0900 3.7058+-0.0482 might be 1.0164x faster
int-or-other-max-then-get-by-val 4.2622+-0.3757 3.9645+-0.0909 might be 1.0751x faster
int-or-other-min-then-get-by-val 4.0549+-0.1254 ? 4.1049+-0.3559 ? might be 1.0123x slower
int-or-other-mod-then-get-by-val 3.6039+-0.2819 3.5809+-0.1669
int-or-other-mul-then-get-by-val 3.7093+-0.1927 ? 3.8833+-0.9129 ? might be 1.0469x slower
int-or-other-neg-then-get-by-val 4.6777+-0.4534 4.5367+-0.2113 might be 1.0311x faster
int-or-other-neg-zero-then-get-by-val 16.2246+-0.4694 16.0403+-0.5314 might be 1.0115x faster
int-or-other-sub-then-get-by-val 4.1643+-0.2353 4.1517+-0.2755
int-or-other-sub 3.4189+-0.0878 ? 3.4272+-0.0313 ?
int-overflow-local 4.3443+-0.0733 ? 4.4653+-0.2924 ? might be 1.0278x slower
Int16Array-alloc-long-lived 43.0225+-1.9736 42.6326+-0.8218
Int16Array-bubble-sort-with-byteLength 17.7372+-0.2260 ? 17.7382+-0.3671 ?
Int16Array-bubble-sort 18.1882+-1.9488 ? 18.3118+-0.7128 ?
Int16Array-load-int-mul 1.5023+-0.1193 1.4521+-0.0238 might be 1.0346x faster
Int16Array-to-Int32Array-set 46.3752+-4.9819 43.8806+-1.2635 might be 1.0569x faster
Int32Array-alloc-large 12.5280+-0.6596 ? 12.9109+-1.4784 ? might be 1.0306x slower
Int32Array-alloc-long-lived 47.2256+-0.5114 ? 48.0411+-1.4854 ? might be 1.0173x slower
Int32Array-alloc 2.7532+-0.3139 ? 2.7924+-0.3582 ? might be 1.0142x slower
Int32Array-Int8Array-view-alloc 6.4981+-0.1344 6.4710+-0.7353
int52-spill 4.7721+-0.2635 ? 4.8823+-0.2715 ? might be 1.0231x slower
Int8Array-alloc-long-lived 40.1775+-3.7636 39.8708+-3.4355
Int8Array-load-with-byteLength 3.4295+-0.1224 3.4083+-0.0486
Int8Array-load 3.5062+-0.1500 3.4714+-0.2664 might be 1.0100x faster
integer-divide 10.7535+-0.7009 10.5056+-0.3754 might be 1.0236x faster
integer-modulo 1.6168+-0.0995 ? 1.6532+-0.0484 ? might be 1.0225x slower
is-boolean-fold-tricky 3.7715+-0.1454 ? 3.8497+-0.1989 ? might be 1.0207x slower
is-boolean-fold 2.6472+-0.0382 ? 2.7357+-0.3211 ? might be 1.0334x slower
is-function-fold-tricky-internal-function
10.1465+-0.4450 ? 10.2383+-0.3193 ?
is-function-fold-tricky 4.1783+-0.0741 ? 4.2595+-0.2669 ? might be 1.0194x slower
is-function-fold 2.6988+-0.1124 ? 2.9101+-0.6846 ? might be 1.0783x slower
is-number-fold-tricky 4.0613+-0.1382 ? 4.0797+-0.1552 ?
is-number-fold 2.6277+-0.0494 ? 2.6942+-0.2209 ? might be 1.0253x slower
is-object-or-null-fold-functions 2.6985+-0.1092 ? 2.7450+-0.0838 ? might be 1.0172x slower
is-object-or-null-fold-less-tricky 4.1932+-0.2312 ? 4.3696+-0.8046 ? might be 1.0421x slower
is-object-or-null-fold-tricky 5.3980+-0.2246 5.2637+-0.1796 might be 1.0255x faster
is-object-or-null-fold 2.6528+-0.0806 ? 2.7194+-0.1091 ? might be 1.0251x slower
is-object-or-null-trickier-function 4.1318+-0.0769 4.1230+-0.0575
is-object-or-null-trickier-internal-function
11.0000+-0.4318 10.7465+-0.2660 might be 1.0236x faster
is-object-or-null-tricky-function 4.2324+-0.0976 ? 4.3441+-0.2761 ? might be 1.0264x slower
is-object-or-null-tricky-internal-function
8.0081+-0.1159 ? 8.0120+-0.2925 ?
is-string-fold-tricky 4.0966+-0.0838 ? 4.1592+-0.2719 ? might be 1.0153x slower
is-string-fold 2.8082+-0.7047 2.6647+-0.0797 might be 1.0538x faster
is-undefined-fold-tricky 3.4359+-0.2286 3.4230+-0.1244
is-undefined-fold 2.6971+-0.0967 ? 2.7477+-0.3184 ? might be 1.0187x slower
large-int-captured 3.8679+-0.0917 ? 3.9342+-0.3168 ? might be 1.0171x slower
large-int-neg 15.0306+-2.4510 14.0783+-0.4475 might be 1.0676x faster
large-int 14.0135+-0.7444 13.8254+-0.8839 might be 1.0136x faster
load-varargs-elimination 22.2371+-2.8835 21.7607+-0.0951 might be 1.0219x faster
logical-not-weird-types 3.0613+-0.3327 3.0161+-0.3661 might be 1.0150x faster
logical-not 4.3324+-0.1772 4.2687+-0.0857 might be 1.0149x faster
lots-of-fields 9.5287+-0.5307 ? 9.6821+-0.7142 ? might be 1.0161x slower
make-indexed-storage 2.9662+-0.6081 2.8135+-0.2031 might be 1.0543x faster
make-rope-cse 3.7227+-0.2721 3.6138+-0.0983 might be 1.0301x faster
marsaglia-larger-ints 34.4193+-2.4644 34.3773+-2.2211
marsaglia-osr-entry 21.9843+-1.4772 21.9124+-1.1741
math-with-out-of-bounds-array-values 21.9509+-1.1997 ? 23.2725+-1.6640 ? might be 1.0602x slower
max-boolean 2.6942+-0.0769 ? 2.7352+-0.0786 ? might be 1.0152x slower
method-on-number 18.6349+-1.3529 17.1440+-0.6715 might be 1.0870x faster
min-boolean 2.8851+-0.4777 2.6718+-0.0779 might be 1.0798x faster
minus-boolean-double 3.1353+-0.1165 3.1278+-0.0943
minus-boolean 2.3303+-0.0283 2.3050+-0.0529 might be 1.0110x faster
misc-strict-eq 32.0894+-3.0129 31.7198+-1.5799 might be 1.0117x faster
mod-boolean-double 11.6727+-0.5125 ? 11.6929+-0.5424 ?
mod-boolean 8.4542+-0.2064 ? 8.5276+-0.4070 ?
mul-boolean-double 3.6330+-0.0978 ? 3.6642+-0.1868 ?
mul-boolean 2.8157+-0.0449 ? 2.8349+-0.1340 ?
neg-boolean 3.2040+-0.2168 ? 3.2236+-0.1867 ?
negative-zero-divide 0.3403+-0.0889 0.3210+-0.0119 might be 1.0603x faster
negative-zero-modulo 0.3307+-0.0179 0.3234+-0.0082 might be 1.0226x faster
negative-zero-negate 0.3207+-0.0410 0.3171+-0.0529 might be 1.0115x faster
nested-function-parsing 44.9587+-3.3444 ? 46.2252+-3.2244 ? might be 1.0282x slower
new-array-buffer-dead 89.4360+-0.6870 ? 92.1055+-2.3942 ? might be 1.0298x slower
new-array-buffer-push 6.2070+-1.0219 5.9761+-0.4335 might be 1.0386x faster
new-array-dead 14.1108+-0.3849 13.5817+-0.8201 might be 1.0390x faster
new-array-push 3.4388+-0.0573 ? 3.4563+-0.1641 ?
no-inline-constructor 31.3398+-0.6795 ? 32.7883+-1.9389 ? might be 1.0462x slower
number-test 2.8885+-0.1302 2.8829+-0.1103
object-closure-call 5.5519+-1.4117 4.9561+-0.2815 might be 1.1202x faster
object-get-own-property-symbols-on-large-array
3.9253+-0.1247 ? 4.6427+-0.6729 ? might be 1.1828x slower
object-test 2.9059+-0.4614 2.6388+-0.0942 might be 1.1012x faster
obvious-sink-pathology-taken 102.4652+-3.8537 102.2292+-4.4896
obvious-sink-pathology 97.8555+-3.6470 96.8885+-2.7929
obviously-elidable-new-object 28.6785+-0.5418 ? 29.2288+-0.3625 ? might be 1.0192x slower
plus-boolean-arith 2.4104+-0.1011 2.3837+-0.0665 might be 1.0112x faster
plus-boolean-double 3.1282+-0.1328 ? 3.1647+-0.1391 ? might be 1.0117x slower
plus-boolean 2.6492+-0.2262 2.6097+-0.0373 might be 1.0151x faster
poly-chain-access-different-prototypes-simple
3.3807+-0.2684 ? 3.4354+-0.7359 ? might be 1.0162x slower
poly-chain-access-different-prototypes 2.8811+-0.0345 ? 2.9038+-0.1748 ?
poly-chain-access-simpler 3.2610+-0.0706 ? 3.2640+-0.0336 ?
poly-chain-access 3.2858+-0.1224 3.2487+-0.0331 might be 1.0114x faster
poly-stricteq 51.6788+-0.7968 51.5071+-3.0235
polymorphic-array-call 1.2077+-0.0318 ? 1.2394+-0.1259 ? might be 1.0262x slower
polymorphic-get-by-id 2.9131+-0.1649 2.8693+-0.1032 might be 1.0153x faster
polymorphic-put-by-id 25.3835+-0.8750 ? 25.6607+-0.9373 ? might be 1.0109x slower
polymorphic-structure 13.0999+-0.1924 ? 13.4473+-0.3115 ? might be 1.0265x slower
polyvariant-monomorphic-get-by-id 6.5502+-1.4450 ? 6.5729+-0.5769 ?
proto-getter-access 8.1264+-0.0743 8.0548+-0.1249
prototype-access-with-mutating-prototype 5.4297+-0.1551 ? 5.5083+-0.1458 ? might be 1.0145x slower
put-by-id-replace-and-transition 8.3113+-1.1512 7.5284+-0.3681 might be 1.1040x faster
put-by-id-slightly-polymorphic 2.8956+-0.5948 2.7136+-0.1234 might be 1.0671x faster
put-by-id 9.9277+-0.8230 9.7745+-0.2481 might be 1.0157x faster
put-by-val-direct 0.3285+-0.0121 ? 0.3344+-0.0407 ? might be 1.0180x slower
put-by-val-large-index-blank-indexing-type
5.4322+-0.6050 5.3682+-0.2687 might be 1.0119x faster
put-by-val-machine-int 2.4142+-0.2101 ? 2.4523+-0.1301 ? might be 1.0158x slower
rare-osr-exit-on-local 14.8058+-0.3517 ? 15.5980+-1.1251 ? might be 1.0535x slower
register-pressure-from-osr 16.5261+-0.2232 ? 16.5311+-0.0608 ?
repeat-multi-get-by-offset 22.9243+-1.6596 22.6870+-1.6223 might be 1.0105x faster
setter-prototype 7.9929+-0.8592 7.5597+-0.3653 might be 1.0573x faster
setter 5.9709+-1.2162 5.6119+-1.0563 might be 1.0640x faster
simple-activation-demo 24.9536+-0.5949 24.8352+-0.5197
simple-getter-access 10.6144+-0.3437 ? 10.6334+-0.4779 ?
simple-poly-call-nested 9.1161+-0.5402 8.7778+-0.4390 might be 1.0385x faster
simple-poly-call 1.4379+-0.4586 1.3480+-0.3718 might be 1.0667x faster
sin-boolean 18.3105+-0.6599 18.0956+-0.4130 might be 1.0119x faster
singleton-scope 59.3531+-2.7158 ? 59.8433+-2.5407 ?
sink-function 9.7374+-1.2433 ? 10.0952+-0.3029 ? might be 1.0367x slower
sink-huge-activation 16.6945+-1.2239 16.2399+-0.4988 might be 1.0280x faster
sinkable-new-object-dag 55.7596+-0.8708 55.6040+-1.7824
sinkable-new-object-taken 43.0992+-1.8525 ? 43.7509+-2.3781 ? might be 1.0151x slower
sinkable-new-object 30.2158+-1.6669 29.9004+-1.0642 might be 1.0105x faster
slow-array-profile-convergence 2.5434+-0.0164 ? 2.5624+-0.1951 ?
slow-convergence 2.4165+-0.1206 2.3785+-0.0892 might be 1.0160x faster
slow-ternaries 17.9556+-0.6368 ? 18.5216+-1.5828 ? might be 1.0315x slower
sorting-benchmark 17.4837+-0.9109 ? 17.5797+-0.9923 ?
sparse-conditional 1.1068+-0.0219 ? 1.1379+-0.0171 ? might be 1.0281x slower
splice-to-remove 12.6773+-0.7283 12.5941+-0.4259
string-char-code-at 14.6116+-0.9458 ? 14.9512+-1.3786 ? might be 1.0232x slower
string-concat-object 2.1562+-0.1474 ? 2.1971+-0.1246 ? might be 1.0189x slower
string-concat-pair-object 2.3087+-0.2517 2.1105+-0.2346 might be 1.0939x faster
string-concat-pair-simple 9.1845+-0.4091 ? 9.2742+-0.4364 ?
string-concat-simple 9.4223+-0.6926 ? 9.8348+-0.4971 ? might be 1.0438x slower
string-cons-repeat 6.5396+-0.2168 ? 6.6136+-0.3737 ? might be 1.0113x slower
string-cons-tower 6.7027+-0.1844 ? 7.1450+-0.5072 ? might be 1.0660x slower
string-equality 15.6179+-0.5769 15.3935+-0.2517 might be 1.0146x faster
string-get-by-val-big-char 6.8282+-0.2032 6.6762+-0.1174 might be 1.0228x faster
string-get-by-val-out-of-bounds-insane 3.4084+-0.2441 ? 3.4189+-0.1750 ?
string-get-by-val-out-of-bounds 4.0852+-0.1302 4.0703+-0.2207
string-get-by-val 2.8434+-0.1178 2.7923+-0.0488 might be 1.0183x faster
string-hash 1.8777+-0.1079 1.8750+-0.0510
string-long-ident-equality 12.8035+-0.4007 ? 13.1295+-1.1315 ? might be 1.0255x slower
string-out-of-bounds 11.4664+-2.5984 10.7268+-0.3664 might be 1.0690x faster
string-repeat-arith 29.1561+-4.0133 28.3716+-2.6119 might be 1.0277x faster
string-sub 54.6891+-2.6272 ? 55.8691+-1.3901 ? might be 1.0216x slower
string-test 3.0932+-0.6517 2.7523+-0.0811 might be 1.1239x faster
string-var-equality 27.0202+-0.7150 ? 27.1647+-0.7421 ?
structure-hoist-over-transitions 2.6932+-1.1548 2.5090+-0.1557 might be 1.0734x faster
substring-concat-weird 36.9243+-1.7632 36.6645+-1.0809
substring-concat 40.9005+-2.7101 40.0550+-0.4989 might be 1.0211x faster
substring 45.9892+-1.6446 45.5529+-0.8871
switch-char-constant 2.7525+-0.3180 2.7253+-0.1565
switch-char 5.6788+-0.6634 ? 6.0493+-1.7805 ? might be 1.0652x slower
switch-constant 7.2534+-0.8842 ? 7.5062+-0.8353 ? might be 1.0348x slower
switch-string-basic-big-var 15.6820+-0.3498 ? 16.4578+-1.8543 ? might be 1.0495x slower
switch-string-basic-big 15.0152+-0.2991 ? 15.5062+-0.6232 ? might be 1.0327x slower
switch-string-basic-var 13.3522+-0.2305 ? 13.5203+-0.6914 ? might be 1.0126x slower
switch-string-basic 13.1345+-0.2449 12.7780+-0.1207 might be 1.0279x faster
switch-string-big-length-tower-var 18.8189+-2.3342 18.3903+-1.5058 might be 1.0233x faster
switch-string-length-tower-var 13.6707+-0.8904 ? 13.6878+-0.4991 ?
switch-string-length-tower 12.0916+-1.0234 ? 12.1678+-0.8041 ?
switch-string-short 12.3218+-1.0066 12.0699+-0.5257 might be 1.0209x faster
switch 12.1093+-1.9052 ? 12.4273+-1.5127 ? might be 1.0263x slower
tear-off-arguments-simple 2.9920+-0.2210 ? 3.0480+-0.2324 ? might be 1.0187x slower
tear-off-arguments 4.1530+-0.2180 ? 4.2695+-0.2502 ? might be 1.0281x slower
temporal-structure 12.4503+-0.5840 ? 12.6002+-0.9921 ? might be 1.0120x slower
to-int32-boolean 13.2928+-0.2184 ? 13.3080+-0.2336 ?
try-catch-get-by-val-cloned-arguments 14.4038+-0.3984 ? 14.8405+-0.9735 ? might be 1.0303x slower
try-catch-get-by-val-direct-arguments 6.8928+-0.2283 6.6060+-0.1539 might be 1.0434x faster
try-catch-get-by-val-scoped-arguments 8.1981+-1.3457 8.1331+-0.7967
typed-array-get-set-by-val-profiling 27.2023+-1.5437 ? 27.8602+-0.8436 ? might be 1.0242x slower
undefined-property-access 237.1367+-8.4459 229.4705+-2.5203 might be 1.0334x faster
undefined-test 2.8498+-0.0366 ? 3.2413+-1.0211 ? might be 1.1374x slower
unprofiled-licm 14.7122+-1.0909 14.4875+-0.2179 might be 1.0155x faster
varargs-call 14.0012+-1.3736 13.9243+-0.5835
varargs-construct-inline 22.0225+-0.3647 ? 23.0604+-1.0028 ? might be 1.0471x slower
varargs-construct 20.3447+-0.8152 ? 21.3850+-1.6085 ? might be 1.0511x slower
varargs-inline 8.5649+-0.0947 ? 8.7050+-0.2491 ? might be 1.0163x slower
varargs-strict-mode 9.6845+-0.8186 9.3750+-0.8853 might be 1.0330x faster
varargs 9.2238+-0.3674 ? 9.2682+-0.2624 ?
weird-inlining-const-prop 2.1058+-0.0909 ? 2.1734+-0.2522 ? might be 1.0321x slower
<geometric> 8.5870+-0.0275 ^ 7.8601+-0.0545 ^ definitely 1.0925x faster
master ic
Geomean of preferred means:
<scaled-result> 26.5452+-0.1642 ^ 26.0774+-0.1446 ^ definitely 1.0179x faster
Created attachment 258297 [details]
Patch
32bit build fix for ByValInfo change
Created attachment 258298 [details]
Patch
More 32bit build fix for ByValInfo change
Just took the Octane and Kraken once more. Performance regression seems solved.
Before the change there's no slow path marking for byValInfo.
That hurt the performance because there's a GetByVal site that takes various strings; e.g. the visitor's dispatcher.
Now, after compiling the StubInfo for GetByVal, if we saw the identifier that has the different content, we mark the site as `tookSlowPath`.
When the site is marked as the `tookSlowPath`, we don't compile it to GetById in DFG.
Benchmark report for Octane on Yusukes-MacBook-Pro (MacBookPro11,3).
VMs tested:
"master" at /Users/yusukesuzuki/development/WebKit/WebKitBuild/master-for-gen3/Release/jsc
"ic" at /Users/yusukesuzuki/development/WebKit/WebKitBuild/gen3/Release/jsc
Collected 4 samples per benchmark/VM, with 4 VM invocations per benchmark. Emitted a call to gc()
between sample measurements. Used 1 benchmark iteration per VM invocation for warm-up. Used the
jsc-specific preciseTime() function to get microsecond-level timing. Reporting benchmark execution
times with 95% confidence intervals in milliseconds.
master ic
encrypt 0.20645+-0.01263 ? 0.20994+-0.00367 ? might be 1.0169x slower
decrypt 3.46799+-0.10343 3.44442+-0.06629
deltablue x2 0.16095+-0.00221 0.15908+-0.00242 might be 1.0117x faster
earley 0.30712+-0.00630 0.30594+-0.00175
boyer 4.23893+-0.03866 4.21954+-0.02187
navier-stokes x2 5.13329+-0.09361 5.10126+-0.05561
raytrace x2 1.04448+-0.10666 1.01682+-0.07716 might be 1.0272x faster
richards x2 0.10228+-0.00219 ? 0.10322+-0.00450 ?
splay x2 0.35144+-0.00406 ? 0.35503+-0.01409 ? might be 1.0102x slower
regexp x2 25.89405+-1.01996 25.76519+-0.83990
pdfjs x2 38.64633+-0.75806 38.30610+-0.38808
mandreel x2 46.51771+-3.05833 45.33829+-0.85716 might be 1.0260x faster
gbemu x2 35.24815+-0.64332 ? 36.02632+-3.49362 ? might be 1.0221x slower
closure 0.57375+-0.00463 ? 0.57742+-0.00819 ?
jquery 7.36228+-0.05250 7.35817+-0.13623
box2d x2 10.25243+-0.14312 ? 10.35483+-0.21798 ?
zlib x2 385.37445+-10.82611 ? 396.58673+-5.99523 ? might be 1.0291x slower
typescript x2 693.66809+-16.90391 681.81860+-15.95877 might be 1.0174x faster
<geometric> 5.79061+-0.07737 5.78389+-0.11579 might be 1.0012x faster
Benchmark report for Kraken on Yusukes-MacBook-Pro (MacBookPro11,3).
VMs tested:
"master" at /Users/yusukesuzuki/development/WebKit/WebKitBuild/master-for-gen3/Release/jsc
"ic" at /Users/yusukesuzuki/development/WebKit/WebKitBuild/gen3/Release/jsc
Collected 4 samples per benchmark/VM, with 4 VM invocations per benchmark. Emitted a call to gc() between sample
measurements. Used 1 benchmark iteration per VM invocation for warm-up. Used the jsc-specific preciseTime()
function to get microsecond-level timing. Reporting benchmark execution times with 95% confidence intervals in
milliseconds.
master ic
ai-astar 240.118+-2.170 ? 241.977+-4.494 ?
audio-beat-detection 59.008+-0.469 58.943+-0.654
audio-dft 100.688+-2.563 99.585+-4.820 might be 1.0111x faster
audio-fft 35.633+-0.196 ? 35.754+-0.339 ?
audio-oscillator 62.934+-0.390 ? 63.350+-3.572 ?
imaging-darkroom 61.746+-4.314 61.457+-2.503
imaging-desaturate 53.199+-5.660 ? 54.540+-5.450 ? might be 1.0252x slower
imaging-gaussian-blur 85.293+-1.125 ? 85.738+-1.710 ?
json-parse-financial 40.263+-2.950 39.565+-2.053 might be 1.0176x faster
json-stringify-tinderbox 23.803+-0.703 ? 24.231+-2.275 ? might be 1.0180x slower
stanford-crypto-aes 43.118+-1.706 42.140+-0.348 might be 1.0232x faster
stanford-crypto-ccm 35.808+-1.734 35.032+-0.476 might be 1.0222x faster
stanford-crypto-pbkdf2 98.387+-3.808 ? 98.696+-3.572 ?
stanford-crypto-sha256-iterative 37.095+-0.561 ? 37.432+-0.843 ?
<arithmetic> 69.792+-0.323 ? 69.889+-0.556 ? might be 1.0014x slower
*** Bug 145001 has been marked as a duplicate of this bug. *** Comment on attachment 258298 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=258298&action=review Can you file a bug for doing the same thing to put_by_val+put_by_id? :-) > Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp:3410 > + if (byValInfo && byValInfo->stubInfo && !byValInfo->tookSlowPath) { Could also check for the BadIdent exit site. In this case tookSlowPath probably covers it, but we often check the exit site anyway. > Source/JavaScriptCore/jit/JITPropertyAccess.cpp:107 > + // FIXME: We need to implement patchableBranch64. Can you link to a bug for this FIXME and clarify more what you mean? Comment on attachment 258298 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=258298&action=review Thank you for your review! I've filed the same improvement for put_by_val. https://bugs.webkit.org/show_bug.cgi?id=147760 >> Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp:3410 >> + if (byValInfo && byValInfo->stubInfo && !byValInfo->tookSlowPath) { > > Could also check for the BadIdent exit site. In this case tookSlowPath probably covers it, but we often check the exit site anyway. I've added it! >> Source/JavaScriptCore/jit/JITPropertyAccess.cpp:107 >> + // FIXME: We need to implement patchableBranch64. > > Can you link to a bug for this FIXME and clarify more what you mean? Yup. Currently, there's no patchableBranch64 helper function in MacroAssembler; it can reduce the following cmp some condition jump_ok pass patchable jump pass: to cmp some condition patchable jump_ng I saw patchableBranchPtr in MacroAssembler under 64bit environments. However, I think the current MacroAssemblerARM64's patchableBranchPtr seems wrong. 2344 PatchableJump patchableBranchPtr(RelationalCondition cond, Address left, TrustedImmPtr right = TrustedImmPtr(0)) 2345 { 2346 m_makeJumpPatchable = true; 2347 Jump result = branch32(cond, left, TrustedImm32(right)); 2348 m_makeJumpPatchable = false; 2349 return PatchableJump(result); 2350 } It truncate the pointer to imm32. (And there's no patchableBranchPtr user in WebKit currently) I've filed the bug. https://bugs.webkit.org/show_bug.cgi?id=147761 And I'll link this. Committed r188105: <http://trac.webkit.org/changeset/188105> Oops. ARMv7 on EFL fails. https://build.webkit.org/builders/EFL%20Linux%20ARMv7%20Traditional%20Release/builds/14344/steps/jscore-test/logs/stdio Hm, it's already failed without this patch? https://build.webkit.org/builders/EFL%20Linux%20ARMv7%20Traditional%20Release/builds/14343 I need to investigate it more... GTK ARMv7 also fails without this patch https://build.webkit.org/builders/GTK%20Linux%20ARM%20Release/builds/8207 So I guess the failure is not caused by this patch. If it's not correct, please point it, sorry. Reopening as it is being rolled out via Bug 147818. Created attachment 258602 [details]
Patch
Comment on attachment 258602 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=258602&action=review Because only ARMv7 related builds fail, we can consider the cause of the bug resides in 32 bit code. And since only baseline / llint option tests fail in EFL / GTK ARM bot, we can consider the bug resides in baseline JIT's 32bit code. So maybe, I've found the bug. Please take a look. At least, JSC tests with 64_32 env in x86 pass. > Source/JavaScriptCore/jit/JITPropertyAccess.cpp:209 > + slowCases.append(emitJumpIfNotJSCell(regT1)); emitJumpIfNotJSCell(RegisterID) is defined in 64 env. But not defined in 32 env. > Source/JavaScriptCore/jit/JITPropertyAccess32_64.cpp:250 > + slowCases.append(branch32(NotEqual, regT3, TrustedImm32(JSValue::CellTag))); Previously, here, we used emitJumpIfNotJSCell. But emitJumpIfNotJSCell(RegisterID) is defined in 64 env. But not defined in 32 env. In 32 bit, only emitJumpIfNotJSCell(int virtualRegister) is defined. Since RegisterID is the simple enum (non C++11 scoped enum), this is implicitly converted to int and the compiler can build it without the errors. Now, we fixed it. > Source/JavaScriptCore/jit/JITPropertyAccess32_64.cpp:255 > + slowCases.append(branchStructure(NotEqual, Address(regT2, JSCell::structureIDOffset()), m_vm->stringStructure.get())); We drop the JSString's StringImpl nullptr check and atomicity check. Because, when m_value StringImpl is defined, we can just compare it with the cached id. 1. StringImpl is nullptr case If the StringImpl of the given string is nullptr, comparison with the cached id fails. 2. StringImpl is non atomic one If the StringImpl of the given string is non atomic one, comparison with the cached id always fails because cached one is always atomic one. So these 2 pointers are not the same. Comment on attachment 258602 [details] Patch Attachment 258602 [details] did not pass mac-ews (mac): Output: http://webkit-queues.webkit.org/results/36302 Number of test failures exceeded the failure limit. Created attachment 258605 [details]
Archive of layout-test-results from ews100 for mac-mavericks
The attached test failures were seen while running run-webkit-tests on the mac-ews.
Bot: ews100 Port: mac-mavericks Platform: Mac OS X 10.9.5
Comment on attachment 258602 [details] Patch Attachment 258602 [details] did not pass mac-wk2-ews (mac-wk2): Output: http://webkit-queues.webkit.org/results/36304 Number of test failures exceeded the failure limit. Created attachment 258606 [details]
Archive of layout-test-results from ews105 for mac-mavericks-wk2
The attached test failures were seen while running run-webkit-tests on the mac-wk2-ews.
Bot: ews105 Port: mac-mavericks-wk2 Platform: Mac OS X 10.9.5
Created attachment 258621 [details]
Patch
Comment on attachment 258621 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=258621&action=review Fixed the mis-rebasing. > Source/JavaScriptCore/jit/JITPropertyAccess.cpp:216 > + loadPtr(Address(regT1, JSString::offsetOfValue()), regT3); Drop the atomic StringImpl checks. > Source/JavaScriptCore/jit/JITPropertyAccess32_64.cpp:250 > + slowCases.append(branch32(NotEqual, regT3, TrustedImm32(JSValue::CellTag))); Use `branch32(NotEqual, regT3, TrustedImm32(JSValue::CellTag))` instead of emitJumpIfNotJSCell. > Source/JavaScriptCore/jit/JITPropertyAccess32_64.cpp:257 > + } Drop the atomic / StringImpl check. if the extracted StringImpl pointer is either nullptr or non-atomic pointer, comparison with the cached id always fails. Comment on attachment 258621 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=258621&action=review Copy & Paste the notes from the previous patch. Because only ARMv7 related builds fail, we can consider the cause of the bug resides in 32 bit code. And since only baseline / llint option tests fail in EFL / GTK ARM bot, we can consider the bug resides in baseline JIT's 32bit code. So maybe, I've found the bug. Please take a look. At least, JSC tests with 64_32 env in x86 pass. > Source/JavaScriptCore/jit/JITPropertyAccess.cpp:210 > + slowCases.append(emitJumpIfNotJSCell(regT1)); emitJumpIfNotJSCell(RegisterID) is defined in 64 env. But not defined in 32 env. >> Source/JavaScriptCore/jit/JITPropertyAccess32_64.cpp:250 >> + slowCases.append(branch32(NotEqual, regT3, TrustedImm32(JSValue::CellTag))); > > Use `branch32(NotEqual, regT3, TrustedImm32(JSValue::CellTag))` instead of emitJumpIfNotJSCell. Previously, here, we used emitJumpIfNotJSCell. But emitJumpIfNotJSCell(RegisterID) is defined in 64 env. But not defined in 32 env. In 32 bit, only emitJumpIfNotJSCell(int virtualRegister) is defined. Since RegisterID is the simple enum (non C++11 scoped enum), this is implicitly converted to int. >> Source/JavaScriptCore/jit/JITPropertyAccess32_64.cpp:257 >> + } > > Drop the atomic / StringImpl check. > if the extracted StringImpl pointer is either nullptr or non-atomic pointer, comparison with the cached id always fails. We drop the JSString's StringImpl nullptr check and atomicity check. Because, when m_value StringImpl is defined, we can just compare it with the cached id. 1. StringImpl is nullptr case If the StringImpl of the given string is nullptr, comparison with the cached id fails. 2. StringImpl is non atomic one If the StringImpl of the given string is non atomic one, comparison with the cached id always fails because cached one is always atomic one. So these 2 pointers are not the same. Created attachment 258644 [details]
Patch
Comment on attachment 258644 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=258644&action=review Move the notes from the previously submitted patch. Because only ARMv7 related builds fail, we can consider the cause of the bug resides in 32 bit code. And since only baseline / llint option tests fail in EFL / GTK ARM bot, we can consider the bug resides in baseline JIT's 32bit code. So maybe, I've found the bug. Please take a look. At least, JSC tests with 64_32 env in x86 pass. I added the notes which are different from the roll-outed patch. The major changes are the following 3 parts. 1. emitJumpIfNotJSCell in 32bit is replaced with `branch32(NotEqual, regT3, TrustedImm32(JSValue::CellTag))`. This seems the cause of this failure. 2. Drop the atomic StringImpl checks. It's just an optimization. 3. Split the doneCases into fastDoneCase (done) and slowDoneCase (nextHotPath). It's just an optimization. > Source/JavaScriptCore/jit/JITPropertyAccess.cpp:212 > + slowCases.append(emitJumpIfNotJSCell(regT1)); emitJumpIfNotJSCell(RegisterID) is defined in 64 env. But not defined in 32 env. > Source/JavaScriptCore/jit/JITPropertyAccess.cpp:219 > + } We drop the JSString's StringImpl nullptr check and atomicity check. Because, when m_value StringImpl is defined, we can just compare it with the cached id. 1. StringImpl is nullptr case If the StringImpl of the given string is nullptr, comparison with the cached id fails. 2. StringImpl is non atomic one If the StringImpl of the given string is non atomic one, comparison with the cached id always fails because cached one is always atomic one. So these 2 pointers are not the same. > Source/JavaScriptCore/jit/JITPropertyAccess.cpp:1058 > + patchBuffer.link(slowDoneCase, byValInfo->badTypeJump.labelAtOffset(byValInfo->badTypeJumpToNextHotPath)); And since callOperation (with profile tag), already has (1) profiling the value and (2) storing it to the dst register, we separate the doneCases into done & nextHotPath. When we run the fast path code by JITGetByIdGenerator, we jump to done. Later, in the hot path, value profiling and storing the result to dst will be executed. But when we fall into the cold path of the JITGetByIdGenerator, since it calls `callOperation(WithProfile, ...)`, we can remove the above profiling and storing. So we jump to the nextHotPath case. > Source/JavaScriptCore/jit/JITPropertyAccess32_64.cpp:252 > + slowCases.append(branch32(NotEqual, regT3, TrustedImm32(JSValue::CellTag))); Previously, here, we used emitJumpIfNotJSCell. But emitJumpIfNotJSCell(RegisterID) is defined in 64 env. But not defined in 32 env. In 32 bit, only emitJumpIfNotJSCell(int virtualRegister) is defined. Since RegisterID is the simple enum (non C++11 scoped enum), this is implicitly converted to int. I've ran the test which reproduced the crash with the latest patch and I'm no longer seeing the crash. (In reply to comment #58) > I've ran the test which reproduced the crash with the latest patch and I'm > no longer seeing the crash. Thank you so much! It helps me a lot :-) Committed r188299: <http://trac.webkit.org/changeset/188299> This improves the following benchmark result :) http://arewefastyet.com/#machine=29&view=single&suite=misc&subtest=bugs-1131099-lodash1 |
Current get_by_val only considers the indexed keys, it profiles ArrayMode (or checks whether the base is String), and generates vector access code in baseline JIT. And this profiled array mode information is leveraged in DFG layer to produce the faster code. But after ES6 symbols are used, this IC miss the optimization chance since users will use the indexed access form `object[symbol]` with non-indexed (symbol) value. Code generated by the IC will become the following, if (subscript != seenSymbol) bailout; ... normal load by IC code (checking Structures and load the value with the offset)