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: |
|
Description
Yusuke Suzuki
2015-07-30 19:25:36 PDT
... 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 |