Bug 147480 - Introduce get_by_id like IC into get_by_val when the given name is String or Symbol
Summary: Introduce get_by_id like IC into get_by_val when the given name is String or ...
Status: RESOLVED FIXED
Alias: None
Product: WebKit
Classification: Unclassified
Component: JavaScriptCore (show other bugs)
Version: 528+ (Nightly build)
Hardware: Unspecified Unspecified
: P2 Normal
Assignee: Yusuke Suzuki
URL:
Keywords:
: 145001 (view as bug list)
Depends on: 147818
Blocks:
  Show dependency treegraph
 
Reported: 2015-07-30 19:25 PDT by Yusuke Suzuki
Modified: 2015-08-12 00:01 PDT (History)
7 users (show)

See Also:


Attachments
Patch (21.54 KB, patch)
2015-07-31 11:03 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (34.20 KB, patch)
2015-07-31 12:27 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (15.54 KB, patch)
2015-08-02 01:24 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (15.54 KB, patch)
2015-08-02 01:28 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (20.37 KB, patch)
2015-08-03 13:34 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (26.01 KB, patch)
2015-08-03 20:37 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (31.14 KB, patch)
2015-08-03 21:29 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (46.05 KB, patch)
2015-08-04 00:24 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (46.18 KB, patch)
2015-08-04 14:19 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (47.13 KB, patch)
2015-08-04 15:41 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (47.55 KB, patch)
2015-08-04 17:20 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (49.25 KB, patch)
2015-08-04 17:51 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (87.21 KB, patch)
2015-08-04 19:50 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (101.43 KB, patch)
2015-08-05 01:39 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (102.27 KB, patch)
2015-08-05 01:49 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (102.28 KB, patch)
2015-08-05 02:01 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (147.00 KB, patch)
2015-08-05 13:33 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (147.05 KB, patch)
2015-08-05 13:50 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (147.52 KB, patch)
2015-08-05 13:59 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (105.94 KB, patch)
2015-08-09 18:42 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Archive of layout-test-results from ews100 for mac-mavericks (414.46 KB, application/zip)
2015-08-09 19:32 PDT, Build Bot
no flags Details
Archive of layout-test-results from ews105 for mac-mavericks-wk2 (415.90 KB, application/zip)
2015-08-09 19:36 PDT, Build Bot
no flags Details
Patch (146.93 KB, patch)
2015-08-10 10:47 PDT, Yusuke Suzuki
no flags Details | Formatted Diff | Diff
Patch (147.91 KB, patch)
2015-08-10 13:19 PDT, Yusuke Suzuki
fpizlo: review+
Details | Formatted Diff | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Yusuke Suzuki 2015-07-30 19:25:36 PDT
Current get_by_val only considers the indexed keys, it profiles ArrayMode (or checks whether the base is String), and generates vector access code in baseline JIT.
And this profiled array mode information is leveraged in DFG layer to produce the faster code.

But after ES6 symbols are used, this IC miss the optimization chance since users will use the indexed access form `object[symbol]` with non-indexed (symbol) value.

Code generated by the IC will become the following,

if (subscript != seenSymbol)
    bailout;
... normal load by IC code (checking Structures and load the value with the offset)
Comment 1 Filip Pizlo 2015-07-30 19:27:11 PDT
... or when the given name is a String
Comment 2 Yusuke Suzuki 2015-07-31 11:03:23 PDT
Created attachment 257931 [details]
Patch

WIP: adding inlined self IC compiler into get_by_val
Comment 3 Yusuke Suzuki 2015-07-31 12:27:07 PDT
Created attachment 257942 [details]
Patch

WIP: adding identifier check patching into IC
Comment 4 Filip Pizlo 2015-07-31 12:38:18 PDT
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 5 Yusuke Suzuki 2015-07-31 13:34:13 PDT
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.
Comment 6 Filip Pizlo 2015-07-31 13:43:09 PDT
(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
Comment 7 Yusuke Suzuki 2015-07-31 13:45:42 PDT
(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!
Comment 8 Yusuke Suzuki 2015-08-02 01:24:45 PDT
Created attachment 258031 [details]
Patch

WIP: Adding IC into baseline 64 JIT, baseline 32_64, DFG is not yet
Comment 9 Yusuke Suzuki 2015-08-02 01:28:04 PDT
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
Comment 10 Yusuke Suzuki 2015-08-03 13:34:07 PDT
Created attachment 258105 [details]
Patch

WIP: Adding baseline 32_64. DFG is not yet
Comment 11 Yusuke Suzuki 2015-08-03 20:37:53 PDT
Created attachment 258149 [details]
Patch

WIP: baseline fix. Working on DFG...
Comment 12 Yusuke Suzuki 2015-08-03 20:49:47 PDT
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.
Comment 13 Yusuke Suzuki 2015-08-03 21:29:41 PDT
Created attachment 258153 [details]
Patch

WIP: adding SymbolUse. And fix bug in baseline side
Comment 14 Yusuke Suzuki 2015-08-04 00:24:50 PDT
Created attachment 258160 [details]
Patch

WIP: partial DFG/FTL. still fixing issues
Comment 15 Yusuke Suzuki 2015-08-04 12:11:32 PDT
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();
Comment 16 Yusuke Suzuki 2015-08-04 14:19:51 PDT
Created attachment 258209 [details]
Patch

WIP: progress in string handling in DFG, still working on SymbolUse
Comment 17 Yusuke Suzuki 2015-08-04 15:41:53 PDT
Created attachment 258222 [details]
Patch

WIP: fixing crashes in DFG
Comment 18 Yusuke Suzuki 2015-08-04 17:20:13 PDT
Created attachment 258242 [details]
Patch

WIP: implementation is done, now running benchmarks
Comment 19 Yusuke Suzuki 2015-08-04 17:51:12 PDT
Created attachment 258246 [details]
Patch

WIP: fixed issues
Comment 20 Yusuke Suzuki 2015-08-04 17:52:52 PDT
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
Comment 21 Yusuke Suzuki 2015-08-04 18:05:58 PDT
I'll add some synthetic benchmarks to js/regress to measure the performance benefit.
Comment 22 Filip Pizlo 2015-08-04 18:57:06 PDT
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.
Comment 23 Yusuke Suzuki 2015-08-04 19:50:45 PDT
Created attachment 258259 [details]
Patch

WIP: added synthetic benchmarks
Comment 24 Yusuke Suzuki 2015-08-04 20:25:55 PDT
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.
Comment 25 Yusuke Suzuki 2015-08-04 20:29:07 PDT
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 26 Filip Pizlo 2015-08-04 20:35:22 PDT
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 27 Yusuke Suzuki 2015-08-04 20:41:53 PDT
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.
Comment 28 Yusuke Suzuki 2015-08-05 01:39:09 PDT
Created attachment 258270 [details]
Patch
Comment 29 Yusuke Suzuki 2015-08-05 01:49:32 PDT
Created attachment 258271 [details]
Patch

32bit build fix
Comment 30 Yusuke Suzuki 2015-08-05 02:01:38 PDT
Created attachment 258272 [details]
Patch

32bit build fix, and checked with run-javascriptcore-tests --32-bit
Comment 31 Yusuke Suzuki 2015-08-05 02:03:52 PDT
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.
Comment 32 Yusuke Suzuki 2015-08-05 10:46:14 PDT
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.
Comment 33 Yusuke Suzuki 2015-08-05 11:33:39 PDT
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)
Comment 34 Yusuke Suzuki 2015-08-05 13:33:34 PDT
Created attachment 258296 [details]
Patch

Fix the performance regressions
Comment 35 Yusuke Suzuki 2015-08-05 13:36:19 PDT
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
Comment 36 Yusuke Suzuki 2015-08-05 13:50:45 PDT
Created attachment 258297 [details]
Patch

32bit build fix for ByValInfo change
Comment 37 Yusuke Suzuki 2015-08-05 13:59:35 PDT
Created attachment 258298 [details]
Patch

More 32bit build fix for ByValInfo change
Comment 38 Yusuke Suzuki 2015-08-05 14:52:17 PDT
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
Comment 39 Yusuke Suzuki 2015-08-05 20:15:06 PDT
*** Bug 145001 has been marked as a duplicate of this bug. ***
Comment 40 Filip Pizlo 2015-08-06 17:42:19 PDT
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 41 Yusuke Suzuki 2015-08-06 18:09:46 PDT
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.
Comment 42 Yusuke Suzuki 2015-08-06 19:08:22 PDT
Committed r188105: <http://trac.webkit.org/changeset/188105>
Comment 44 Yusuke Suzuki 2015-08-07 01:00:23 PDT
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...
Comment 45 Yusuke Suzuki 2015-08-07 01:03:06 PDT
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.
Comment 46 Chris Dumez 2015-08-09 15:10:52 PDT
Reopening as it is being rolled out via Bug 147818.
Comment 47 Yusuke Suzuki 2015-08-09 18:42:02 PDT
Created attachment 258602 [details]
Patch
Comment 48 Yusuke Suzuki 2015-08-09 18:49:47 PDT
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 49 Build Bot 2015-08-09 19:32:46 PDT
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.
Comment 50 Build Bot 2015-08-09 19:32:52 PDT
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 51 Build Bot 2015-08-09 19:36:06 PDT
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.
Comment 52 Build Bot 2015-08-09 19:36:10 PDT
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
Comment 53 Yusuke Suzuki 2015-08-10 10:47:28 PDT
Created attachment 258621 [details]
Patch
Comment 54 Yusuke Suzuki 2015-08-10 10:50:13 PDT
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 55 Yusuke Suzuki 2015-08-10 11:07:24 PDT
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.
Comment 56 Yusuke Suzuki 2015-08-10 13:19:15 PDT
Created attachment 258644 [details]
Patch
Comment 57 Yusuke Suzuki 2015-08-10 13:27:41 PDT
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.
Comment 58 Ryosuke Niwa 2015-08-10 18:49:38 PDT
I've ran the test which reproduced the crash with the latest patch and I'm no longer seeing the crash.
Comment 59 Yusuke Suzuki 2015-08-10 18:53:09 PDT
(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 :-)
Comment 60 Yusuke Suzuki 2015-08-11 15:02:31 PDT
Committed r188299: <http://trac.webkit.org/changeset/188299>
Comment 61 Yusuke Suzuki 2015-08-12 00:01:29 PDT
This improves the following benchmark result :)
http://arewefastyet.com/#machine=29&view=single&suite=misc&subtest=bugs-1131099-lodash1