Bug 145364 - Array#reduce and reduceRight don't follow ToLength
Summary: Array#reduce and reduceRight don't follow ToLength
Status: RESOLVED FIXED
Alias: None
Product: WebKit
Classification: Unclassified
Component: JavaScriptCore (show other bugs)
Version: 528+ (Nightly build)
Hardware: Unspecified Unspecified
: P2 Normal
Assignee: Jordan Harband
URL:
Keywords:
Depends on: 144128
Blocks:
  Show dependency treegraph
 
Reported: 2015-05-24 21:19 PDT by Jordan Harband
Modified: 2015-05-31 02:29 PDT (History)
6 users (show)

See Also:


Attachments
Patch (6.16 KB, patch)
2015-05-24 21:21 PDT, Jordan Harband
no flags Details | Formatted Diff | Diff
Patch (12.61 KB, patch)
2015-05-24 21:53 PDT, Jordan Harband
no flags Details | Formatted Diff | Diff
Archive of layout-test-results from ews102 for mac-mavericks (557.79 KB, application/zip)
2015-05-24 22:24 PDT, Build Bot
no flags Details
Archive of layout-test-results from ews104 for mac-mavericks-wk2 (549.80 KB, application/zip)
2015-05-24 22:45 PDT, Build Bot
no flags Details
Patch (14.81 KB, patch)
2015-05-25 01:51 PDT, Jordan Harband
no flags Details | Formatted Diff | Diff
Archive of layout-test-results from ews101 for mac-mavericks (560.75 KB, application/zip)
2015-05-25 02:40 PDT, Build Bot
no flags Details
Archive of layout-test-results from ews106 for mac-mavericks-wk2 (589.70 KB, application/zip)
2015-05-25 02:47 PDT, Build Bot
no flags Details
Patch (20.39 KB, patch)
2015-05-25 03:07 PDT, Jordan Harband
no flags Details | Formatted Diff | Diff
Patch (17.86 KB, patch)
2015-05-27 21:49 PDT, Jordan Harband
no flags Details | Formatted Diff | Diff
Patch (17.92 KB, patch)
2015-05-28 23:21 PDT, Jordan Harband
no flags Details | Formatted Diff | Diff
Patch (17.92 KB, patch)
2015-05-29 00:01 PDT, Jordan Harband
no flags Details | Formatted Diff | Diff
Patch (22.14 KB, patch)
2015-05-30 10:57 PDT, Jordan Harband
no flags Details | Formatted Diff | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Jordan Harband 2015-05-24 21:19:40 PDT
Per https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength, all array methods (specifically reduce and reduceRight) should take negative lengths and clamp them to 0, and lengths > 2^53 - 1, and clamp them to 2^53 - 1.
Comment 1 Jordan Harband 2015-05-24 21:21:25 PDT
Created attachment 253671 [details]
Patch
Comment 2 Jordan Harband 2015-05-24 21:53:00 PDT
Created attachment 253672 [details]
Patch
Comment 3 Build Bot 2015-05-24 22:23:59 PDT
Comment on attachment 253672 [details]
Patch

Attachment 253672 [details] did not pass mac-ews (mac):
Output: http://webkit-queues.appspot.com/results/4873211888009216

Number of test failures exceeded the failure limit.
Comment 4 Build Bot 2015-05-24 22:24:02 PDT
Created attachment 253673 [details]
Archive of layout-test-results from ews102 for mac-mavericks

The attached test failures were seen while running run-webkit-tests on the mac-ews.
Bot: ews102  Port: mac-mavericks  Platform: Mac OS X 10.9.5
Comment 5 Jordan Harband 2015-05-24 22:30:29 PDT
I'm not sure how to deal with the EWS issues. Any help would be appreciated.
Comment 6 Filip Pizlo 2015-05-24 22:38:52 PDT
(In reply to comment #5)
> I'm not sure how to deal with the EWS issues. Any help would be appreciated.

Your patch fails many JavaScript tests in the ietestcenter and sputnik test suites.  You can run these using run-webkit-tests.
Comment 7 Jordan Harband 2015-05-24 22:40:22 PDT
(In reply to comment #6)
> (In reply to comment #5)
> > I'm not sure how to deal with the EWS issues. Any help would be appreciated.
> 
> Your patch fails many JavaScript tests in the ietestcenter and sputnik test
> suites.  You can run these using run-webkit-tests.

Yes, I do see the results - but I'm confused about where the line is between 64-bit ints in ToLength, and 32-but ints in arrays. There doesn't seem to be a single code path that will throw a RangeError when the length is > 32 bits, and it seems like most of the code hands around 32-bit integers as lengths instead, which won't allow for easy spec compliance.
Comment 8 Filip Pizlo 2015-05-24 22:43:02 PDT
(In reply to comment #7)
> (In reply to comment #6)
> > (In reply to comment #5)
> > > I'm not sure how to deal with the EWS issues. Any help would be appreciated.
> > 
> > Your patch fails many JavaScript tests in the ietestcenter and sputnik test
> > suites.  You can run these using run-webkit-tests.
> 
> Yes, I do see the results - but I'm confused about where the line is between
> 64-bit ints in ToLength, and 32-but ints in arrays. There doesn't seem to be
> a single code path that will throw a RangeError when the length is > 32
> bits, and it seems like most of the code hands around 32-bit integers as
> lengths instead, which won't allow for easy spec compliance.

Well, a JSArray does still have a length that is defined as being a 31-bit unsigned integer.  We're not going to change that anytime soon, and my understanding is that ES still defines array.length this way for primitive JS arrays.  Making changes to allow array prototype methods to work with larger lengths needs to be very mindful of this.
Comment 9 Build Bot 2015-05-24 22:45:37 PDT
Comment on attachment 253672 [details]
Patch

Attachment 253672 [details] did not pass mac-wk2-ews (mac-wk2):
Output: http://webkit-queues.appspot.com/results/6625480161624064

Number of test failures exceeded the failure limit.
Comment 10 Build Bot 2015-05-24 22:45:39 PDT
Created attachment 253674 [details]
Archive of layout-test-results from ews104 for mac-mavericks-wk2

The attached test failures were seen while running run-webkit-tests on the mac-wk2-ews.
Bot: ews104  Port: mac-mavericks-wk2  Platform: Mac OS X 10.9.5
Comment 11 Jordan Harband 2015-05-24 22:50:19 PDT
(In reply to comment #8)
> (In reply to comment #7)
> > (In reply to comment #6)
> > > (In reply to comment #5)
> > > > I'm not sure how to deal with the EWS issues. Any help would be appreciated.
> > > 
> > > Your patch fails many JavaScript tests in the ietestcenter and sputnik test
> > > suites.  You can run these using run-webkit-tests.
> > 
> > Yes, I do see the results - but I'm confused about where the line is between
> > 64-bit ints in ToLength, and 32-but ints in arrays. There doesn't seem to be
> > a single code path that will throw a RangeError when the length is > 32
> > bits, and it seems like most of the code hands around 32-bit integers as
> > lengths instead, which won't allow for easy spec compliance.
> 
> Well, a JSArray does still have a length that is defined as being a 31-bit
> unsigned integer.  We're not going to change that anytime soon, and my
> understanding is that ES still defines array.length this way for primitive
> JS arrays.  Making changes to allow array prototype methods to work with
> larger lengths needs to be very mindful of this.

OK - in this case I think this might be beyond my C knowledge, so I'll leave the bug open for someone else to take over.
Comment 12 Yusuke Suzuki 2015-05-25 00:12:23 PDT
(In reply to comment #11)
> (In reply to comment #8)
> > (In reply to comment #7)
> > > (In reply to comment #6)
> > > > (In reply to comment #5)
> > > > > I'm not sure how to deal with the EWS issues. Any help would be appreciated.
> > > > 
> > > > Your patch fails many JavaScript tests in the ietestcenter and sputnik test
> > > > suites.  You can run these using run-webkit-tests.
> > > 
> > > Yes, I do see the results - but I'm confused about where the line is between
> > > 64-bit ints in ToLength, and 32-but ints in arrays. There doesn't seem to be
> > > a single code path that will throw a RangeError when the length is > 32
> > > bits, and it seems like most of the code hands around 32-bit integers as
> > > lengths instead, which won't allow for easy spec compliance.
> > 
> > Well, a JSArray does still have a length that is defined as being a 31-bit
> > unsigned integer.  We're not going to change that anytime soon, and my
> > understanding is that ES still defines array.length this way for primitive
> > JS arrays.  Making changes to allow array prototype methods to work with
> > larger lengths needs to be very mindful of this.
> 
> OK - in this case I think this might be beyond my C knowledge, so I'll leave
> the bug open for someone else to take over.

I suggest that we can start it from the simplest point; implementing Array.prototype{reduce,reduceRight} in builtins JS (with using @ToLength).

It gives the following benefits.

1. provide better inlining functionality for callbacks
2. become speculative type aware; even if length is allowed to use 2**53 - 1, the length is within uint32_t in practice

Note:
If we write it in C++, the best way I think is writing the 2 loops, one for array-index range [0, UINT32_MAX) and one for the out of range [UINT32_MAX, 2**53 - 1].
In array-index range, we can use indexed property access operations. But in the out of this range, we should use Identifier based property access operations.
Comment 13 Jordan Harband 2015-05-25 01:49:40 PDT
I decided to just rewrite the functions in JS. Patch incoming.
Comment 14 Jordan Harband 2015-05-25 01:51:25 PDT
Created attachment 253676 [details]
Patch
Comment 15 Build Bot 2015-05-25 02:40:40 PDT
Comment on attachment 253676 [details]
Patch

Attachment 253676 [details] did not pass mac-ews (mac):
Output: http://webkit-queues.appspot.com/results/6498864525737984

New failing tests:
js/dom/array-prototype-properties.html
Comment 16 Build Bot 2015-05-25 02:40:44 PDT
Created attachment 253678 [details]
Archive of layout-test-results from ews101 for mac-mavericks

The attached test failures were seen while running run-webkit-tests on the mac-ews.
Bot: ews101  Port: mac-mavericks  Platform: Mac OS X 10.9.5
Comment 17 Build Bot 2015-05-25 02:47:26 PDT
Comment on attachment 253676 [details]
Patch

Attachment 253676 [details] did not pass mac-wk2-ews (mac-wk2):
Output: http://webkit-queues.appspot.com/results/6184071340228608

New failing tests:
js/dom/array-prototype-properties.html
Comment 18 Build Bot 2015-05-25 02:47:29 PDT
Created attachment 253679 [details]
Archive of layout-test-results from ews106 for mac-mavericks-wk2

The attached test failures were seen while running run-webkit-tests on the mac-wk2-ews.
Bot: ews106  Port: mac-mavericks-wk2  Platform: Mac OS X 10.9.5
Comment 19 Jordan Harband 2015-05-25 03:07:31 PDT
Created attachment 253680 [details]
Patch
Comment 20 Yusuke Suzuki 2015-05-26 04:25:44 PDT
Comment on attachment 253680 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=253680&action=review

And I suggest taking the benchmarks results because the performance of `reduce` is relatively important.

We can take the result by executing,
Tools/Scripts/run-jsc-benchmarks Baseline:<path to baseline jsc> Patched:<path to jsc with this patch>

> Source/JavaScriptCore/ChangeLog:31
> +

Could you update the ChangeLog? This entry should be locate on the top of ChangeLog.
`ToString`, `Push`, `Splice` is not related to this patch.

> Source/JavaScriptCore/builtins/Array.prototype.js:44
> +    if (arguments.length > 1) {

unnecessary braces.

> Source/JavaScriptCore/builtins/Array.prototype.js:47
> +        while (k < length && !(k in array)) { k += 1; }

Nits: don't use braces if it's one line. And while and body needs a line break.
like,
while (k < length && !(k in array))
    k += 1;

> Source/JavaScriptCore/builtins/Array.prototype.js:79
> +    if (arguments.length > 1) {

Ditto.

> Source/JavaScriptCore/builtins/Array.prototype.js:82
> +        while (k >= 0 && !(k in array)) { k -= 1; }

Ditto.

> LayoutTests/ChangeLog:24
> +

Update the ChangeLog.

> LayoutTests/js/dom/script-tests/array-prototype-properties.js:20
> +shouldThrow("Array.prototype.some.call(undefined, function () {})");

Why are these modified?
Comment 21 Jordan Harband 2015-05-27 21:49:02 PDT
Created attachment 253832 [details]
Patch
Comment 22 Jordan Harband 2015-05-28 23:21:11 PDT
Created attachment 253895 [details]
Patch
Comment 23 Jordan Harband 2015-05-28 23:54:22 PDT
Ran the benchmarks:

Benchmark report for SunSpider, LongSpider, V8Spider, and JSRegress on Jordans-MacBook-Pro (MacBookPro11,3).

VMs tested:
"Baseline" at /Users/ljharb/Dropbox/git/WebKit.git/WebKitBuild/Release/jsc
"Patched" at /Users/ljharb/Dropbox/git/WebKit.git/WebKitBuild/array_reduce_tolength/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.

                                                      Baseline                  Patched                                      
SunSpider:
   3d-cube                                         4.4483+-0.3899            4.3946+-0.2109          might be 1.0122x faster
   3d-morph                                        5.1868+-0.3576     ?      5.3343+-0.4639        ? might be 1.0284x slower
   3d-raytrace                                     5.7186+-0.7682            5.2552+-0.3969          might be 1.0882x faster
   access-binary-trees                             2.0643+-0.3178     ?      2.1298+-0.3983        ? might be 1.0317x slower
   access-fannkuch                                 5.3824+-0.6457            5.2739+-0.2778          might be 1.0206x faster
   access-nbody                                    2.5883+-0.1450            2.5565+-0.0990          might be 1.0124x faster
   access-nsieve                                   2.9964+-0.3241            2.9557+-0.2325          might be 1.0138x faster
   bitops-3bit-bits-in-byte                        1.4949+-0.1579            1.4450+-0.0719          might be 1.0345x faster
   bitops-bits-in-byte                             3.5685+-0.6309            3.4225+-0.7752          might be 1.0426x faster
   bitops-bitwise-and                              1.9857+-0.1290     ?      2.0587+-0.1817        ? might be 1.0367x slower
   bitops-nsieve-bits                              2.9736+-0.4570            2.8569+-0.1380          might be 1.0408x faster
   controlflow-recursive                           2.2300+-0.8364            1.9053+-0.1085          might be 1.1704x faster
   crypto-aes                                      3.9025+-0.6497            3.7808+-0.2425          might be 1.0322x faster
   crypto-md5                                      2.4333+-0.1277     ?      2.8038+-0.9898        ? might be 1.1523x slower
   crypto-sha1                                     2.8663+-0.3901            2.5287+-0.5533          might be 1.1335x faster
   date-format-tofte                               6.8653+-0.3710            6.8561+-0.6342        
   date-format-xparb                               4.7546+-0.3557     ?      5.3268+-1.1815        ? might be 1.1203x slower
   math-cordic                                     2.7652+-0.1848     ?      2.8775+-0.2110        ? might be 1.0406x slower
   math-partial-sums                               4.3969+-0.2361     ?      4.5852+-0.5020        ? might be 1.0428x slower
   math-spectral-norm                              1.8138+-0.2293            1.7302+-0.1488          might be 1.0484x faster
   regexp-dna                                      6.0910+-0.2303     ?      6.2360+-0.1437        ? might be 1.0238x slower
   string-base64                                   4.0392+-0.0833     ?      4.3887+-0.4602        ? might be 1.0865x slower
   string-fasta                                    5.9215+-0.7147     ?      7.3121+-4.3438        ? might be 1.2348x slower
   string-tagcloud                                 7.8597+-0.1788     ?      7.8877+-0.1163        ?
   string-unpack-code                             18.7525+-0.8782     ?     18.8445+-1.2668        ?
   string-validate-input                           4.5685+-0.4544            4.3610+-0.2292          might be 1.0476x faster

   <arithmetic>                                    4.5257+-0.0793     ?      4.5811+-0.1740        ? might be 1.0122x slower

                                                      Baseline                  Patched                                      
LongSpider:
   3d-cube                                       791.9592+-8.7784     ?    797.8406+-31.3228       ?
   3d-morph                                     1518.1199+-36.4964        1501.2363+-15.0437         might be 1.0112x faster
   3d-raytrace                                   674.2609+-26.3730         672.6521+-57.8660       
   access-binary-trees                           857.4426+-64.1390         823.7007+-26.2919         might be 1.0410x faster
   access-fannkuch                               276.0776+-16.0742    ?    280.3853+-12.1282       ? might be 1.0156x slower
   access-nbody                                  566.2078+-35.5526         557.9118+-16.4075         might be 1.0149x faster
   access-nsieve                                 362.0334+-10.2146    ?    386.8407+-57.1546       ? might be 1.0685x slower
   bitops-3bit-bits-in-byte                       43.5438+-2.4746           40.4972+-1.1120          might be 1.0752x faster
   bitops-bits-in-byte                            81.4824+-6.6918     ?     86.0085+-6.0079        ? might be 1.0555x slower
   bitops-nsieve-bits                            407.9085+-18.8825    ?    411.2543+-13.8296       ?
   controlflow-recursive                         472.8563+-14.4254         455.5620+-16.8880         might be 1.0380x faster
   crypto-aes                                    591.2748+-35.0733    ?    602.7316+-58.0980       ? might be 1.0194x slower
   crypto-md5                                    532.2205+-50.9372         508.9590+-33.0362         might be 1.0457x faster
   crypto-sha1                                   587.5639+-20.8652         584.2053+-6.2175        
   date-format-tofte                             540.3008+-31.5623    ?    543.4084+-38.7834       ?
   date-format-xparb                             650.1973+-18.6158    ?    658.8145+-13.9406       ? might be 1.0133x slower
   hash-map                                      157.6827+-18.3652         150.8104+-7.6703          might be 1.0456x faster
   math-cordic                                   541.4682+-28.5625         506.7944+-8.2335          might be 1.0684x faster
   math-partial-sums                             439.7106+-38.3390         434.5372+-33.3070         might be 1.0119x faster
   math-spectral-norm                            567.4692+-22.4909         559.2260+-13.3673         might be 1.0147x faster
   string-base64                                 338.3475+-21.2178    ?    341.4330+-29.0532       ?
   string-fasta                                  397.9070+-54.6912         376.6193+-24.8705         might be 1.0565x faster
   string-tagcloud                               182.3983+-5.4005     ?    187.3492+-6.5794        ? might be 1.0271x slower

   <geometric>                                   404.3514+-5.0314          400.9658+-6.4636          might be 1.0084x faster

                                                      Baseline                  Patched                                      
V8Spider:
   crypto                                         60.5027+-7.9288     ?     61.9313+-7.1068        ? might be 1.0236x slower
   deltablue                                      95.2670+-4.8961           86.0731+-19.4149         might be 1.1068x faster
   earley-boyer                                   45.3255+-3.7627           42.4238+-0.8528          might be 1.0684x faster
   raytrace                                       35.9045+-3.1593           35.7477+-4.0434        
   regexp                                         73.8725+-6.0013           71.4680+-3.4743          might be 1.0336x faster
   richards                                      102.9329+-52.3560          91.1306+-4.2207          might be 1.1295x faster
   splay                                          37.8393+-9.3046     ?     38.2735+-11.1325       ? might be 1.0115x slower

   <geometric>                                    59.3248+-4.0714           57.0576+-1.4768          might be 1.0397x faster

                                                      Baseline                  Patched                                      
JSRegress:
   abs-boolean                                     2.3695+-0.1108     ?      2.4168+-0.3178        ? might be 1.0200x slower
   adapt-to-double-divide                         15.8965+-0.7259     ?     16.1577+-1.2011        ? might be 1.0164x slower
   aliased-arguments-getbyval                      1.0753+-0.0576     ?      1.1064+-0.1477        ? might be 1.0290x slower
   allocate-big-object                             2.4630+-0.3337            2.4240+-0.4916          might be 1.0161x faster
   arguments-named-and-reflective                 10.6548+-0.7093     ?     10.8292+-0.3070        ? might be 1.0164x slower
   arguments-out-of-bounds                         9.9397+-0.5611     ?     10.5007+-0.3801        ? might be 1.0564x slower
   arguments-strict-mode                           9.7064+-0.9401            9.4311+-0.6639          might be 1.0292x faster
   arguments                                       8.3494+-0.4823     ?      8.4659+-0.5299        ? might be 1.0140x slower
   arity-mismatch-inlining                         0.7962+-0.1084            0.7803+-0.0285          might be 1.0204x faster
   array-access-polymorphic-structure              5.8956+-0.8246            5.8215+-0.1216          might be 1.0127x faster
   array-nonarray-polymorhpic-access              25.9915+-1.4147           24.8688+-0.7135          might be 1.0451x faster
   array-prototype-every                          76.7665+-5.8957     ?     78.3793+-4.7528        ? might be 1.0210x slower
   array-prototype-forEach                        77.4977+-5.7676     ?     78.4979+-9.2988        ? might be 1.0129x slower
   array-prototype-map                            86.3943+-5.4017     ?     87.2162+-7.6651        ?
   array-prototype-some                           79.6071+-5.5569           76.2093+-3.2413          might be 1.0446x faster
   array-splice-contiguous                        38.1938+-1.6394     ?     39.1806+-4.9231        ? might be 1.0258x slower
   array-with-double-add                           3.3719+-0.3319            3.3458+-0.1342        
   array-with-double-increment                     3.0108+-0.1806     ?      3.1063+-0.3904        ? might be 1.0317x slower
   array-with-double-mul-add                       4.2459+-0.4253            4.1517+-0.4313          might be 1.0227x faster
   array-with-double-sum                           3.1557+-0.1661            3.0139+-0.0775          might be 1.0470x faster
   array-with-int32-add-sub                        5.9944+-0.3340     ?      6.4460+-1.2344        ? might be 1.0753x slower
   array-with-int32-or-double-sum                  3.3032+-0.3848     ?      3.3240+-0.4694        ?
   ArrayBuffer-DataView-alloc-large-long-lived
                                                  27.7297+-2.3958           27.3462+-1.5204          might be 1.0140x faster
   ArrayBuffer-DataView-alloc-long-lived          12.4580+-0.9686           12.1564+-0.5959          might be 1.0248x faster
   ArrayBuffer-Int32Array-byteOffset               3.5623+-0.0514     ?      3.5640+-0.1717        ?
   ArrayBuffer-Int8Array-alloc-large-long-lived
                                                  27.1994+-0.7915     ?     27.7824+-0.9831        ? might be 1.0214x slower
   ArrayBuffer-Int8Array-alloc-long-lived-buffer
                                                  20.1410+-1.0381           20.1205+-0.7028        
   ArrayBuffer-Int8Array-alloc-long-lived         11.7102+-0.4120     ?     12.1937+-1.4833        ? might be 1.0413x slower
   ArrayBuffer-Int8Array-alloc                     9.7155+-0.2622     ?      9.7408+-0.3339        ?
   asmjs_bool_bug                                  6.8787+-0.6163            6.8253+-0.4575        
   assign-custom-setter-polymorphic                2.4736+-0.0880     ?      2.6258+-0.2009        ? might be 1.0615x slower
   assign-custom-setter                            3.4190+-0.1926     ?      3.4369+-0.2772        ?
   basic-set                                       8.4774+-0.5671     ?      8.8167+-1.7513        ? might be 1.0400x slower
   big-int-mul                                     3.6068+-0.8468            3.4397+-0.4948          might be 1.0486x faster
   boolean-test                                    2.7460+-0.1503     ?      2.7725+-0.2089        ?
   branch-fold                                     3.7387+-0.2349            3.4285+-0.2448          might be 1.0905x faster
   branch-on-string-as-boolean                    15.1669+-1.1460           14.8550+-0.3936          might be 1.0210x faster
   by-val-generic                                  7.0283+-0.1729     ?      7.4342+-1.1160        ? might be 1.0577x slower
   call-spread-apply                              28.8990+-3.0332           27.4525+-1.1142          might be 1.0527x faster
   call-spread-call                               22.4185+-0.9919     ?     23.2035+-1.5537        ? might be 1.0350x slower
   captured-assignments                            0.4023+-0.0719            0.3881+-0.0414          might be 1.0368x faster
   cast-int-to-double                              4.8967+-0.4760            4.6959+-0.1334          might be 1.0427x faster
   cell-argument                                   6.3444+-0.9131            6.0786+-0.3078          might be 1.0437x faster
   cfg-simplify                                    2.7733+-0.2629            2.6744+-0.0674          might be 1.0370x faster
   chain-getter-access                             8.1580+-1.2432     ?      8.1961+-0.6263        ?
   cmpeq-obj-to-obj-other                         11.8594+-2.8811           11.6851+-1.0970          might be 1.0149x faster
   constant-test                                   4.4613+-0.2353     ?      4.5366+-0.3755        ? might be 1.0169x slower
   create-lots-of-functions                        9.5157+-0.8162     ?      9.5269+-0.7010        ?
   cse-new-array-buffer                            2.3254+-0.3940            2.0503+-0.1136          might be 1.1342x faster
   cse-new-array                                   2.4818+-0.5253            2.2864+-0.2564          might be 1.0854x faster
   DataView-custom-properties                     33.7694+-3.2158           32.6441+-2.7496          might be 1.0345x faster
   deconstructing-parameters-overridden-by-function
                                                   0.4332+-0.0270            0.4102+-0.0163          might be 1.0559x faster
   delay-tear-off-arguments-strictmode            12.9276+-1.3120           12.5315+-0.1797          might be 1.0316x faster
   deltablue-varargs                             168.9684+-4.0492     ?    174.2148+-19.6760       ? might be 1.0310x slower
   destructuring-arguments                        13.4781+-0.3938           13.3365+-0.5443          might be 1.0106x faster
   destructuring-swap                              4.7420+-0.2993            4.5391+-0.2610          might be 1.0447x faster
   direct-arguments-getbyval                       1.1314+-0.1277     ?      1.1470+-0.0981        ? might be 1.0138x slower
   div-boolean-double                              5.1896+-0.3067            5.1713+-0.3733        
   div-boolean                                     8.3802+-0.4523            8.0914+-0.4336          might be 1.0357x faster
   double-get-by-val-out-of-bounds                 4.3503+-0.5601            3.8774+-0.3459          might be 1.1219x faster
   double-pollution-getbyval                       8.6006+-0.4064            8.4878+-0.5560          might be 1.0133x faster
   double-pollution-putbyoffset                    3.9442+-0.2942     ?      4.1605+-0.9936        ? might be 1.0548x slower
   double-to-int32-typed-array-no-inline           2.3030+-0.3262            2.0930+-0.1429          might be 1.1003x faster
   double-to-int32-typed-array                     1.8898+-0.3807     ?      2.1685+-0.3473        ? might be 1.1474x slower
   double-to-uint32-typed-array-no-inline          2.3745+-0.3104            2.2377+-0.2896          might be 1.0611x faster
   double-to-uint32-typed-array                    1.8792+-0.2755            1.8499+-0.1344          might be 1.0158x faster
   elidable-new-object-dag                        34.5931+-2.9004           33.9970+-1.2568          might be 1.0175x faster
   elidable-new-object-roflcopter                 35.5268+-2.0344     ?     35.8919+-4.4901        ? might be 1.0103x slower
   elidable-new-object-then-call                  32.4336+-1.9151           30.5245+-2.4749          might be 1.0625x faster
   elidable-new-object-tree                       36.1328+-2.4835     ?     36.3362+-1.9740        ?
   empty-string-plus-int                           4.9308+-0.3404     ?      5.2444+-1.5880        ? might be 1.0636x slower
   emscripten-cube2hash                           27.0504+-1.1611     ?     27.0820+-0.1137        ?
   exit-length-on-plain-object                    12.3332+-1.3636           11.9197+-0.2548          might be 1.0347x faster
   external-arguments-getbyval                     1.3783+-0.5841            1.1225+-0.0966          might be 1.2279x faster
   external-arguments-putbyval                     2.1706+-0.0557     ?      2.3966+-0.6990        ? might be 1.1041x slower
   fixed-typed-array-storage-var-index             1.2451+-0.1923            1.2168+-0.1227          might be 1.0233x faster
   fixed-typed-array-storage                       0.8627+-0.0638     ?      0.8992+-0.1411        ? might be 1.0423x slower
   Float32Array-matrix-mult                        3.8755+-0.2988            3.8515+-0.2840        
   Float32Array-to-Float64Array-set               45.8940+-1.4457     ?     47.8378+-1.4846        ? might be 1.0424x slower
   Float64Array-alloc-long-lived                  57.2079+-1.7363     ?     59.2123+-2.8856        ? might be 1.0350x slower
   Float64Array-to-Int16Array-set                 58.4658+-6.3768     ?     61.1043+-12.0971       ? might be 1.0451x slower
   fold-double-to-int                             12.8510+-1.1543           12.6807+-1.4946          might be 1.0134x faster
   fold-get-by-id-to-multi-get-by-offset-rare-int
                                                  10.3516+-1.5488           10.1146+-0.4532          might be 1.0234x faster
   fold-get-by-id-to-multi-get-by-offset           8.7523+-1.3072            8.1662+-0.5916          might be 1.0718x faster
   fold-multi-get-by-offset-to-get-by-offset
                                                   8.0105+-2.2048     ?      8.2407+-1.3251        ? might be 1.0287x slower
   fold-multi-get-by-offset-to-poly-get-by-offset
                                                   8.3550+-1.5711            8.2052+-1.9376          might be 1.0183x faster
   fold-multi-put-by-offset-to-poly-put-by-offset
                                                   7.3162+-1.1468     ?      7.7231+-1.8638        ? might be 1.0556x slower
   fold-multi-put-by-offset-to-put-by-offset
                                                   5.4037+-1.0727            5.0341+-1.2283          might be 1.0734x faster
   fold-multi-put-by-offset-to-replace-or-transition-put-by-offset
                                                   9.9796+-1.8433            8.5618+-1.2740          might be 1.1656x faster
   fold-put-by-id-to-multi-put-by-offset           8.8778+-2.7981            8.5466+-0.4245          might be 1.0388x faster
   fold-put-structure                              5.1379+-0.9308     ?      6.1991+-3.0297        ? might be 1.2065x slower
   for-of-iterate-array-entries                    4.0233+-0.2326     ?      4.0578+-0.2185        ?
   for-of-iterate-array-keys                       3.2162+-0.1731     ?      3.4299+-0.2569        ? might be 1.0664x slower
   for-of-iterate-array-values                     3.0585+-0.1991     ?      3.7072+-1.3658        ? might be 1.2121x slower
   fround                                         19.6340+-2.5860           18.1650+-2.0258          might be 1.0809x faster
   ftl-library-inlining-dataview                  65.5935+-20.8073          59.9476+-3.0414          might be 1.0942x faster
   ftl-library-inlining                          108.3499+-4.5057     ?    112.5010+-9.6823        ? might be 1.0383x slower
   function-dot-apply                              1.9375+-0.1334     ?      2.0457+-0.3986        ? might be 1.0559x slower
   function-test                                   2.6998+-0.3892            2.5632+-0.0918          might be 1.0533x faster
   function-with-eval                             88.8690+-1.3509     ?     91.9040+-4.8011        ? might be 1.0342x slower
   gcse-poly-get-less-obvious                     14.6398+-1.4462     ?     14.7578+-2.1173        ?
   gcse-poly-get                                  14.1893+-0.8567     ?     15.0439+-2.2246        ? might be 1.0602x slower
   gcse                                            3.8778+-0.5873            3.8110+-0.1893          might be 1.0175x faster
   get-by-id-bimorphic-check-structure-elimination-simple
                                                   2.5084+-0.1256     ?      2.6175+-0.2442        ? might be 1.0435x slower
   get-by-id-bimorphic-check-structure-elimination
                                                   5.9938+-1.2627            5.9424+-1.0974        
   get-by-id-chain-from-try-block                  7.0258+-2.7195            6.4331+-0.3553          might be 1.0921x faster
   get-by-id-check-structure-elimination           4.2908+-0.2032     ?      4.2919+-0.3558        ?
   get-by-id-proto-or-self                        14.8965+-3.0421           14.3503+-0.7807          might be 1.0381x faster
   get-by-id-quadmorphic-check-structure-elimination-simple
                                                   2.8240+-0.3147     ?      2.8532+-0.2998        ? might be 1.0103x slower
   get-by-id-self-or-proto                        14.3041+-1.0109           13.6468+-1.0165          might be 1.0482x faster
   get-by-val-out-of-bounds                        4.0852+-0.4608            3.9392+-0.9759          might be 1.0371x faster
   get_callee_monomorphic                          2.8527+-0.4140            2.5515+-0.1801          might be 1.1181x faster
   get_callee_polymorphic                          3.2767+-0.2561            3.2379+-0.3051          might be 1.0120x faster
   getter-no-activation                            4.8008+-0.7797     ?      4.8658+-0.3747        ? might be 1.0135x slower
   getter-richards                               135.0325+-47.4162    ?    139.4269+-18.9332       ? might be 1.0325x slower
   getter                                          5.4348+-0.8156            5.1214+-0.1629          might be 1.0612x faster
   global-var-const-infer-fire-from-opt            0.8785+-0.2049            0.8205+-0.1053          might be 1.0707x faster
   global-var-const-infer                          0.6636+-0.0488            0.6585+-0.0452        
   HashMap-put-get-iterate-keys                   30.1801+-3.3792     ?     31.7158+-2.3760        ? might be 1.0509x slower
   HashMap-put-get-iterate                        37.6675+-3.8742           30.6368+-3.5876          might be 1.2295x faster
   HashMap-string-put-get-iterate                 28.0742+-1.8826     ?     30.3336+-10.5763       ? might be 1.0805x slower
   hoist-make-rope                                 7.8230+-1.0497            7.5375+-1.1372          might be 1.0379x faster
   hoist-poly-check-structure-effectful-loop
                                                   4.1992+-0.2837     ?      4.4008+-0.7283        ? might be 1.0480x slower
   hoist-poly-check-structure                      3.1677+-0.2623     ?      3.2142+-0.3068        ? might be 1.0147x slower
   imul-double-only                                7.3707+-2.0778            6.6487+-0.3092          might be 1.1086x faster
   imul-int-only                                   7.5684+-0.4807     ?      7.6060+-0.3510        ?
   imul-mixed                                      7.2322+-1.8498            6.2773+-0.5283          might be 1.1521x faster
   in-four-cases                                  18.1603+-2.7532           17.0410+-1.7230          might be 1.0657x faster
   in-one-case-false                              10.6640+-4.3924           10.0955+-0.5545          might be 1.0563x faster
   in-one-case-true                                9.6876+-1.0359     ?     10.0333+-1.0986        ? might be 1.0357x slower
   in-two-cases                                   10.1500+-1.5329     ?     10.8674+-1.6151        ? might be 1.0707x slower
   indexed-properties-in-objects                   2.7994+-0.3404            2.6873+-0.1630          might be 1.0417x faster
   infer-closure-const-then-mov-no-inline          3.4572+-0.9857            3.2502+-0.7451          might be 1.0637x faster
   infer-closure-const-then-mov                   16.6777+-0.8082     ?     16.7838+-2.1792        ?
   infer-closure-const-then-put-to-scope-no-inline
                                                  11.0132+-0.9281     ?     11.2582+-0.8551        ? might be 1.0222x slower
   infer-closure-const-then-put-to-scope          20.8373+-0.6453     ?     20.8978+-0.5672        ?
   infer-closure-const-then-reenter-no-inline
                                                  51.6437+-6.1553           50.8140+-2.2787          might be 1.0163x faster
   infer-closure-const-then-reenter               21.3495+-1.4478     ?     21.8472+-0.3434        ? might be 1.0233x slower
   infer-constant-global-property                  3.5070+-0.3936            3.3110+-0.0923          might be 1.0592x faster
   infer-constant-property                         2.5522+-0.0617            2.5290+-0.1124        
   infer-one-time-closure-ten-vars                 8.2551+-0.5071     ?      8.2813+-0.6010        ?
   infer-one-time-closure-two-vars                 7.9333+-0.3643     ?      8.2957+-0.9346        ? might be 1.0457x slower
   infer-one-time-closure                          8.4764+-1.1984            7.3842+-0.3544          might be 1.1479x faster
   infer-one-time-deep-closure                    12.6865+-0.9147           12.6055+-0.5798        
   inline-arguments-access                         3.8227+-0.5052     ?      3.8990+-0.6388        ? might be 1.0200x slower
   inline-arguments-aliased-access                 4.1420+-1.2134            4.0429+-1.6307          might be 1.0245x faster
   inline-arguments-local-escape                   3.6566+-0.1824            3.6497+-0.1739        
   inline-get-scoped-var                           4.5121+-0.0496            4.4742+-0.1647        
   inlined-put-by-id-transition                    9.6885+-0.2102     ?      9.7633+-1.8153        ?
   int-or-other-abs-then-get-by-val                5.0430+-1.3484            4.9500+-1.1824          might be 1.0188x faster
   int-or-other-abs-zero-then-get-by-val          15.3982+-0.5662     ?     15.5982+-1.3093        ? might be 1.0130x slower
   int-or-other-add-then-get-by-val                4.4352+-0.7669     ?      4.6356+-1.5089        ? might be 1.0452x slower
   int-or-other-add                                5.0510+-0.2751            4.9635+-0.5993          might be 1.0176x faster
   int-or-other-div-then-get-by-val                4.2209+-0.8213            3.8517+-0.4808          might be 1.0959x faster
   int-or-other-max-then-get-by-val                4.1969+-0.7549            3.9058+-0.1869          might be 1.0745x faster
   int-or-other-min-then-get-by-val                4.4015+-0.4994     ?      4.4684+-1.1987        ? might be 1.0152x slower
   int-or-other-mod-then-get-by-val                3.9026+-0.3331            3.7350+-0.1674          might be 1.0449x faster
   int-or-other-mul-then-get-by-val                4.0888+-1.1085            3.6483+-0.3202          might be 1.1208x faster
   int-or-other-neg-then-get-by-val                5.2860+-1.6419            4.6763+-0.6051          might be 1.1304x faster
   int-or-other-neg-zero-then-get-by-val          15.0459+-0.1386     ?     15.6116+-1.6225        ? might be 1.0376x slower
   int-or-other-sub-then-get-by-val                4.3448+-1.1041            4.3166+-0.6785        
   int-or-other-sub                                3.6783+-0.3940            3.3594+-0.2983          might be 1.0949x faster
   int-overflow-local                              4.0659+-0.5792     ?      4.2675+-1.0094        ? might be 1.0496x slower
   Int16Array-alloc-long-lived                    41.1531+-1.4427     ?     41.9167+-4.0880        ? might be 1.0186x slower
   Int16Array-bubble-sort-with-byteLength         17.0885+-0.9501           17.0393+-1.9781        
   Int16Array-bubble-sort                         16.6284+-1.0959     ?     17.1880+-2.2773        ? might be 1.0337x slower
   Int16Array-load-int-mul                         1.4896+-0.0856     ^      1.3340+-0.0514        ^ definitely 1.1166x faster
   Int16Array-to-Int32Array-set                   43.6108+-3.6190     ?     48.3352+-6.6706        ? might be 1.1083x slower
   Int32Array-alloc-large                         12.7289+-0.8413           12.1660+-0.7589          might be 1.0463x faster
   Int32Array-alloc-long-lived                    46.8256+-2.8789     ?     48.2297+-11.9107       ? might be 1.0300x slower
   Int32Array-alloc                                2.6823+-0.0752     ?      2.7292+-0.2270        ? might be 1.0175x slower
   Int32Array-Int8Array-view-alloc                 6.0527+-0.6561            5.8616+-0.2798          might be 1.0326x faster
   int52-spill                                     5.6191+-0.8015     ?      5.7007+-1.4329        ? might be 1.0145x slower
   Int8Array-alloc-long-lived                     36.8548+-1.7330     ?     37.4250+-2.4353        ? might be 1.0155x slower
   Int8Array-load-with-byteLength                  3.3834+-0.1522            3.3697+-0.3494        
   Int8Array-load                                  3.3595+-0.1106            3.2895+-0.1512          might be 1.0213x faster
   integer-divide                                 10.5037+-1.1609           10.3663+-0.9017          might be 1.0133x faster
   integer-modulo                                  1.6458+-0.1447     ?      1.7138+-0.3717        ? might be 1.0414x slower
   is-boolean-fold-tricky                          3.6641+-0.0611     ?      3.6824+-0.2119        ?
   is-boolean-fold                                 2.7497+-0.6787     ?      2.8038+-0.3364        ? might be 1.0197x slower
   is-function-fold-tricky-internal-function
                                                  11.7934+-5.7839           10.1153+-0.7747          might be 1.1659x faster
   is-function-fold-tricky                         4.0264+-0.4205            3.9648+-0.2324          might be 1.0155x faster
   is-function-fold                                2.7062+-0.2756            2.5615+-0.0896          might be 1.0565x faster
   is-number-fold-tricky                           4.0970+-0.2641            3.9232+-0.2552          might be 1.0443x faster
   is-number-fold                                  2.5599+-0.1473            2.5566+-0.1999        
   is-object-or-null-fold-functions                2.6967+-0.2990     ?      2.7919+-0.3784        ? might be 1.0353x slower
   is-object-or-null-fold-less-tricky              4.0735+-0.2824            4.0708+-0.2583        
   is-object-or-null-fold-tricky                   4.9745+-0.2846     ?      5.0958+-0.3008        ? might be 1.0244x slower
   is-object-or-null-fold                          2.7706+-0.4414            2.6283+-0.1903          might be 1.0541x faster
   is-object-or-null-trickier-function             3.9889+-0.1711            3.9429+-0.0249          might be 1.0117x faster
   is-object-or-null-trickier-internal-function
                                                  11.9434+-2.9886           10.3864+-0.5129          might be 1.1499x faster
   is-object-or-null-tricky-function               4.2901+-0.7053            4.1201+-0.4750          might be 1.0413x faster
   is-object-or-null-tricky-internal-function
                                                   7.6227+-0.5767     ?      8.2587+-0.6176        ? might be 1.0834x slower
   is-string-fold-tricky                           3.9893+-0.1135     ?      4.0984+-0.1143        ? might be 1.0274x slower
   is-string-fold                                  2.6440+-0.3079     ?      2.6870+-0.2582        ? might be 1.0162x slower
   is-undefined-fold-tricky                        3.2582+-0.1206     ?      3.2977+-0.2703        ? might be 1.0121x slower
   is-undefined-fold                               2.5103+-0.0729     ?      2.5187+-0.0706        ?
   large-int-captured                              3.8184+-0.1773     ?      4.1090+-0.2440        ? might be 1.0761x slower
   large-int-neg                                  14.5290+-1.7962           14.2131+-0.5619          might be 1.0222x faster
   large-int                                      13.7422+-1.6796           13.4816+-0.4649          might be 1.0193x faster
   load-varargs-elimination                       20.6490+-0.3611           20.3343+-0.5701          might be 1.0155x faster
   logical-not                                     4.2200+-0.4323     ?      4.5055+-1.1036        ? might be 1.0677x slower
   lots-of-fields                                  9.8375+-1.8179            9.6052+-0.8894          might be 1.0242x faster
   make-indexed-storage                            2.7860+-0.1846            2.7386+-0.7804          might be 1.0173x faster
   make-rope-cse                                   3.9994+-0.7209            3.7510+-0.1423          might be 1.0662x faster
   marsaglia-larger-ints                          34.9540+-3.2527           34.6703+-2.5523        
   marsaglia-osr-entry                            21.5202+-3.4273           20.7021+-0.6566          might be 1.0395x faster
   max-boolean                                     2.5264+-0.2422     ?      2.5749+-0.2389        ? might be 1.0192x slower
   method-on-number                               15.1404+-0.2782     ?     16.0789+-1.6594        ? might be 1.0620x slower
   min-boolean                                     2.4885+-0.2324     ?      2.5237+-0.1437        ? might be 1.0142x slower
   minus-boolean-double                            2.9943+-0.1987     ?      3.1832+-0.2285        ? might be 1.0631x slower
   minus-boolean                                   2.2540+-0.2275     ?      2.2806+-0.1091        ? might be 1.0118x slower
   misc-strict-eq                                 38.0974+-18.2511          30.8953+-2.0148          might be 1.2331x faster
   mod-boolean-double                             11.0627+-0.4379     ?     11.1008+-0.3753        ?
   mod-boolean                                     8.1687+-0.3270     ?      8.5317+-0.5701        ? might be 1.0444x slower
   mul-boolean-double                              3.5267+-0.0413            3.4758+-0.2129          might be 1.0147x faster
   mul-boolean                                     2.7213+-0.1506     ?      2.8338+-0.2041        ? might be 1.0413x slower
   neg-boolean                                     2.9782+-0.0373     ?      2.9961+-0.0815        ?
   negative-zero-divide                            0.3102+-0.0369     ?      0.3242+-0.0338        ? might be 1.0451x slower
   negative-zero-modulo                            0.3213+-0.0384            0.2872+-0.0202          might be 1.1188x faster
   negative-zero-negate                            0.2890+-0.0138     ?      0.3022+-0.0481        ? might be 1.0458x slower
   nested-function-parsing                        31.4500+-0.1783     ?     35.1543+-8.5246        ? might be 1.1178x slower
   new-array-buffer-dead                          88.6119+-6.1280     ?     88.9470+-6.2004        ?
   new-array-buffer-push                           5.8185+-0.6405     ?      5.8599+-0.3422        ?
   new-array-dead                                 13.4366+-1.3121           12.9837+-0.9961          might be 1.0349x faster
   new-array-push                                  3.4358+-0.0604     ?      3.5054+-0.8298        ? might be 1.0203x slower
   no-inline-constructor                          32.7170+-2.3188           31.5552+-0.8994          might be 1.0368x faster
   number-test                                     2.9140+-0.3382            2.8523+-0.2501          might be 1.0216x faster
   object-closure-call                             4.8270+-0.7359     ?      4.9311+-0.4157        ? might be 1.0216x slower
   object-test                                     2.5480+-0.1447     ?      2.6066+-0.0250        ? might be 1.0230x slower
   obvious-sink-pathology-taken                  103.1457+-3.6842     ?    103.7552+-2.0396        ?
   obvious-sink-pathology                         96.9351+-2.6696           96.3171+-1.8857        
   obviously-elidable-new-object                  28.9344+-1.8794           28.3513+-4.8309          might be 1.0206x faster
   plus-boolean-arith                              2.2249+-0.0975     !      2.4466+-0.0936        ! definitely 1.0996x slower
   plus-boolean-double                             3.0528+-0.2608     ?      3.1222+-0.2428        ? might be 1.0227x slower
   plus-boolean                                    2.3822+-0.1566     ?      2.4418+-0.1907        ? might be 1.0250x slower
   poly-chain-access-different-prototypes-simple
                                                   2.6200+-0.3536     ?      2.6542+-0.2135        ? might be 1.0130x slower
   poly-chain-access-different-prototypes          2.8845+-0.9029            2.4692+-0.3204          might be 1.1682x faster
   poly-chain-access-simpler                       2.6655+-0.2225     ?      2.8080+-0.4986        ? might be 1.0534x slower
   poly-chain-access                               2.4905+-0.1987     ?      2.7688+-0.5404        ? might be 1.1118x slower
   poly-stricteq                                  46.2322+-0.8996     ?     48.6822+-3.5406        ? might be 1.0530x slower
   polymorphic-array-call                          1.2773+-0.1568            1.1695+-0.0697          might be 1.0922x faster
   polymorphic-get-by-id                           2.6872+-0.1226     ?      2.7097+-0.2006        ?
   polymorphic-put-by-id                          25.2003+-0.3214     ?     25.4345+-0.6040        ?
   polymorphic-structure                          12.8807+-0.7348     ?     13.0163+-0.3998        ? might be 1.0105x slower
   polyvariant-monomorphic-get-by-id               7.1276+-1.7587            6.8098+-1.1429          might be 1.0467x faster
   proto-getter-access                             8.0466+-0.4762     ?      8.3938+-1.1585        ? might be 1.0431x slower
   put-by-id-replace-and-transition                7.7839+-1.4500            7.5931+-0.6025          might be 1.0251x faster
   put-by-id-slightly-polymorphic                  2.6842+-0.4235            2.5174+-0.1306          might be 1.0663x faster
   put-by-id                                       9.9345+-0.8527     ?     10.0226+-1.7868        ?
   put-by-val-direct                               0.2990+-0.0161     ?      0.3090+-0.0614        ? might be 1.0337x slower
   put-by-val-large-index-blank-indexing-type
                                                   5.1891+-0.1072            5.0131+-0.2461          might be 1.0351x faster
   put-by-val-machine-int                          2.2857+-0.3242            2.2700+-0.1883        
   rare-osr-exit-on-local                         15.1652+-1.7859     ?     15.9540+-1.9860        ? might be 1.0520x slower
   register-pressure-from-osr                     16.8102+-2.3811     ?     16.8365+-0.5473        ?
   setter                                          5.7974+-1.0157     ?      6.0466+-0.4370        ? might be 1.0430x slower
   simple-activation-demo                         24.3130+-1.1583     ?     24.6669+-0.7877        ? might be 1.0146x slower
   simple-getter-access                           10.3850+-0.6314           10.1459+-0.3928          might be 1.0236x faster
   simple-poly-call-nested                         8.8340+-0.8594            8.3900+-0.4054          might be 1.0529x faster
   simple-poly-call                                1.2533+-0.1151            1.1861+-0.0542          might be 1.0567x faster
   sin-boolean                                    17.8589+-0.4973           17.3697+-1.0089          might be 1.0282x faster
   singleton-scope                                59.5529+-4.8736           58.0301+-1.0322          might be 1.0262x faster
   sink-function                                   9.4247+-0.4042     ?      9.6729+-1.3286        ? might be 1.0263x slower
   sink-huge-activation                           17.7903+-1.7462           15.7977+-0.9924          might be 1.1261x faster
   sinkable-new-object-dag                        56.1281+-4.2310     ?     57.4968+-5.1217        ? might be 1.0244x slower
   sinkable-new-object-taken                      43.7102+-3.2807     ?     44.1469+-3.0249        ?
   sinkable-new-object                            28.7712+-3.1857     ?     29.5045+-0.6482        ? might be 1.0255x slower
   slow-array-profile-convergence                  2.4437+-0.2614     ?      2.5587+-0.0775        ? might be 1.0471x slower
   slow-convergence                                2.3522+-0.0854     ?      2.4958+-0.2624        ? might be 1.0610x slower
   slow-ternaries                                 18.2141+-1.4928           18.1375+-1.7024        
   sorting-benchmark                              18.0172+-1.4326           17.6429+-0.4861          might be 1.0212x faster
   sparse-conditional                              1.1039+-0.0554     ?      1.1941+-0.2476        ? might be 1.0817x slower
   splice-to-remove                               11.8989+-0.5586     ?     12.2442+-0.3051        ? might be 1.0290x slower
   string-char-code-at                            14.0967+-0.4399     ?     14.6918+-2.6883        ? might be 1.0422x slower
   string-concat-object                            2.2388+-0.4343            2.2175+-0.3132        
   string-concat-pair-object                       2.1353+-0.0848     ?      2.1555+-0.4185        ?
   string-concat-pair-simple                       9.1825+-0.7683     ?      9.2115+-0.7593        ?
   string-concat-simple                            9.2116+-1.1821     ?      9.3035+-0.4609        ?
   string-cons-repeat                              6.6797+-0.4518            6.3618+-0.1584          might be 1.0500x faster
   string-cons-tower                               6.8366+-0.3624     ?      6.8600+-0.5261        ?
   string-equality                                19.7943+-4.3245           17.1720+-0.9496          might be 1.1527x faster
   string-get-by-val-big-char                      6.9113+-0.7903            6.8423+-1.0166          might be 1.0101x faster
   string-get-by-val-out-of-bounds-insane          3.3632+-0.3231            3.3322+-0.4306        
   string-get-by-val-out-of-bounds                 4.0046+-0.3663     ?      4.0200+-0.4001        ?
   string-get-by-val                               2.7360+-0.0194     ?      3.0287+-1.1210        ? might be 1.1070x slower
   string-hash                                     1.9393+-0.3238            1.8900+-0.2144          might be 1.0261x faster
   string-long-ident-equality                     14.0615+-1.3780           13.9047+-0.3378          might be 1.0113x faster
   string-out-of-bounds                           10.0605+-0.5409     ?     10.0999+-0.6334        ?
   string-repeat-arith                            28.4070+-4.6976           26.5959+-1.1468          might be 1.0681x faster
   string-sub                                     53.0390+-0.8340           52.8806+-3.9247        
   string-test                                     2.6434+-0.0343     ?      2.7994+-0.2331        ? might be 1.0590x slower
   string-var-equality                            25.6909+-2.1330     ?     26.4015+-4.5916        ? might be 1.0277x slower
   structure-hoist-over-transitions                2.3082+-0.0396     ?      2.3344+-0.1542        ? might be 1.0113x slower
   substring-concat-weird                         33.5953+-1.8156     ?     34.0253+-1.0464        ? might be 1.0128x slower
   substring-concat                               37.1050+-1.3529     ?     38.9208+-3.3457        ? might be 1.0489x slower
   substring                                      41.0107+-1.3291     ?     41.2437+-0.7189        ?
   switch-char-constant                            2.5257+-0.1254     ?      2.5321+-0.0993        ?
   switch-char                                     6.2152+-1.1412            5.2186+-0.6263          might be 1.1910x faster
   switch-constant                                 7.5717+-1.1959            7.5370+-0.1533        
   switch-string-basic-big-var                    16.9940+-2.4283           16.9622+-2.5203        
   switch-string-basic-big                        14.8027+-1.2009           13.8950+-0.5265          might be 1.0653x faster
   switch-string-basic-var                        12.9443+-0.3617     ?     14.7078+-4.5090        ? might be 1.1362x slower
   switch-string-basic                            13.5079+-2.1556           12.3632+-0.7100          might be 1.0926x faster
   switch-string-big-length-tower-var             17.2377+-0.6508     ?     17.5198+-0.5903        ? might be 1.0164x slower
   switch-string-length-tower-var                 13.2106+-0.8525     ?     13.6190+-1.3559        ? might be 1.0309x slower
   switch-string-length-tower                     12.1673+-2.8685           11.4551+-0.6497          might be 1.0622x faster
   switch-string-short                            12.1490+-1.6562           11.2523+-0.2821          might be 1.0797x faster
   switch                                         11.3291+-0.7604     ?     12.4792+-2.9868        ? might be 1.1015x slower
   tear-off-arguments-simple                       3.1520+-0.3476            3.0330+-0.2458          might be 1.0392x faster
   tear-off-arguments                              4.1427+-0.4475     ?      4.6090+-0.8627        ? might be 1.1126x slower
   temporal-structure                             12.4531+-2.0520           11.5954+-0.4841          might be 1.0740x faster
   to-int32-boolean                               12.8026+-0.2932     ?     13.5478+-2.7636        ? might be 1.0582x slower
   try-catch-get-by-val-cloned-arguments          13.5313+-0.9898     ?     13.7702+-1.0602        ? might be 1.0177x slower
   try-catch-get-by-val-direct-arguments           6.0012+-0.6779            5.9724+-0.6138        
   try-catch-get-by-val-scoped-arguments           6.9931+-0.5837            6.9896+-0.6114        
   typed-array-get-set-by-val-profiling           29.2203+-1.5149     ?     30.9341+-2.7890        ? might be 1.0587x slower
   undefined-property-access                     227.7643+-21.4784    ?    228.2510+-10.9044       ?
   undefined-test                                  2.8263+-0.1202     ?      2.9805+-0.4975        ? might be 1.0546x slower
   unprofiled-licm                                14.0546+-0.6819     ?     14.5871+-1.6930        ? might be 1.0379x slower
   varargs-call                                   13.0043+-0.6971     ?     14.8909+-3.5842        ? might be 1.1451x slower
   varargs-construct-inline                       21.2296+-0.7540     ?     24.1105+-7.3932        ? might be 1.1357x slower
   varargs-construct                              20.3253+-1.9162     ?     20.5261+-1.1149        ?
   varargs-inline                                  8.4977+-0.9564     ?      8.5475+-0.5541        ?
   varargs-strict-mode                             8.9849+-0.2622     ?      9.6145+-2.2145        ? might be 1.0701x slower
   varargs                                         9.0571+-0.8854            8.8757+-0.3692          might be 1.0204x faster
   weird-inlining-const-prop                       2.0049+-0.0767     ?      2.0348+-0.2453        ? might be 1.0149x slower

   <geometric>                                     7.4012+-0.0544            7.3685+-0.0480          might be 1.0044x faster

                                                      Baseline                  Patched                                      
Geomean of preferred means:
   <scaled-result>                                29.9350+-0.4987           29.6418+-0.1473          might be 1.0099x faster
Comment 24 Yusuke Suzuki 2015-05-28 23:59:35 PDT
Comment on attachment 253895 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=253895&action=review

Just nits.

> Source/JavaScriptCore/builtins/Array.prototype.js:26
> +function reduce(callback /*, initialValue */) {

Please break this line before `{`.

> Source/JavaScriptCore/builtins/Array.prototype.js:62
> +function reduceRight(callback /*, initialValue */) {

Ditto.
Comment 25 Jordan Harband 2015-05-29 00:01:35 PDT
Created attachment 253896 [details]
Patch
Comment 26 Jordan Harband 2015-05-29 22:40:23 PDT
ping for rereview
Comment 27 Yusuke Suzuki 2015-05-29 23:19:17 PDT
Thanks for taking the performance results.

I git-grepped the code in Kraken and Octane, and I was surprised that there's no performance tests about Array#reduce / Array#reduceRight in them...

So I've added a test about Array#reduce in my working copy; copying js/regress/array-prototype-forEach test files. Replace forEach(...) => reduce(..., 0).

And I've taken the performance results about this js regress tests.
Seeing the results about array-prototype-reduce case, I've seen the significant performance improvements (I think this is due to inlining.)

I suggest adding this test into your patch.

Other part looks good to me.



Benchmark report for JSRegress on gpgpu.

VMs tested:
"baseline" at /home/yusuke/dev/WebKit/WebKitBuild/checking-reduce/Release/bin/jsc
"reduce" at /home/yusuke/dev/WebKit/WebKitBuild/check2/Release/bin/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.

                                                   baseline                   reduce                                      

string-get-by-val-big-char                      8.7237+-0.8994     ?      9.7000+-4.6192        ? might be 1.1119x slower
slow-convergence                                3.6596+-1.2487     ?      3.7767+-1.2757        ? might be 1.0320x slower
int-or-other-abs-zero-then-get-by-val          24.5480+-1.4970     ?     24.9775+-1.7638        ? might be 1.0175x slower
switch-string-basic                            16.6286+-0.6355           16.2222+-2.1936          might be 1.0251x faster
integer-modulo                                  3.9572+-2.7683            3.6342+-2.1530          might be 1.0889x faster
fold-double-to-int                             15.5027+-1.5622     ?     15.5137+-0.5286        ?
is-object-or-null-trickier-internal-function
                                               14.6808+-1.6214           14.5560+-0.8457        
adapt-to-double-divide                         16.4428+-1.0764           16.4262+-0.3810        
tear-off-arguments                              6.1683+-1.5351     ?      7.0384+-3.1448        ? might be 1.1411x slower
polymorphic-get-by-id                           5.6093+-3.2883            5.3023+-2.1065          might be 1.0579x faster
is-object-or-null-fold-tricky                   9.0627+-2.3373     ?      9.4164+-2.3461        ? might be 1.0390x slower
inline-arguments-local-escape                   5.5598+-0.8337     ?      5.6752+-0.5182        ? might be 1.0208x slower
int-or-other-sub                                5.6027+-0.6213     ?      5.7054+-1.1057        ? might be 1.0183x slower
new-array-dead                                 19.7483+-7.1775           17.0896+-2.0479          might be 1.1556x faster
rare-osr-exit-on-local                         16.9916+-2.5043     ?     17.6210+-2.5715        ? might be 1.0370x slower
obvious-sink-pathology                        156.1099+-8.4427          153.4303+-14.2913         might be 1.0175x faster
infer-one-time-closure                         12.1742+-1.0512           11.9504+-0.8406          might be 1.0187x faster
in-one-case-true                               14.1694+-4.5413           11.8962+-0.3143          might be 1.1911x faster
ArrayBuffer-Int8Array-alloc-long-lived-buffer
                                               25.1882+-1.9044     ?     25.2300+-1.4446        ?
infer-closure-const-then-reenter-no-inline
                                               58.9125+-2.8954           57.0087+-3.5972          might be 1.0334x faster
array-prototype-reduce                        145.4251+-3.7086     ^     91.1588+-26.3206       ^ definitely 1.5953x faster
call-spread-apply                              34.9207+-5.0826           31.5096+-1.3457          might be 1.1083x faster
destructuring-arguments                        19.1674+-1.7809           18.6682+-0.9342          might be 1.0267x faster
string-concat-object                            2.8558+-0.4395     ?      2.9998+-0.8555        ? might be 1.0504x slower
arguments-named-and-reflective                 11.8519+-0.7500           11.8475+-0.9936        
singleton-scope                                70.3254+-3.8662     ?     72.1369+-6.6672        ? might be 1.0258x slower
sparse-conditional                              2.8666+-2.2558            2.2102+-1.1951          might be 1.2970x faster
is-string-fold-tricky                           7.5220+-3.4432     ?      8.2283+-3.7968        ? might be 1.0939x slower
splice-to-remove                               16.8184+-0.3827     ?     16.9358+-0.8011        ?
assign-custom-setter                            5.9083+-0.6386            5.2786+-0.7518          might be 1.1193x faster
slow-array-profile-convergence                  3.6801+-1.2187     ?      3.7889+-0.9741        ? might be 1.0296x slower
proto-getter-access                            10.0264+-1.8415           10.0109+-1.7727        
direct-arguments-getbyval                       1.6990+-0.5422     ?      2.5142+-0.6403        ? might be 1.4798x slower
fold-put-by-id-to-multi-put-by-offset           8.2425+-2.5861     ?     10.8762+-2.6578        ? might be 1.3195x slower
to-int32-boolean                               16.5840+-1.1857     ?     16.6609+-1.0884        ?
is-object-or-null-fold-functions                5.2396+-0.8758            4.2154+-0.8302          might be 1.2430x faster
Float32Array-matrix-mult                        6.0396+-1.3424            5.8307+-0.7469          might be 1.0358x faster
register-pressure-from-osr                     24.2275+-4.6043     ?     25.1271+-4.4845        ? might be 1.0371x slower
new-array-buffer-dead                         136.1538+-11.2915         135.1930+-16.3280       
infer-closure-const-then-put-to-scope-no-inline
                                               13.3463+-0.9792           13.2606+-0.5116        
ArrayBuffer-DataView-alloc-large-long-lived
                                               42.0283+-7.3295           40.7844+-1.9889          might be 1.0305x faster
double-to-int32-typed-array-no-inline           4.3554+-1.9697     ?      4.9465+-4.9742        ? might be 1.1357x slower
getter-richards                               117.7467+-7.4609          117.0281+-5.7642        
new-array-push                                  5.8536+-0.8489            5.7315+-2.5946          might be 1.0213x faster
infer-closure-const-then-put-to-scope          24.7246+-1.3955           23.9456+-0.4969          might be 1.0325x faster
array-splice-contiguous                        64.0351+-2.2799           62.7870+-1.8764          might be 1.0199x faster
ftl-library-inlining-dataview                  62.0908+-3.2241     ?     63.8255+-7.3976        ? might be 1.0279x slower
indexed-properties-in-objects                   4.7436+-2.6412     ?      5.1810+-2.2785        ? might be 1.0922x slower
div-boolean-double                              6.9834+-1.8252     ?      8.3558+-7.4618        ? might be 1.1965x slower
is-boolean-fold                                 4.7805+-0.9783     ?      5.8435+-0.8362        ? might be 1.2224x slower
int-or-other-neg-then-get-by-val                6.9229+-1.9492            6.1742+-1.2089          might be 1.1213x faster
poly-stricteq                                  62.5505+-0.1100     ?     64.9110+-7.4002        ? might be 1.0377x slower
polymorphic-put-by-id                          32.4852+-3.0287     ?     33.1274+-2.3879        ? might be 1.0198x slower
try-catch-get-by-val-cloned-arguments          15.9978+-2.3080           15.4012+-1.2815          might be 1.0387x faster
polymorphic-array-call                          1.9708+-0.8760     ?      2.2514+-1.2791        ? might be 1.1424x slower
fold-multi-put-by-offset-to-poly-put-by-offset
                                                9.0872+-4.3186     ?     11.4126+-6.3049        ? might be 1.2559x slower
in-two-cases                                   12.4431+-0.5651     ?     13.3965+-1.4446        ? might be 1.0766x slower
array-access-polymorphic-structure              7.4907+-1.2868     ?      8.2433+-1.4437        ? might be 1.1005x slower
varargs-call                                   17.0160+-0.8735     ?     17.3626+-1.1171        ? might be 1.0204x slower
poly-chain-access                               3.8316+-1.6641     ?      4.8089+-1.8545        ? might be 1.2551x slower
get_callee_polymorphic                          4.2264+-0.9743     ?      4.4169+-0.8989        ? might be 1.0451x slower
cmpeq-obj-to-obj-other                         11.6608+-1.4756     ?     12.1058+-2.8062        ? might be 1.0382x slower
cast-int-to-double                              8.0272+-2.2844            7.6942+-2.6622          might be 1.0433x faster
polyvariant-monomorphic-get-by-id              10.3016+-2.3512            9.8450+-1.7281          might be 1.0464x faster
global-var-const-infer-fire-from-opt            1.9705+-1.4008     ?      2.3902+-1.7257        ? might be 1.2130x slower
array-prototype-some                           85.5728+-1.8154     ?     91.2447+-5.2044        ? might be 1.0663x slower
logical-not-weird-types                         4.5859+-0.7018     ?      4.9044+-1.4555        ? might be 1.0694x slower
basic-set                                      11.4992+-1.4321     ?     13.8252+-4.6525        ? might be 1.2023x slower
is-function-fold                                4.8356+-1.4559            4.4887+-0.7820          might be 1.0773x faster
switch-string-basic-var                        17.7513+-3.0433           17.3613+-1.3564          might be 1.0225x faster
assign-custom-setter-polymorphic                4.0357+-0.2037     ?      4.0600+-1.0234        ?
put-by-val-direct                               0.4410+-0.1721            0.3865+-0.0946          might be 1.1408x faster
ArrayBuffer-Int8Array-alloc-large-long-lived
                                               43.9429+-3.6665           39.4280+-4.4294          might be 1.1145x faster
simple-activation-demo                         28.1072+-1.5125           27.0354+-1.2648          might be 1.0396x faster
string-concat-pair-simple                      13.8118+-1.1409     ?     17.7993+-10.2821       ? might be 1.2887x slower
get-by-val-out-of-bounds                        6.1243+-0.8286     ?      6.7863+-0.9768        ? might be 1.1081x slower
switch-string-length-tower-var                 17.1844+-0.5414           16.9935+-1.0234          might be 1.0112x faster
captured-assignments                            0.6855+-0.2920     ?      0.7177+-0.1790        ? might be 1.0470x slower
string-var-equality                            33.7213+-0.1110     ?     33.9252+-0.5054        ?
int-or-other-mod-then-get-by-val                7.0926+-3.5091            5.1849+-0.9394          might be 1.3679x faster
Int32Array-alloc-large                         28.5717+-1.1474     ?     28.9294+-1.8471        ? might be 1.0125x slower
sin-boolean                                    13.8236+-0.9600           13.7455+-0.5257        
string-concat-simple                           15.9555+-1.3065           14.9969+-2.1362          might be 1.0639x faster
getter-no-activation                            7.1322+-2.3605     ?      7.2352+-0.8514        ? might be 1.0144x slower
try-catch-get-by-val-direct-arguments           7.0253+-1.0074     ?      7.7495+-1.4017        ? might be 1.1031x slower
infer-constant-property                         4.6173+-0.7472            3.9078+-1.2246          might be 1.1816x faster
div-boolean                                     9.6437+-1.7591            9.4539+-1.9967          might be 1.0201x faster
large-int                                      15.9420+-1.5010           15.6647+-0.9714          might be 1.0177x faster
external-arguments-putbyval                     4.2540+-1.5922            3.8442+-1.5403          might be 1.1066x faster
max-boolean                                     4.6111+-0.9632            4.4062+-1.1088          might be 1.0465x faster
get-by-id-proto-or-self                        18.4382+-2.3818           17.4687+-1.6764          might be 1.0555x faster
get-by-id-bimorphic-check-structure-elimination
                                                9.2124+-2.7056     ?      9.4256+-2.5609        ? might be 1.0231x slower
string-equality                                19.5379+-1.3846     ?     19.8094+-2.6791        ? might be 1.0139x slower
getter                                          9.6389+-3.8149            8.4083+-1.2997          might be 1.1464x faster
Int32Array-Int8Array-view-alloc                 8.2897+-1.9291            7.4500+-0.1862          might be 1.1127x faster
substring-concat                               53.3195+-2.8266     ?     54.8062+-1.5992        ? might be 1.0279x slower
is-boolean-fold-tricky                          7.6059+-4.1296            7.1297+-3.1778          might be 1.0668x faster
integer-divide                                 12.0111+-0.4755     ?     12.8677+-2.9887        ? might be 1.0713x slower
cse-new-array                                   3.5690+-0.2022            3.4971+-1.2165          might be 1.0206x faster
is-string-fold                                  5.3406+-1.3145            4.5643+-1.4165          might be 1.1701x faster
object-closure-call                             8.6454+-1.3821            7.5355+-2.0114          might be 1.1473x faster
sinkable-new-object-dag                        73.1767+-2.2898           71.5237+-8.1888          might be 1.0231x faster
string-char-code-at                            16.6472+-0.9666           16.3035+-0.2773          might be 1.0211x faster
double-to-uint32-typed-array-no-inline          4.9535+-1.5822            4.0127+-1.9439          might be 1.2345x faster
Int16Array-bubble-sort                         22.5604+-1.7116     ?     23.1584+-2.3771        ? might be 1.0265x slower
switch-char                                     9.5156+-5.9018     ?     11.5331+-4.7763        ? might be 1.2120x slower
switch-char-constant                            4.4026+-2.1312            4.1352+-1.5235          might be 1.0647x faster
infer-one-time-closure-two-vars                11.6826+-0.8567     ?     12.2563+-0.6920        ? might be 1.0491x slower
object-test                                     4.8787+-1.2003            4.7780+-1.0864          might be 1.0211x faster
external-arguments-getbyval                     2.4396+-0.4737            2.2172+-0.6453          might be 1.1003x faster
plus-boolean                                    4.1367+-1.0407            3.9117+-0.2510          might be 1.0575x faster
Int16Array-alloc-long-lived                    68.4337+-14.0157          66.3136+-6.6898          might be 1.0320x faster
fold-get-by-id-to-multi-get-by-offset           8.7517+-1.8245     ?      9.5350+-3.1157        ? might be 1.0895x slower
infer-one-time-deep-closure                    20.3054+-0.5593     ?     20.4953+-1.1750        ?
new-array-buffer-push                           7.1581+-0.1430     ?      7.7783+-1.5578        ? might be 1.0866x slower
aliased-arguments-getbyval                      3.0016+-1.4915            2.9485+-1.9001          might be 1.0180x faster
by-val-generic                                 10.4650+-1.4751           10.3110+-0.8274          might be 1.0149x faster
ArrayBuffer-Int8Array-alloc-long-lived         14.7706+-1.0619     ?     14.8583+-0.7630        ?
exit-length-on-plain-object                    15.6234+-3.0875     ?     16.6904+-5.2496        ? might be 1.0683x slower
Int32Array-alloc                                4.0677+-0.6824            3.6994+-0.3063          might be 1.0996x faster
weird-inlining-const-prop                       4.8498+-4.9838            4.8235+-0.9933        
DataView-custom-properties                     50.5095+-2.8770           47.9488+-2.2162          might be 1.0534x faster
HashMap-string-put-get-iterate                 33.8091+-5.7168           30.5224+-4.8276          might be 1.1077x faster
get-by-id-bimorphic-check-structure-elimination-simple
                                                3.5546+-1.2022     ?      4.0973+-1.2257        ? might be 1.1527x slower
temporal-structure                             18.4987+-3.6065     ?     19.8476+-4.3044        ? might be 1.0729x slower
for-of-iterate-array-values                     5.8018+-1.4654     ?      9.2687+-6.0821        ? might be 1.5976x slower
varargs-construct                              26.5723+-0.8619     ?     27.3697+-5.1807        ? might be 1.0300x slower
double-to-uint32-typed-array                    2.6732+-0.9438     ?      2.9745+-0.5515        ? might be 1.1127x slower
int-or-other-mul-then-get-by-val                5.8188+-1.8001     ?      9.9722+-5.7005        ? might be 1.7138x slower
put-by-val-machine-int                          4.6715+-1.9926            4.3239+-1.2249          might be 1.0804x faster
lots-of-fields                                 11.8992+-0.3162     ?     15.5871+-9.7765        ? might be 1.3099x slower
infer-closure-const-then-mov-no-inline          5.7249+-2.5846     ?      6.2253+-2.1776        ? might be 1.0874x slower
arguments                                       9.4756+-1.3633            9.3428+-0.9296          might be 1.0142x faster
negative-zero-divide                            0.3959+-0.1762     ?      0.4678+-0.1607        ? might be 1.1814x slower
big-int-mul                                     6.9600+-3.6382            5.7886+-1.0060          might be 1.2024x faster
is-object-or-null-tricky-function               5.6600+-1.7831     ?      9.1865+-2.7350        ? might be 1.6230x slower
try-catch-get-by-val-scoped-arguments           9.1990+-1.3984            7.8943+-0.3584          might be 1.1653x faster
is-undefined-fold-tricky                        5.0547+-1.5616     ?      5.0804+-1.2644        ?
setter                                          8.5793+-3.6327            7.8697+-3.1293          might be 1.0902x faster
neg-boolean                                     7.1803+-6.3418            4.2950+-1.5306          might be 1.6718x faster
poly-chain-access-simpler                       5.3395+-1.4080            5.0878+-1.8696          might be 1.0495x faster
slow-ternaries                                 26.7023+-3.2108           25.1263+-1.7928          might be 1.0627x faster
put-by-id-slightly-polymorphic                  3.9833+-0.7963            3.9418+-0.4661          might be 1.0105x faster
arguments-out-of-bounds                        15.1092+-0.6570           14.9901+-0.9164        
sink-function                                  12.1559+-1.7425           11.8850+-2.5217          might be 1.0228x faster
marsaglia-larger-ints                          46.1566+-3.7006     ?     46.3276+-2.5420        ?
undefined-test                                  6.3511+-3.5001     ?      6.5529+-5.5531        ? might be 1.0318x slower
imul-mixed                                      8.0333+-2.1428            7.6112+-1.3895          might be 1.0555x faster
global-var-const-infer                          0.9865+-0.0998            0.7966+-0.1799          might be 1.2384x faster
asmjs_bool_bug                                  8.2233+-0.9297     ?     10.5217+-1.6688        ? might be 1.2795x slower
double-pollution-putbyoffset                    6.9589+-3.5628     ?      7.0747+-1.6857        ? might be 1.0166x slower
is-object-or-null-fold                          5.5737+-1.8306            4.8656+-2.4119          might be 1.1455x faster
cell-argument                                   9.0862+-0.8503            8.3936+-0.3333          might be 1.0825x faster
int-or-other-add                                7.9547+-2.9436            6.8779+-1.7915          might be 1.1566x faster
plus-boolean-arith                              5.0709+-2.7654     ?      5.5923+-2.2417        ? might be 1.1028x slower
ArrayBuffer-Int32Array-byteOffset               5.5049+-0.8825     ?      5.9941+-1.6199        ? might be 1.0889x slower
mod-boolean                                     9.8745+-1.7060            9.4896+-1.7459          might be 1.0406x faster
infer-closure-const-then-mov                   17.9988+-1.9135     ?     18.7522+-3.0013        ? might be 1.0419x slower
large-int-neg                                  20.1788+-8.4547           16.9641+-0.5349          might be 1.1895x faster
fround                                         18.8953+-1.0333           18.4796+-0.9270          might be 1.0225x faster
elidable-new-object-dag                        52.9552+-9.6337     ?     53.2982+-2.5523        ?
make-indexed-storage                            4.4695+-0.3147            4.0377+-0.9121          might be 1.1069x faster
int-or-other-add-then-get-by-val                7.0979+-1.0585            6.9083+-1.9658          might be 1.0275x faster
string-cons-repeat                              8.9427+-1.1837            8.1000+-0.0596          might be 1.1040x faster
logical-not                                     8.4673+-4.0941     ?      8.9393+-3.9092        ? might be 1.0557x slower
poly-chain-access-different-prototypes-simple
                                                6.6225+-1.6966            4.6721+-1.4395          might be 1.4175x faster
fixed-typed-array-storage-var-index             1.7548+-0.7428     ?      2.8454+-2.2220        ? might be 1.6215x slower
function-test                                   4.8754+-1.1440     ?      5.1973+-2.0313        ? might be 1.0660x slower
string-cons-tower                               8.2465+-0.0630     ?      8.3145+-0.4124        ?
destructuring-swap                              6.5972+-1.7637     ?      8.1477+-2.3554        ? might be 1.2350x slower
is-function-fold-tricky                         8.2085+-2.4127            6.5580+-2.9546          might be 1.2517x faster
int-or-other-max-then-get-by-val                6.0703+-2.1613            5.9158+-1.4108          might be 1.0261x faster
fold-multi-get-by-offset-to-get-by-offset
                                                9.2517+-2.8279     ?      9.9143+-1.7608        ? might be 1.0716x slower
method-on-number                               23.7557+-4.9758           23.5717+-3.7308        
put-by-id-replace-and-transition               11.8198+-2.6435           11.4363+-2.3293          might be 1.0335x faster
int-or-other-neg-zero-then-get-by-val          24.9982+-2.0030     ?     25.6137+-1.1262        ? might be 1.0246x slower
varargs-strict-mode                            11.8137+-2.0839     ?     13.1041+-2.0446        ? might be 1.1092x slower
string-get-by-val-out-of-bounds-insane          4.9637+-1.2080            4.5764+-1.5608          might be 1.0847x faster
imul-double-only                                7.7811+-0.9381     ?      7.8682+-1.4612        ? might be 1.0112x slower
for-of-iterate-array-keys                       8.9407+-4.4762            5.7545+-1.1647          might be 1.5537x faster
string-get-by-val                               6.5082+-2.6530            6.3985+-2.0470          might be 1.0172x faster
nested-function-parsing                        47.0643+-2.1849     ?     48.1733+-4.9711        ? might be 1.0236x slower
string-repeat-arith                            33.9853+-0.6032     ?     34.2635+-0.4027        ?
inline-arguments-aliased-access                 5.7248+-1.6339     ?      7.1923+-1.5319        ? might be 1.2563x slower
allocate-big-object                             3.9526+-0.9713     ?      4.6254+-1.1101        ? might be 1.1702x slower
is-object-or-null-fold-less-tricky              6.4180+-1.6015            5.8872+-1.0787          might be 1.0902x faster
elidable-new-object-tree                       54.5893+-3.3704     ?     57.0565+-3.2476        ? might be 1.0452x slower
ArrayBuffer-Int8Array-alloc                    12.7703+-2.9125           11.8707+-0.3109          might be 1.0758x faster
int52-spill                                     9.0103+-1.9544            8.5464+-2.5109          might be 1.0543x faster
no-inline-constructor                          48.6287+-2.5161           48.0029+-3.9066          might be 1.0130x faster
hoist-make-rope                                10.1753+-1.0694     ?     10.4042+-0.9380        ? might be 1.0225x slower
arguments-strict-mode                          10.5912+-1.4122           10.2409+-0.5867          might be 1.0342x faster
function-with-eval                            119.1827+-1.6606     ?    120.0358+-8.6264        ?
ArrayBuffer-DataView-alloc-long-lived          16.9248+-1.0344           16.8046+-0.6020        
simple-poly-call-nested                         8.6672+-0.8238     ?     10.8288+-2.3141        ? might be 1.2494x slower
switch-string-big-length-tower-var             22.3899+-2.7176           21.2952+-0.9903          might be 1.0514x faster
number-test                                     6.1629+-4.3513            4.3727+-1.0893          might be 1.4094x faster
Int16Array-load-int-mul                         2.7545+-0.6284            2.3510+-1.1112          might be 1.1716x faster
put-by-id                                      15.7625+-0.5857     ^     14.6675+-0.3475        ^ definitely 1.0747x faster
imul-int-only                                  10.2362+-0.8327     ?     12.6078+-7.2586        ? might be 1.2317x slower
gcse                                            6.5404+-0.9986     ?      7.2551+-0.4785        ? might be 1.1093x slower
create-lots-of-functions                       12.9481+-1.0071     ?     14.1152+-1.8724        ? might be 1.0901x slower
in-four-cases                                  22.5479+-1.7810           22.0986+-3.2669          might be 1.0203x faster
elidable-new-object-then-call                  43.9453+-3.9023     ?     45.2218+-2.9191        ? might be 1.0290x slower
int-or-other-sub-then-get-by-val                7.1833+-2.0504     ?      7.5371+-2.0683        ? might be 1.0493x slower
mul-boolean-double                              6.9780+-3.8799            5.8865+-1.7442          might be 1.1854x faster
mod-boolean-double                             11.1987+-5.4544           10.5732+-2.2249          might be 1.0592x faster
inline-arguments-access                         6.5897+-1.9013            5.6948+-0.9979          might be 1.1571x faster
substring-concat-weird                         54.7836+-12.0956          52.0726+-5.0070          might be 1.0521x faster
varargs-construct-inline                       31.6785+-3.4875     ?     34.1192+-1.3318        ? might be 1.0770x slower
HashMap-put-get-iterate                        34.0947+-5.6344           33.0253+-5.3777          might be 1.0324x faster
string-long-ident-equality                     15.6637+-0.8171     ?     16.0711+-2.3712        ? might be 1.0260x slower
mul-boolean                                     4.1768+-1.2351            3.5472+-1.2238          might be 1.1775x faster
get-by-id-check-structure-elimination           8.0438+-3.0921     ?      8.5772+-2.1746        ? might be 1.0663x slower
marsaglia-osr-entry                            23.8403+-1.1762           23.3683+-1.1430          might be 1.0202x faster
Float64Array-alloc-long-lived                  96.8298+-11.3701    ?     99.8956+-8.4671        ? might be 1.0317x slower
misc-strict-eq                                 38.6390+-5.8838           37.6578+-3.2677          might be 1.0261x faster
make-rope-cse                                   4.6174+-0.0204            4.5800+-0.0356        
array-with-double-sum                           4.6282+-0.7274     ?      6.1640+-2.7480        ? might be 1.3318x slower
substring                                      63.1255+-1.6872           61.6670+-2.1230          might be 1.0237x faster
array-with-double-increment                     7.6030+-1.1410            6.3142+-2.2925          might be 1.2041x faster
is-object-or-null-trickier-function             8.0823+-2.6227            7.1418+-0.7360          might be 1.1317x faster
for-of-iterate-array-entries                    7.8913+-3.7777     ?      9.3710+-3.0149        ? might be 1.1875x slower
array-nonarray-polymorhpic-access              33.8588+-1.3553           33.7005+-2.0344        
varargs                                        12.2025+-2.6895           12.1212+-2.0506        
string-out-of-bounds                           15.0703+-0.5145           14.8633+-0.5892          might be 1.0139x faster
inlined-put-by-id-transition                   12.4658+-1.0606     ?     14.4789+-1.9917        ? might be 1.1615x slower
minus-boolean-double                            5.5605+-0.6891            5.1598+-1.2461          might be 1.0777x faster
is-object-or-null-tricky-internal-function
                                               10.7645+-2.5841     ?     12.3712+-2.8403        ? might be 1.1493x slower
delay-tear-off-arguments-strictmode            15.4738+-2.1733           15.3405+-1.8490        
array-prototype-every                          84.9688+-1.5797     ?     90.4536+-6.8803        ? might be 1.0646x slower
chain-getter-access                             9.5942+-1.0657     ?     10.2708+-1.4402        ? might be 1.0705x slower
int-or-other-min-then-get-by-val                7.0979+-1.9934            6.6736+-2.1818          might be 1.0636x faster
HashMap-put-get-iterate-keys                   32.6166+-6.7057     ?     33.0284+-1.2274        ? might be 1.0126x slower
double-pollution-getbyval                      10.1992+-1.7252     ?     11.1105+-1.7082        ? might be 1.0893x slower
structure-hoist-over-transitions                3.8925+-1.3922     ?      5.5652+-3.4943        ? might be 1.4297x slower
polymorphic-structure                          19.8323+-1.7156     ?     19.9415+-1.3327        ?
sorting-benchmark                              23.7429+-4.8380           23.4484+-3.1260          might be 1.0126x faster
fixed-typed-array-storage                       1.8840+-1.9733            1.4536+-0.3558          might be 1.2961x faster
load-varargs-elimination                       25.7203+-1.4438     ?     29.4060+-11.9079       ? might be 1.1433x slower
switch-string-length-tower                     17.1992+-7.0785           14.1382+-0.6479          might be 1.2165x faster
fold-multi-get-by-offset-to-poly-get-by-offset
                                                8.2316+-2.4199     ?     11.5649+-6.4438        ? might be 1.4049x slower
Int8Array-load-with-byteLength                  5.9202+-2.5212            5.8020+-1.8187          might be 1.0204x faster
Float64Array-to-Int16Array-set                 80.8888+-0.0690     ?     81.2938+-2.8136        ?
infer-constant-global-property                 11.2943+-4.9621            9.3959+-1.6791          might be 1.2020x faster
int-overflow-local                              7.3888+-2.9489     ?      7.7682+-1.3546        ? might be 1.0514x slower
min-boolean                                     4.3464+-0.9029     ?      4.9523+-0.6115        ? might be 1.1394x slower
simple-getter-access                           12.1953+-0.6315     ?     12.5222+-0.8394        ? might be 1.0268x slower
string-hash                                     4.7565+-5.0978            3.6462+-0.3920          might be 1.3045x faster
arity-mismatch-inlining                         1.4781+-0.3387     ?      1.6665+-1.7246        ? might be 1.1275x slower
obviously-elidable-new-object                  37.3594+-4.0911     ?     38.0291+-4.5759        ? might be 1.0179x slower
deltablue-varargs                             250.2565+-13.8643         243.6049+-17.1690         might be 1.0273x faster
gcse-poly-get                                  22.9980+-2.9706           21.8203+-4.2891          might be 1.0540x faster
hoist-poly-check-structure-effectful-loop
                                                7.6160+-0.5192            7.2459+-0.4286          might be 1.0511x faster
minus-boolean                                   4.2348+-0.7533            3.9355+-0.3680          might be 1.0761x faster
gcse-poly-get-less-obvious                     20.5714+-1.4489           20.0095+-1.5150          might be 1.0281x faster
fold-multi-put-by-offset-to-replace-or-transition-put-by-offset
                                               12.6566+-1.3069           10.9324+-2.6487          might be 1.1577x faster
branch-fold                                     6.3164+-2.1605            5.2607+-1.1742          might be 1.2007x faster
double-to-int32-typed-array                     3.2770+-1.9404            3.1276+-0.9763          might be 1.0478x faster
plus-boolean-double                             4.6697+-1.5240     ?      4.7291+-1.0495        ? might be 1.0127x slower
hoist-poly-check-structure                      5.3572+-0.8104     ?      5.4576+-1.9307        ? might be 1.0187x slower
infer-one-time-closure-ten-vars                12.9818+-1.0616           12.2173+-0.8742          might be 1.0626x faster
is-function-fold-tricky-internal-function
                                               12.3780+-1.1325           12.3216+-0.5352        
array-with-double-mul-add                       8.7850+-2.0390            8.5738+-4.6250          might be 1.0246x faster
array-prototype-map                            93.8560+-1.5469     !     99.6648+-1.2146        ! definitely 1.0619x slower
varargs-inline                                 11.1921+-1.4431           10.0687+-0.9253          might be 1.1116x faster
sink-huge-activation                           18.0062+-1.8352           17.7236+-1.9988          might be 1.0159x faster
undefined-property-access                     351.4200+-2.4585          350.6940+-1.6602        
array-with-int32-add-sub                        9.0258+-1.1452     ?     11.1035+-2.9605        ? might be 1.2302x slower
function-dot-apply                              4.3010+-1.2025            3.6113+-1.7376          might be 1.1910x faster
string-sub                                     69.8506+-4.5120           68.5233+-3.2559          might be 1.0194x faster
boolean-test                                    5.1558+-0.7020            4.9907+-0.7992          might be 1.0331x faster
emscripten-cube2hash                           39.5210+-3.4421           37.4302+-4.5469          might be 1.0559x faster
Int32Array-alloc-long-lived                    91.4318+-17.0202          74.4957+-16.0606         might be 1.2273x faster
get-by-id-self-or-proto                        19.0886+-5.1090           18.1528+-2.8029          might be 1.0516x faster
cse-new-array-buffer                            3.3290+-0.8747     ?      3.4014+-0.6259        ? might be 1.0217x slower
sinkable-new-object                            42.0057+-8.4493     ?     42.3528+-8.3678        ?
put-by-val-large-index-blank-indexing-type
                                                6.8049+-0.8843     ?      7.5267+-1.4145        ? might be 1.1061x slower
Int8Array-load                                  5.7086+-0.8288     ?      6.0030+-2.9884        ? might be 1.0516x slower
int-or-other-abs-then-get-by-val                7.6673+-1.3250            7.2314+-2.1157          might be 1.0603x faster
abs-boolean                                     4.9238+-2.0014            3.8214+-1.0379          might be 1.2885x faster
call-spread-call                               26.2910+-5.4057     ?     27.3833+-4.8404        ? might be 1.0415x slower
unprofiled-licm                                21.4268+-0.3302     ?     22.6802+-1.5736        ? might be 1.0585x slower
constant-test                                   7.5938+-0.3994     ?      8.1403+-3.8266        ? might be 1.0720x slower
cfg-simplify                                    4.4039+-1.1825     ?      4.4490+-1.4819        ? might be 1.0102x slower
get-by-id-quadmorphic-check-structure-elimination-simple
                                                5.0717+-2.2459     ?      5.3369+-1.7224        ? might be 1.0523x slower
fold-put-structure                              6.6812+-0.7619     ?      7.0009+-2.3392        ? might be 1.0479x slower
get-by-id-chain-from-try-block                  7.5861+-0.5483     ?      7.6273+-1.3297        ?
poly-chain-access-different-prototypes          5.2591+-3.7525            4.2839+-0.4665          might be 1.2276x faster
is-number-fold-tricky                           8.3326+-7.3816            7.2484+-2.4599          might be 1.1496x faster
get_callee_monomorphic                          4.8942+-1.2761            4.3144+-0.8070          might be 1.1344x faster
deconstructing-parameters-overridden-by-function
                                                0.6175+-0.1943            0.6102+-0.2261          might be 1.0120x faster
empty-string-plus-int                           7.5922+-2.2039     ?      8.0364+-1.5014        ? might be 1.0585x slower
Float32Array-to-Float64Array-set               65.9405+-0.0753     ?     66.3104+-2.5288        ?
switch-string-short                            14.5782+-1.2375           14.2700+-0.5700          might be 1.0216x faster
switch-string-basic-big                        19.4939+-0.5303           19.0100+-0.3114          might be 1.0255x faster
double-get-by-val-out-of-bounds                 5.9601+-0.8163     ?      6.2715+-1.3758        ? might be 1.0523x slower
large-int-captured                              7.3231+-2.0013            6.3019+-1.6734          might be 1.1620x faster
elidable-new-object-roflcopter                 57.4022+-3.4878     ?     60.2643+-1.3658        ? might be 1.0499x slower
string-get-by-val-out-of-bounds                 7.9369+-2.7812     ?      8.2036+-2.7591        ? might be 1.0336x slower
array-with-double-add                           7.1480+-2.0880            5.9515+-0.9696          might be 1.2010x faster
math-with-out-of-bounds-array-values           37.1856+-4.1498     ?     39.3407+-4.2249        ? might be 1.0580x slower
string-test                                     4.9500+-2.7086     ?      5.4564+-1.0702        ? might be 1.1023x slower
is-undefined-fold                               4.9568+-0.9494     ?      5.1312+-1.2667        ? might be 1.0352x slower
switch                                         16.3920+-2.1189           15.1998+-2.9663          might be 1.0784x faster
inline-get-scoped-var                           7.7410+-3.6877            7.1135+-1.2682          might be 1.0882x faster
tear-off-arguments-simple                       5.4454+-0.6198            4.8415+-1.8003          might be 1.1247x faster
negative-zero-modulo                            0.6182+-0.2141            0.4742+-0.2307          might be 1.3036x faster
infer-closure-const-then-reenter               25.4058+-1.3591           25.1704+-1.3386        
array-prototype-forEach                        82.1766+-2.2679     ?     85.7826+-1.7473        ? might be 1.0439x slower
switch-constant                                11.8506+-2.0230           10.5495+-1.5404          might be 1.1233x faster
negative-zero-negate                            0.6365+-0.5446            0.4124+-0.0901          might be 1.5437x faster
fold-get-by-id-to-multi-get-by-offset-rare-int
                                                9.3127+-0.8422     ?     10.6398+-2.3064        ? might be 1.1425x slower
in-one-case-false                              13.5490+-1.2724           12.5512+-1.6485          might be 1.0795x faster
int-or-other-div-then-get-by-val                6.3170+-2.0535     ?      9.0204+-7.9216        ? might be 1.4280x slower
typed-array-get-set-by-val-profiling           33.4012+-1.4198     ?     33.5062+-0.7540        ?
Int8Array-alloc-long-lived                     68.3145+-10.5629          57.3865+-13.7553         might be 1.1904x faster
simple-poly-call                                2.3720+-1.1259            1.7653+-0.4649          might be 1.3437x faster
fold-multi-put-by-offset-to-put-by-offset
                                                8.9150+-7.0137            6.6733+-3.0205          might be 1.3359x faster
switch-string-basic-big-var                    22.4404+-0.1921     ?     22.7070+-1.7166        ? might be 1.0119x slower
Int16Array-to-Int32Array-set                   64.7462+-0.4967           64.6060+-0.1969        
sinkable-new-object-taken                      61.4186+-1.8324     ?     61.9340+-3.1375        ?
string-concat-pair-object                       3.1947+-0.4522            2.9547+-0.1827          might be 1.0812x faster
branch-on-string-as-boolean                    17.9920+-0.8076     ?     18.6877+-1.5901        ? might be 1.0387x slower
is-number-fold                                  5.7957+-0.6212     ?      6.3052+-3.8313        ? might be 1.0879x slower
obvious-sink-pathology-taken                  170.1662+-2.2544          166.5267+-9.4316          might be 1.0219x faster
ftl-library-inlining                           68.5070+-1.9206           67.9995+-1.3111        
array-with-int32-or-double-sum                  5.1815+-1.1452            4.7099+-1.2033          might be 1.1001x faster
Int16Array-bubble-sort-with-byteLength         22.8265+-1.0132     ?     25.3017+-8.4822        ? might be 1.1084x slower

<geometric>                                    10.9925+-0.1463           10.9346+-0.1426          might be 1.0053x faster
Comment 28 Jordan Harband 2015-05-30 10:57:32 PDT
Created attachment 253961 [details]
Patch
Comment 29 Jordan Harband 2015-05-30 10:58:12 PDT
Relevant new benchmark results:

   array-prototype-reduce                        109.6757+-9.0183     ^     72.9084+-4.1290        ^ definitely 1.5043x faster
   array-prototype-reduceRight                   107.6423+-4.3030     ^     74.5804+-6.6558        ^ definitely 1.4433x faster
Comment 30 WebKit Commit Bot 2015-05-31 02:29:16 PDT
Comment on attachment 253961 [details]
Patch

Clearing flags on attachment: 253961

Committed r185038: <http://trac.webkit.org/changeset/185038>
Comment 31 WebKit Commit Bot 2015-05-31 02:29:24 PDT
All reviewed patches have been landed.  Closing bug.