Bug 149654

Summary: Allow an object's marking state to track The Three Colors
Product: WebKit Reporter: Filip Pizlo <fpizlo>
Component: JavaScriptCoreAssignee: Filip Pizlo <fpizlo>
Status: RESOLVED FIXED    
Severity: Normal CC: barraclough, benjamin, ggaren, joepeck, mark.lam, mhahnenb, msaboff, nrotem, oliver, saam, sam
Priority: P2    
Version: Other   
Hardware: All   
OS: All   
Bug Depends on:    
Bug Blocks: 149432    
Attachments:
Description Flags
a very rough start
none
what I'm thinking so far
none
it passes so many tests
none
the patch
ggaren: review+
patch for landing
none
patch for landing none

Description Filip Pizlo 2015-09-29 20:43:27 PDT
Currently, each object not only knows if it's marked in this GC, but also whether it's a survivor of a prior GC and whether it's in a remembered set.  When we add concurrent GC, we'll also want to differentiate between being on the GC worklist (i.e. "grey") and having already been marked (i.e. "black").  But we also want to know if an object is grey the first time (and so should be allowed to trigger copying) or a subsequent time (and so should not trigger copying).
Comment 1 Filip Pizlo 2015-09-29 20:44:03 PDT
Created attachment 262137 [details]
a very rough start
Comment 2 Filip Pizlo 2015-09-30 10:47:17 PDT
Some more thoughts:

We "report live bytes", which implies copying if the block doesn't get pinned, if the owning object is not
remembered or if the block is new.

old object, not remembered, old storage:  copy
old object, not remembered, new storage:  copy
old object, remembered, old storage:      don't copy
old object, remembered, new storage:      copy
new object, not remembered, old storage:  copy
new object, not remembered, new storage:  copy
new object, remembered, old storage:      don't copy
new object, remembered, new storage:      copy

During full collections, we always report live bytes.  This means that we only avoid copying during an eden
collection, when we have a remembered object with old storage.

We also want to avoid copying if we already added the object to the copying worklist. So, we want bits to
track if an object is being re-greyed by the barrier.  Essentially, we want to track whether the object is
"OldGrey".  If it's OldGrey, then we don't want to copy.
Comment 3 Filip Pizlo 2015-09-30 20:52:44 PDT
Created attachment 262227 [details]
what I'm thinking so far
Comment 4 Filip Pizlo 2015-10-03 15:30:14 PDT
Created attachment 262381 [details]
it passes so many tests

I'm almost done with a debug test run. No failures!

Still need to measure performance.
Comment 5 Filip Pizlo 2015-10-03 15:54:35 PDT
Created attachment 262382 [details]
the patch
Comment 6 Filip Pizlo 2015-10-03 19:12:50 PDT
Looks like perf is good.  Note that the SunSpider "speed-up" appears to be entirely due to some noise event for the TipOfTree configuration.

Benchmark report for SunSpider, LongSpider, V8Spider, Octane, Kraken, JSRegress, AsmBench, and CompressionBench on shakezilla (MacBookPro11,3).

VMs tested:
"TipOfTree" at /Volumes/Data/secondary/OpenSource/WebKitBuild/Release/jsc (r190544)
"TriColor" at /Volumes/Data/tertiary/OpenSource/WebKitBuild/Release/jsc (r190544)

Collected 7 samples per benchmark/VM, with 7 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.

                                                        TipOfTree                  TriColor                                     
SunSpider:
   3d-cube                                            4.8942+-0.8680            4.5401+-0.2348          might be 1.0780x faster
   3d-morph                                           5.3798+-0.1090            5.2842+-0.1022          might be 1.0181x faster
   3d-raytrace                                        5.7031+-0.5679            5.4353+-0.2631          might be 1.0493x faster
   access-binary-trees                                2.1525+-0.0719            2.1428+-0.0651        
   access-fannkuch                                    5.4097+-0.2176     ?      5.5495+-0.1577        ? might be 1.0258x slower
   access-nbody                                       2.5750+-0.0851     ?      2.6479+-0.2499        ? might be 1.0283x slower
   access-nsieve                                      3.0663+-0.0655     ?      3.1291+-0.1915        ? might be 1.0205x slower
   bitops-3bit-bits-in-byte                           1.1953+-0.0958            1.1542+-0.0256          might be 1.0356x faster
   bitops-bits-in-byte                                3.3465+-0.2861            3.2334+-0.1225          might be 1.0350x faster
   bitops-bitwise-and                                 2.0528+-0.0685            2.0223+-0.0456          might be 1.0151x faster
   bitops-nsieve-bits                                 2.9045+-0.0474     ?      2.9145+-0.0285        ?
   controlflow-recursive                              2.3759+-0.0694            2.3526+-0.0391        
   crypto-aes                                         4.1060+-0.3217            3.9004+-0.0913          might be 1.0527x faster
   crypto-md5                                         2.4576+-0.0251     ?      2.4779+-0.0341        ?
   crypto-sha1                                        2.5524+-0.2189            2.4765+-0.1709          might be 1.0306x faster
   date-format-tofte                                  6.5630+-0.3119     ?      6.6170+-0.1596        ?
   date-format-xparb                                  4.6331+-0.1446     ?      4.8522+-0.4146        ? might be 1.0473x slower
   math-cordic                                        2.7943+-0.0271     ?      2.8057+-0.0866        ?
   math-partial-sums                                  4.8951+-0.2986            4.7157+-0.0643          might be 1.0381x faster
   math-spectral-norm                                 1.9477+-0.0605     ?      1.9977+-0.1437        ? might be 1.0256x slower
   regexp-dna                                         6.3568+-0.3379     ?      6.4190+-0.3968        ?
   string-base64                                      4.6866+-0.3873            4.3914+-0.2708          might be 1.0672x faster
   string-fasta                                       5.8948+-0.4035            5.7889+-0.1521          might be 1.0183x faster
   string-tagcloud                                    7.8223+-0.1580     ?      7.8801+-0.3712        ?
   string-unpack-code                                19.2254+-0.9741           18.2718+-0.9257          might be 1.0522x faster
   string-validate-input                              5.6605+-1.3120            4.5556+-0.2255          might be 1.2425x faster

   <arithmetic>                                       4.6404+-0.0360     ^      4.5214+-0.0721        ^ definitely 1.0263x faster

                                                        TipOfTree                  TriColor                                     
LongSpider:
   3d-cube                                          815.2919+-9.3045     ?    815.9959+-52.9691       ?
   3d-morph                                        1503.0599+-9.6573         1493.7435+-7.9463        
   3d-raytrace                                      595.7643+-5.7696     ?    600.4731+-5.1082        ?
   access-binary-trees                              790.2127+-5.4656     ?    794.7686+-9.1339        ?
   access-fannkuch                                  274.7091+-2.7868          273.5999+-3.1028        
   access-nbody                                     517.1867+-6.6780          515.3608+-3.6633        
   access-nsieve                                    372.2510+-12.2428         361.2472+-3.2305          might be 1.0305x faster
   bitops-3bit-bits-in-byte                          34.7643+-1.1709           34.0362+-0.7289          might be 1.0214x faster
   bitops-bits-in-byte                               78.2077+-6.4030           75.4515+-3.1635          might be 1.0365x faster
   bitops-nsieve-bits                               403.6257+-4.9867          402.0826+-5.5880        
   controlflow-recursive                            430.4269+-9.3857          426.9403+-1.9272        
   crypto-aes                                       551.3410+-5.8244          546.3305+-11.8432       
   crypto-md5                                       458.7595+-31.2575    ?    473.6056+-36.2021       ? might be 1.0324x slower
   crypto-sha1                                      629.1768+-11.6877    ?    632.0646+-12.2779       ?
   date-format-tofte                                492.8834+-8.5670     ?    495.4270+-5.3454        ?
   date-format-xparb                                651.7153+-4.9089     ?    677.6053+-55.2984       ? might be 1.0397x slower
   hash-map                                         148.6988+-0.9737     ?    149.1577+-2.8005        ?
   math-cordic                                      478.2797+-3.0974          476.9175+-3.1830        
   math-partial-sums                                459.6997+-4.9964          459.5579+-8.0692        
   math-spectral-norm                               548.8529+-2.7937          548.6461+-3.9632        
   string-base64                                    394.1195+-80.0408         366.4071+-3.1020          might be 1.0756x faster
   string-fasta                                     363.1753+-2.5852          362.6674+-2.7559        
   string-tagcloud                                  174.2933+-1.2901          173.6708+-1.5963        

   <geometric>                                      386.6421+-3.4464          385.1042+-2.8105          might be 1.0040x faster

                                                        TipOfTree                  TriColor                                     
V8Spider:
   crypto                                            48.6228+-2.3362           48.3634+-1.2113        
   deltablue                                         78.9518+-5.2530           77.7599+-2.6298          might be 1.0153x faster
   earley-boyer                                      42.0158+-1.8928     ?     45.0093+-3.2828        ? might be 1.0712x slower
   raytrace                                          30.6861+-0.7461     ?     31.0470+-1.8243        ? might be 1.0118x slower
   regexp                                            62.8760+-1.8904     ?     63.2641+-2.2155        ?
   richards                                          56.9429+-1.7550           53.9923+-1.7713          might be 1.0546x faster
   splay                                             35.0469+-0.8419     ?     35.9960+-1.0206        ? might be 1.0271x slower

   <geometric>                                       48.3555+-0.8908     ?     48.6235+-0.9082        ? might be 1.0055x slower

                                                        TipOfTree                  TriColor                                     
Octane:
   encrypt                                           0.16556+-0.00193          0.16534+-0.00121       
   decrypt                                           2.90833+-0.02034    ^     2.86301+-0.02383       ^ definitely 1.0158x faster
   deltablue                                x2       0.13779+-0.00113          0.13658+-0.00136       
   earley                                            0.28773+-0.00320          0.28577+-0.00221       
   boyer                                             4.29975+-0.03471    ?     4.30101+-0.03846       ?
   navier-stokes                            x2       4.82677+-0.02527          4.82564+-0.03002       
   raytrace                                 x2       0.86023+-0.00756    ?     0.86234+-0.00662       ?
   richards                                 x2       0.08860+-0.00060    ?     0.08867+-0.00086       ?
   splay                                    x2       0.33395+-0.00430    ?     0.33607+-0.00439       ?
   regexp                                   x2      24.42412+-0.29283    ^    23.77515+-0.30541       ^ definitely 1.0273x faster
   pdfjs                                    x2      37.15178+-0.19656         36.60700+-0.39992         might be 1.0149x faster
   mandreel                                 x2      42.45502+-0.44227    ?    42.54543+-0.39828       ?
   gbemu                                    x2      30.91807+-0.50155    ?    30.94074+-0.40894       ?
   closure                                           0.57578+-0.00194    ?     0.57769+-0.00213       ?
   jquery                                            7.30238+-0.06489    ?     7.31099+-0.10964       ?
   box2d                                    x2       9.13219+-0.11711    ?     9.15342+-0.05365       ?
   zlib                                     x2     389.36630+-6.21572        382.42989+-13.71285        might be 1.0181x faster
   typescript                               x2     667.85931+-24.65706       653.63215+-9.26372         might be 1.0218x faster

   <geometric>                                       5.31209+-0.01713          5.28209+-0.02514         might be 1.0057x faster

                                                        TipOfTree                  TriColor                                     
Kraken:
   ai-astar                                          127.400+-1.659            126.226+-0.669         
   audio-beat-detection                               49.937+-0.378      ?      50.479+-0.286         ? might be 1.0109x slower
   audio-dft                                          99.336+-3.600             98.439+-2.505         
   audio-fft                                          35.043+-0.203      ?      35.578+-0.896         ? might be 1.0153x slower
   audio-oscillator                                   56.449+-1.448      ?      57.266+-3.024         ? might be 1.0145x slower
   imaging-darkroom                                   60.154+-0.418      ?      63.404+-8.705         ? might be 1.0540x slower
   imaging-desaturate                                 47.876+-0.406      ?      49.125+-3.526         ? might be 1.0261x slower
   imaging-gaussian-blur                              85.870+-1.648      ?      86.896+-4.797         ? might be 1.0120x slower
   json-parse-financial                               38.812+-2.331             37.409+-1.632           might be 1.0375x faster
   json-stringify-tinderbox                           23.724+-2.029             22.822+-1.148           might be 1.0395x faster
   stanford-crypto-aes                                40.584+-1.039      ?      41.389+-2.474         ? might be 1.0198x slower
   stanford-crypto-ccm                                36.226+-1.558             36.092+-1.917         
   stanford-crypto-pbkdf2                             96.825+-1.759             94.697+-2.060           might be 1.0225x faster
   stanford-crypto-sha256-iterative                   37.196+-1.252             36.261+-0.878           might be 1.0258x faster

   <arithmetic>                                       59.674+-0.552      ?      59.720+-0.738         ? might be 1.0008x slower

                                                        TipOfTree                  TriColor                                     
JSRegress:
   abc-forward-loop-equal                            29.8604+-0.8932           29.5509+-0.6493          might be 1.0105x faster
   abc-postfix-backward-loop                         29.5456+-0.4361     ?     29.7479+-1.0278        ?
   abc-simple-backward-loop                          29.4576+-0.9735     ?     29.6466+-0.8826        ?
   abc-simple-forward-loop                           29.2153+-0.5784     ?     29.8827+-1.1487        ? might be 1.0228x slower
   abc-skippy-loop                                   21.9528+-1.1554     ?     23.2286+-4.6186        ? might be 1.0581x slower
   abs-boolean                                        2.4563+-0.0496     ?      2.5190+-0.1355        ? might be 1.0255x slower
   adapt-to-double-divide                            16.3520+-0.3908     ?     16.3936+-0.4171        ?
   aliased-arguments-getbyval                         1.3366+-0.2667            1.3220+-0.1683          might be 1.0110x faster
   allocate-big-object                                2.4484+-0.1503     ?      2.5066+-0.0737        ? might be 1.0237x slower
   arguments-named-and-reflective                    10.6619+-0.4048           10.6430+-0.1549        
   arguments-out-of-bounds                            9.5033+-0.4298     ?      9.9131+-0.5240        ? might be 1.0431x slower
   arguments-strict-mode                              9.6001+-0.3527            9.3237+-0.3411          might be 1.0296x faster
   arguments                                          8.4427+-0.1317     ?      8.4436+-0.3929        ?
   arity-mismatch-inlining                            0.8509+-0.0385            0.8470+-0.0218        
   array-access-polymorphic-structure                 7.2171+-0.3719     ?      7.4311+-0.6366        ? might be 1.0296x slower
   array-nonarray-polymorhpic-access                 23.6221+-0.8118     ?     23.7943+-0.6558        ?
   array-prototype-every                             77.1762+-1.4685           75.9879+-1.3387          might be 1.0156x faster
   array-prototype-forEach                           77.6548+-3.0987           75.2474+-1.2735          might be 1.0320x faster
   array-prototype-map                               80.6556+-1.2045     ?     83.9839+-5.5240        ? might be 1.0413x slower
   array-prototype-reduce                            71.8042+-1.5729     ?     80.8209+-21.5066       ? might be 1.1256x slower
   array-prototype-reduceRight                       71.8120+-1.2348     ?     72.7222+-4.1618        ? might be 1.0127x slower
   array-prototype-some                              76.8742+-1.2654     ?     77.0297+-1.8669        ?
   array-splice-contiguous                           20.7685+-1.4430     ?     21.1198+-0.4557        ? might be 1.0169x slower
   array-with-double-add                              3.4856+-0.1308     ?      3.6100+-0.3251        ? might be 1.0357x slower
   array-with-double-increment                        3.2094+-0.2877            3.1312+-0.1126          might be 1.0250x faster
   array-with-double-mul-add                          4.3049+-0.1606     ?      4.3397+-0.2221        ?
   array-with-double-sum                              3.2357+-0.1477            3.2076+-0.0954        
   array-with-int32-add-sub                           5.7660+-0.1969            5.6714+-0.1097          might be 1.0167x faster
   array-with-int32-or-double-sum                     3.2461+-0.0444            3.2459+-0.0550        
   ArrayBuffer-DataView-alloc-large-long-lived   
                                                     26.3876+-1.3118           26.0060+-1.4172          might be 1.0147x faster
   ArrayBuffer-DataView-alloc-long-lived             12.0470+-0.3651           11.9440+-0.6154        
   ArrayBuffer-Int32Array-byteOffset                  3.5981+-0.1099            3.5774+-0.0680        
   ArrayBuffer-Int8Array-alloc-large-long-lived   
                                                     25.9883+-0.5425     ?     26.4385+-1.1072        ? might be 1.0173x slower
   ArrayBuffer-Int8Array-alloc-long-lived-buffer   
                                                     19.8219+-1.1173           19.3825+-0.5879          might be 1.0227x faster
   ArrayBuffer-Int8Array-alloc-long-lived            11.7468+-0.5441           11.3335+-0.4956          might be 1.0365x faster
   ArrayBuffer-Int8Array-alloc                        9.4727+-0.2870     ?      9.6138+-0.2816        ? might be 1.0149x slower
   arrowfunction-call                                11.0840+-0.1864           10.8568+-0.1180          might be 1.0209x faster
   asmjs_bool_bug                                     7.5423+-0.2286            7.4151+-0.0406          might be 1.0172x faster
   assign-custom-setter-polymorphic                   2.5365+-0.1816            2.4864+-0.1423          might be 1.0201x faster
   assign-custom-setter                               3.4803+-0.1075     ^      3.1513+-0.0870        ^ definitely 1.1044x faster
   basic-set                                          7.7303+-0.6668            7.5377+-0.8323          might be 1.0256x faster
   big-int-mul                                        3.4893+-0.0752            3.4414+-0.0209          might be 1.0139x faster
   boolean-test                                       3.0597+-0.1591            2.9770+-0.0469          might be 1.0278x faster
   branch-fold                                        3.5897+-0.0467     ?      3.6464+-0.1510        ? might be 1.0158x slower
   branch-on-string-as-boolean                       16.9237+-0.4945     ?     16.9442+-0.4075        ?
   by-val-generic                                     2.4772+-0.0642     ?      2.6077+-0.3014        ? might be 1.0527x slower
   call-spread-apply                                 26.9070+-0.6680           26.5156+-0.6111          might be 1.0148x faster
   call-spread-call                                  21.9233+-0.9412           21.1344+-1.1774          might be 1.0373x faster
   captured-assignments                               0.4208+-0.0170            0.4165+-0.0256          might be 1.0104x faster
   cast-int-to-double                                 5.1544+-0.1941     ?      5.7005+-1.1439        ? might be 1.1060x slower
   cell-argument                                      5.8415+-0.2774     ?      6.2428+-0.3664        ? might be 1.0687x slower
   cfg-simplify                                       2.8870+-0.0603     ?      2.9742+-0.2824        ? might be 1.0302x slower
   chain-getter-access                                8.3485+-0.1764     ?      8.4874+-0.3066        ? might be 1.0166x slower
   cmpeq-obj-to-obj-other                            12.2154+-0.6733           12.0693+-1.2915          might be 1.0121x faster
   constant-test                                      4.8306+-0.0742     ?      5.2579+-1.0840        ? might be 1.0885x slower
   create-lots-of-functions                           9.5940+-0.2667     ?      9.7212+-0.4672        ? might be 1.0133x slower
   cse-new-array-buffer                               2.3131+-0.0796     ?      2.7242+-0.6629        ? might be 1.1777x slower
   cse-new-array                                      2.5508+-0.2720            2.4696+-0.1048          might be 1.0329x faster
   DataView-custom-properties                        31.6155+-1.5833     ?     32.1172+-1.0325        ? might be 1.0159x slower
   delay-tear-off-arguments-strictmode               12.9268+-0.8701           12.0821+-0.5183          might be 1.0699x faster
   deltablue-varargs                                161.8598+-5.1251          159.6751+-1.6263          might be 1.0137x faster
   destructuring-arguments                          162.1272+-0.7185     ?    163.1163+-8.0636        ?
   destructuring-parameters-overridden-by-function   
                                                      0.4809+-0.0329     ?      0.5118+-0.0522        ? might be 1.0643x slower
   destructuring-swap                                 4.8747+-0.1432            4.8445+-0.1073        
   direct-arguments-getbyval                          1.2898+-0.0858            1.2192+-0.0350          might be 1.0579x faster
   div-boolean-double                                 5.4718+-0.3943            5.2807+-0.0823          might be 1.0362x faster
   div-boolean                                        8.1047+-0.0325     ?      8.1889+-0.1637        ? might be 1.0104x slower
   double-get-by-val-out-of-bounds                    4.3201+-0.1123     ?      4.6375+-0.6176        ? might be 1.0734x slower
   double-pollution-getbyval                          8.6370+-0.1025     ?      8.6940+-0.1339        ?
   double-pollution-putbyoffset                       3.6749+-0.1694            3.5893+-0.0926          might be 1.0239x faster
   double-real-use                                   25.9275+-1.8790           24.6513+-1.5030          might be 1.0518x faster
   double-to-int32-typed-array-no-inline              2.1531+-0.0858     ?      2.1862+-0.0962        ? might be 1.0154x slower
   double-to-int32-typed-array                        2.0510+-0.0760            2.0412+-0.0738        
   double-to-uint32-typed-array-no-inline             2.3178+-0.0747     ?      2.4614+-0.3905        ? might be 1.0619x slower
   double-to-uint32-typed-array                       2.1373+-0.0886     ?      2.1846+-0.2265        ? might be 1.0221x slower
   elidable-new-object-dag                           35.4351+-1.8478           34.5306+-1.2323          might be 1.0262x faster
   elidable-new-object-roflcopter                    33.1086+-0.6170     ?     33.5243+-0.9180        ? might be 1.0126x slower
   elidable-new-object-then-call                     31.7167+-0.6562     ?     32.5537+-1.4468        ? might be 1.0264x slower
   elidable-new-object-tree                          39.8021+-4.3768           38.2417+-1.2919          might be 1.0408x faster
   empty-string-plus-int                              4.7414+-0.0831            4.6897+-0.1168          might be 1.0110x faster
   emscripten-cube2hash                              27.8465+-1.3258           27.8421+-0.9109        
   exit-length-on-plain-object                       14.8647+-0.5528     ?     15.8764+-0.7758        ? might be 1.0681x slower
   external-arguments-getbyval                        1.3449+-0.1392            1.3258+-0.1103          might be 1.0144x faster
   external-arguments-putbyval                        2.1875+-0.0738     ?      2.2011+-0.1212        ?
   fixed-typed-array-storage-var-index                1.2725+-0.0799            1.2534+-0.0335          might be 1.0152x faster
   fixed-typed-array-storage                          0.9408+-0.0416            0.9339+-0.0481        
   Float32Array-matrix-mult                           4.0740+-0.0891     ?      4.1270+-0.1796        ? might be 1.0130x slower
   Float32Array-to-Float64Array-set                  50.7722+-1.8040           49.8124+-2.0733          might be 1.0193x faster
   Float64Array-alloc-long-lived                     61.0103+-2.5058           59.0589+-1.4669          might be 1.0330x faster
   Float64Array-to-Int16Array-set                    58.9603+-1.9072     ?     60.2840+-3.1939        ? might be 1.0225x slower
   fold-double-to-int                                12.9586+-0.8524           12.2900+-0.2823          might be 1.0544x faster
   fold-get-by-id-to-multi-get-by-offset-rare-int   
                                                     11.7502+-1.2177           11.3914+-1.2082          might be 1.0315x faster
   fold-get-by-id-to-multi-get-by-offset             10.3464+-1.3780            9.7940+-1.5439          might be 1.0564x faster
   fold-multi-get-by-offset-to-get-by-offset   
                                                      8.1852+-1.7526            8.0548+-1.6877          might be 1.0162x faster
   fold-multi-get-by-offset-to-poly-get-by-offset   
                                                      9.5214+-1.0702            9.3168+-0.9154          might be 1.0220x faster
   fold-multi-put-by-offset-to-poly-put-by-offset   
                                                     10.9720+-1.2613            8.8527+-1.1206          might be 1.2394x faster
   fold-multi-put-by-offset-to-put-by-offset   
                                                      9.7834+-1.4449            9.7667+-0.3423        
   fold-multi-put-by-offset-to-replace-or-transition-put-by-offset   
                                                     10.8681+-4.2727            9.2601+-0.3309          might be 1.1736x faster
   fold-put-by-id-to-multi-put-by-offset             12.1773+-0.7670           10.6980+-0.9477          might be 1.1383x faster
   fold-put-by-val-with-string-to-multi-put-by-offset   
                                                     11.2772+-1.1503           10.3707+-0.8580          might be 1.0874x faster
   fold-put-by-val-with-symbol-to-multi-put-by-offset   
                                                     11.8895+-0.9266           10.9859+-1.4797          might be 1.0823x faster
   fold-put-structure                                 7.5034+-0.9883     ?      7.8790+-1.3462        ? might be 1.0501x slower
   for-of-iterate-array-entries                      10.9003+-0.1974           10.8628+-0.6155        
   for-of-iterate-array-keys                          3.4938+-0.0880     ?      3.5558+-0.1554        ? might be 1.0177x slower
   for-of-iterate-array-values                        3.3479+-0.1575     ?      3.3842+-0.1282        ? might be 1.0108x slower
   fround                                            17.6675+-1.0882     ?     18.2785+-1.0904        ? might be 1.0346x slower
   ftl-library-inlining-dataview                     59.9424+-1.1529           59.0250+-1.0794          might be 1.0155x faster
   ftl-library-inlining                             101.4734+-0.6844     ?    103.3922+-2.2351        ? might be 1.0189x slower
   function-call                                     10.7479+-0.0879     ?     10.8763+-0.3537        ? might be 1.0119x slower
   function-dot-apply                                 2.1340+-0.1292     ?      2.2495+-0.3523        ? might be 1.0541x slower
   function-test                                      2.8320+-0.2647            2.7589+-0.1398          might be 1.0265x faster
   function-with-eval                                95.2854+-2.3455     ^     83.4934+-1.6153        ^ definitely 1.1412x faster
   gcse-poly-get-less-obvious                        20.7365+-0.7138           20.6234+-0.3183        
   gcse-poly-get                                     22.2646+-0.5036     ?     22.7057+-1.1492        ? might be 1.0198x slower
   gcse                                               3.4383+-0.1240            3.3546+-0.0373          might be 1.0250x faster
   get-by-id-bimorphic-check-structure-elimination-simple   
                                                      2.7058+-0.0933            2.6401+-0.0398          might be 1.0249x faster
   get-by-id-bimorphic-check-structure-elimination   
                                                      4.8911+-0.3541            4.7615+-0.1255          might be 1.0272x faster
   get-by-id-chain-from-try-block                     2.4581+-0.0840     ?      2.5987+-0.3851        ? might be 1.0572x slower
   get-by-id-check-structure-elimination              4.0662+-0.2111            3.9091+-0.0939          might be 1.0402x faster
   get-by-id-proto-or-self                           15.3906+-0.6825     ?     15.8744+-0.8729        ? might be 1.0314x slower
   get-by-id-quadmorphic-check-structure-elimination-simple   
                                                      2.8869+-0.0393     ?      3.2780+-0.4917        ? might be 1.1355x slower
   get-by-id-self-or-proto                           15.7968+-0.7547           15.4367+-0.4835          might be 1.0233x faster
   get-by-val-out-of-bounds                           4.2074+-0.1114            4.1843+-0.1513        
   get-by-val-with-string-bimorphic-check-structure-elimination-simple   
                                                      2.7998+-0.2260            2.7994+-0.1503        
   get-by-val-with-string-bimorphic-check-structure-elimination   
                                                      5.9138+-0.0579     ?      6.0530+-0.1868        ? might be 1.0235x slower
   get-by-val-with-string-chain-from-try-block   
                                                      2.4467+-0.0752     ?      2.4668+-0.0939        ?
   get-by-val-with-string-check-structure-elimination   
                                                      5.1927+-0.0808            5.1561+-0.1663        
   get-by-val-with-string-proto-or-self              16.4015+-0.7263           16.3944+-0.6455        
   get-by-val-with-string-quadmorphic-check-structure-elimination-simple   
                                                      3.0853+-0.0514     ?      3.4967+-0.8040        ? might be 1.1333x slower
   get-by-val-with-string-self-or-proto              15.3924+-0.2895     ?     16.1903+-1.3606        ? might be 1.0518x slower
   get-by-val-with-symbol-bimorphic-check-structure-elimination-simple   
                                                      2.9495+-0.0591            2.9401+-0.0968        
   get-by-val-with-symbol-bimorphic-check-structure-elimination   
                                                     12.5374+-0.2382     ?     12.6322+-0.6558        ?
   get-by-val-with-symbol-chain-from-try-block   
                                                      2.6110+-0.3928            2.4204+-0.0433          might be 1.0787x faster
   get-by-val-with-symbol-check-structure-elimination   
                                                     10.9792+-0.0481     ?     10.9988+-0.0904        ?
   get-by-val-with-symbol-proto-or-self              15.6590+-0.6086     ?     16.1619+-0.6310        ? might be 1.0321x slower
   get-by-val-with-symbol-quadmorphic-check-structure-elimination-simple   
                                                      4.0616+-0.2637            3.9284+-0.0577          might be 1.0339x faster
   get-by-val-with-symbol-self-or-proto              15.5201+-0.7176     ?     16.1532+-0.7296        ? might be 1.0408x slower
   get_callee_monomorphic                             2.3642+-0.1225     ?      2.5184+-0.2949        ? might be 1.0652x slower
   get_callee_polymorphic                             3.4304+-0.3032            3.2915+-0.0848          might be 1.0422x faster
   getter-no-activation                               5.0333+-0.2452            4.8443+-0.1784          might be 1.0390x faster
   getter-prototype                                   7.9674+-0.2436            7.9610+-0.1316        
   getter-richards-try-catch                        986.6903+-25.1849         976.8158+-21.7448         might be 1.0101x faster
   getter-richards                                  115.0038+-5.2570          110.0005+-4.4292          might be 1.0455x faster
   getter                                             5.3342+-0.3926     ?      5.4182+-0.4548        ? might be 1.0158x slower
   global-object-access-with-mutating-structure   
                                                      5.5527+-0.1032     ?      5.6581+-0.0658        ? might be 1.0190x slower
   global-var-const-infer-fire-from-opt               0.8949+-0.0348     ?      0.9013+-0.1524        ?
   global-var-const-infer                             0.6302+-0.0056     ?      0.6466+-0.0302        ? might be 1.0260x slower
   hard-overflow-check-equal                         27.6628+-0.5292     ?     27.6711+-0.5394        ?
   hard-overflow-check                               27.2836+-0.4527           26.8251+-0.8826          might be 1.0171x faster
   HashMap-put-get-iterate-keys                      25.4255+-1.8298     ?     26.0733+-1.4107        ? might be 1.0255x slower
   HashMap-put-get-iterate                           27.2658+-0.9503     ?     27.6633+-0.8032        ? might be 1.0146x slower
   HashMap-string-put-get-iterate                    24.2382+-0.6140     ?     24.7919+-2.0316        ? might be 1.0228x slower
   hoist-make-rope                                    8.6097+-0.8354            8.3465+-0.6094          might be 1.0315x faster
   hoist-poly-check-structure-effectful-loop   
                                                      3.6840+-0.1342            3.6210+-0.0671          might be 1.0174x faster
   hoist-poly-check-structure                         3.1080+-0.0223            3.0711+-0.0491          might be 1.0120x faster
   imul-double-only                                   7.7306+-0.6756            7.4379+-0.1513          might be 1.0394x faster
   imul-int-only                                      9.1222+-0.8443            8.9121+-0.6796          might be 1.0236x faster
   imul-mixed                                         7.2267+-0.7087            7.0379+-0.4132          might be 1.0268x faster
   in-four-cases                                     17.3806+-0.7970           16.9168+-0.4221          might be 1.0274x faster
   in-one-case-false                                  9.7366+-0.6123            9.3545+-0.2329          might be 1.0408x faster
   in-one-case-true                                   9.5807+-0.4584     ?      9.6435+-0.6356        ?
   in-two-cases                                       9.9320+-0.4957            9.7624+-0.3382          might be 1.0174x faster
   indexed-properties-in-objects                      2.8370+-0.0751            2.7942+-0.0602          might be 1.0153x faster
   infer-closure-const-then-mov-no-inline             3.6345+-0.0646            3.6015+-0.0406        
   infer-closure-const-then-mov                      18.7488+-0.6257           18.2820+-0.4476          might be 1.0255x faster
   infer-closure-const-then-put-to-scope-no-inline   
                                                     11.4179+-0.5961           10.9450+-0.1250          might be 1.0432x faster
   infer-closure-const-then-put-to-scope             23.1553+-0.5535     ?     23.5320+-0.7935        ? might be 1.0163x slower
   infer-closure-const-then-reenter-no-inline   
                                                     47.6905+-0.6491           47.5194+-0.9637        
   infer-closure-const-then-reenter                  23.2382+-0.5063     ?     23.3466+-1.3912        ?
   infer-constant-global-property                     3.4747+-0.0871            3.4287+-0.1372          might be 1.0134x faster
   infer-constant-property                            2.6730+-0.1197     ?      2.8456+-0.4754        ? might be 1.0646x slower
   infer-one-time-closure-ten-vars                    7.7468+-0.1949     ?      8.0047+-0.6323        ? might be 1.0333x slower
   infer-one-time-closure-two-vars                    7.5266+-0.1340     ?      7.5822+-0.3822        ?
   infer-one-time-closure                             7.2813+-0.4982     ?      7.3916+-0.3358        ? might be 1.0151x slower
   infer-one-time-deep-closure                       11.1985+-0.5760           10.9207+-0.3747          might be 1.0254x faster
   inline-arguments-access                            3.6482+-0.1573            3.5714+-0.1493          might be 1.0215x faster
   inline-arguments-aliased-access                    3.7059+-0.2571            3.6825+-0.1974        
   inline-arguments-local-escape                      3.6478+-0.1483            3.6443+-0.0590        
   inline-get-scoped-var                              4.5707+-0.1237            4.5571+-0.2443        
   inlined-put-by-id-transition                       9.2163+-0.2580     ?      9.2972+-0.3778        ?
   inlined-put-by-val-with-string-transition   
                                                     41.1194+-1.2519     ?     41.7098+-1.6916        ? might be 1.0144x slower
   inlined-put-by-val-with-symbol-transition   
                                                     41.2162+-2.3843           40.5600+-0.8995          might be 1.0162x faster
   int-or-other-abs-then-get-by-val                   4.5682+-0.0409            4.5279+-0.0478        
   int-or-other-abs-zero-then-get-by-val             15.5612+-0.3856           15.3261+-0.4340          might be 1.0153x faster
   int-or-other-add-then-get-by-val                   4.4245+-0.0542     ?      4.4295+-0.0844        ?
   int-or-other-add                                   4.9393+-0.0620     ?      4.9864+-0.1370        ?
   int-or-other-div-then-get-by-val                   3.7097+-0.0310     ?      4.0186+-0.6220        ? might be 1.0833x slower
   int-or-other-max-then-get-by-val                   3.8949+-0.0827     ?      3.9364+-0.1132        ? might be 1.0106x slower
   int-or-other-min-then-get-by-val                   3.9040+-0.2435     ?      3.9622+-0.3562        ? might be 1.0149x slower
   int-or-other-mod-then-get-by-val                   3.4771+-0.0294            3.4630+-0.0097        
   int-or-other-mul-then-get-by-val                   3.7667+-0.3743            3.5906+-0.0210          might be 1.0491x faster
   int-or-other-neg-then-get-by-val                   4.0292+-0.0946            4.0232+-0.0481        
   int-or-other-neg-zero-then-get-by-val             15.4873+-0.2871           15.3941+-0.3634        
   int-or-other-sub-then-get-by-val                   4.4399+-0.0638     ?      4.9272+-1.3356        ? might be 1.1098x slower
   int-or-other-sub                                   3.5676+-0.3613            3.5228+-0.2065          might be 1.0127x faster
   int-overflow-local                                 4.1893+-0.0644            4.1551+-0.2189        
   Int16Array-alloc-long-lived                       44.2084+-2.2414           43.8012+-1.7323        
   Int16Array-bubble-sort-with-byteLength            17.0721+-0.3860     ?     17.7695+-1.0668        ? might be 1.0409x slower
   Int16Array-bubble-sort                            17.2626+-0.5675           17.0603+-0.6985          might be 1.0119x faster
   Int16Array-load-int-mul                            1.4516+-0.0427            1.4165+-0.0257          might be 1.0247x faster
   Int16Array-to-Int32Array-set                      46.5985+-0.8995     ?     46.7547+-1.3430        ?
   Int32Array-alloc-large                            12.7055+-0.5091           11.8613+-0.6303          might be 1.0712x faster
   Int32Array-alloc-long-lived                       49.6554+-1.5494     ?     50.8830+-1.8546        ? might be 1.0247x slower
   Int32Array-alloc                                   2.7910+-0.1046     ?      2.8538+-0.1940        ? might be 1.0225x slower
   Int32Array-Int8Array-view-alloc                    5.9813+-0.2810            5.9479+-0.2033        
   int52-spill                                        5.0186+-0.4853     ?      5.0725+-0.4319        ? might be 1.0108x slower
   Int8Array-alloc-long-lived                        38.9891+-1.0691           38.9712+-2.1454        
   Int8Array-load-with-byteLength                     3.3771+-0.0405     ?      3.3974+-0.1036        ?
   Int8Array-load                                     3.4644+-0.1823            3.3455+-0.0414          might be 1.0355x faster
   integer-divide                                    10.5848+-0.2645           10.5504+-0.1567        
   integer-modulo                                     1.5983+-0.0338     ?      1.6536+-0.0727        ? might be 1.0346x slower
   is-boolean-fold-tricky                             4.0402+-0.4465     ?      4.4872+-0.9485        ? might be 1.1106x slower
   is-boolean-fold                                    2.6333+-0.0388     ?      2.6595+-0.1004        ?
   is-function-fold-tricky-internal-function   
                                                      9.6568+-0.3282            9.5403+-0.0897          might be 1.0122x faster
   is-function-fold-tricky                            4.0558+-0.0731     ?      4.1082+-0.1640        ? might be 1.0129x slower
   is-function-fold                                   2.7643+-0.0873            2.7070+-0.0595          might be 1.0212x faster
   is-number-fold-tricky                              3.9536+-0.0660     ?      4.1056+-0.2635        ? might be 1.0385x slower
   is-number-fold                                     2.7815+-0.2939            2.7009+-0.1872          might be 1.0298x faster
   is-object-or-null-fold-functions                   2.7959+-0.2466            2.7924+-0.1465        
   is-object-or-null-fold-less-tricky                 4.3097+-0.4410            4.1196+-0.1681          might be 1.0462x faster
   is-object-or-null-fold-tricky                      4.8532+-0.1343            4.7555+-0.0943          might be 1.0205x faster
   is-object-or-null-fold                             2.7116+-0.0738            2.6685+-0.0786          might be 1.0162x faster
   is-object-or-null-trickier-function                4.1107+-0.1492     ?      4.2516+-0.4581        ? might be 1.0343x slower
   is-object-or-null-trickier-internal-function   
                                                     10.0491+-0.5861            9.9183+-0.1272          might be 1.0132x faster
   is-object-or-null-tricky-function                  4.0696+-0.0884            4.0573+-0.1700        
   is-object-or-null-tricky-internal-function   
                                                      7.4354+-0.1419            7.3461+-0.1194          might be 1.0122x faster
   is-string-fold-tricky                              4.0400+-0.1378     ?      4.0738+-0.2662        ?
   is-string-fold                                     2.6884+-0.0687     ?      2.7592+-0.3716        ? might be 1.0263x slower
   is-undefined-fold-tricky                           3.3643+-0.0594            3.3560+-0.0872        
   is-undefined-fold                                  2.6586+-0.0524            2.6198+-0.0445          might be 1.0148x faster
   JSONP-negative-0                                   0.2688+-0.0079            0.2627+-0.0041          might be 1.0231x faster
   large-int-captured                                 4.1377+-0.2017     ?      4.1429+-0.2099        ?
   large-int-neg                                     13.8068+-0.1200     ?     14.3209+-0.7079        ? might be 1.0372x slower
   large-int                                         13.9402+-1.7282           12.9689+-0.3042          might be 1.0749x faster
   load-varargs-elimination                          21.2208+-0.5804     ?     21.6619+-1.2784        ? might be 1.0208x slower
   logical-not-weird-types                            3.2771+-0.3790            3.0846+-0.0641          might be 1.0624x faster
   logical-not                                        4.4227+-0.2487     ?      4.4514+-0.1428        ?
   lots-of-fields                                     9.4247+-0.1255     ?      9.6725+-0.4586        ? might be 1.0263x slower
   make-indexed-storage                               2.8269+-0.2628     ?      2.8608+-0.1166        ? might be 1.0120x slower
   make-rope-cse                                      3.7188+-0.2033            3.6674+-0.1780          might be 1.0140x faster
   marsaglia-larger-ints                             31.6071+-0.9254     ?     32.5273+-0.6382        ? might be 1.0291x slower
   marsaglia-osr-entry                               21.3696+-0.4741           21.2575+-0.5215        
   math-with-out-of-bounds-array-values              23.0017+-2.3480           22.0313+-0.6312          might be 1.0440x faster
   max-boolean                                        2.6856+-0.1890     ?      2.7325+-0.2211        ? might be 1.0175x slower
   method-on-number                                  15.8340+-0.7280     ?     16.3352+-1.0623        ? might be 1.0317x slower
   min-boolean                                        2.6321+-0.1033     ?      2.6671+-0.0446        ? might be 1.0133x slower
   minus-boolean-double                               3.1414+-0.1139            3.0815+-0.0705          might be 1.0194x faster
   minus-boolean                                      2.2920+-0.0310     ?      2.3361+-0.0461        ? might be 1.0192x slower
   misc-strict-eq                                    29.8756+-1.8244           28.9079+-1.1970          might be 1.0335x faster
   mod-boolean-double                                11.1180+-0.3029     ?     11.1245+-0.2319        ?
   mod-boolean                                        8.2754+-0.0701     ?      8.3216+-0.1387        ?
   mul-boolean-double                                 3.5654+-0.0380     ?      3.6327+-0.1091        ? might be 1.0189x slower
   mul-boolean                                        2.8574+-0.1342            2.8425+-0.1102        
   neg-boolean                                        3.1075+-0.0506     ?      3.1133+-0.0671        ?
   negative-zero-divide                               0.3614+-0.0186     ?      0.3620+-0.0291        ?
   negative-zero-modulo                               0.3614+-0.0235            0.3545+-0.0224          might be 1.0197x faster
   negative-zero-negate                               0.3610+-0.0508     ?      0.3924+-0.0994        ? might be 1.0869x slower
   nested-function-parsing                           46.0582+-1.7525           44.8082+-0.7812          might be 1.0279x faster
   new-array-buffer-dead                             87.1425+-1.1341     ?     87.3285+-1.0857        ?
   new-array-buffer-push                              6.2414+-0.1277     ^      5.9586+-0.1353        ^ definitely 1.0475x faster
   new-array-dead                                    15.0419+-1.2656     ?     15.3648+-0.9850        ? might be 1.0215x slower
   new-array-push                                     3.5266+-0.1785     ?      3.5428+-0.1759        ?
   no-inline-constructor                             32.2248+-2.1379           31.8924+-0.6323          might be 1.0104x faster
   number-test                                        3.0379+-0.1151            2.9426+-0.0454          might be 1.0324x faster
   object-closure-call                                4.8942+-0.1425            4.8926+-0.1294        
   object-get-own-property-symbols-on-large-array   
                                                      4.2146+-0.2680     ?      4.4674+-0.3774        ? might be 1.0600x slower
   object-test                                        2.8049+-0.1842            2.6994+-0.0494          might be 1.0391x faster
   obvious-sink-pathology-taken                      97.6006+-0.8770           97.1767+-0.5023        
   obvious-sink-pathology                            94.2789+-1.9898           93.1511+-0.8862          might be 1.0121x faster
   obviously-elidable-new-object                     28.2867+-0.1326     ?     29.1574+-1.0571        ? might be 1.0308x slower
   plus-boolean-arith                                 2.4623+-0.2054            2.4366+-0.0787          might be 1.0105x faster
   plus-boolean-double                                3.1322+-0.1065     ?      3.3038+-0.4414        ? might be 1.0548x slower
   plus-boolean                                       2.5090+-0.0250     ?      2.5255+-0.0870        ?
   poly-chain-access-different-prototypes-simple   
                                                      2.5910+-0.0549            2.5745+-0.0301        
   poly-chain-access-different-prototypes             2.5792+-0.1002            2.5695+-0.0598        
   poly-chain-access-simpler                          2.6056+-0.0629     ?      2.6136+-0.0819        ?
   poly-chain-access                                  2.7990+-0.6401            2.5105+-0.0221          might be 1.1149x faster
   poly-stricteq                                     49.6692+-0.4842     ?     55.6442+-13.8948       ? might be 1.1203x slower
   polymorphic-array-call                             1.4929+-0.4210            1.2919+-0.0591          might be 1.1556x faster
   polymorphic-get-by-id                              2.9199+-0.0530     ^      2.8218+-0.0448        ^ definitely 1.0348x faster
   polymorphic-put-by-id                             28.7738+-1.7848           28.6796+-0.6784        
   polymorphic-put-by-val-with-string                28.6008+-0.5340     ?     28.9431+-1.1197        ? might be 1.0120x slower
   polymorphic-put-by-val-with-symbol                29.0771+-0.9018           28.9566+-0.8700        
   polymorphic-structure                             12.6724+-0.3233     ?     12.9382+-0.7359        ? might be 1.0210x slower
   polyvariant-monomorphic-get-by-id                  6.6721+-0.8679            6.5370+-0.7611          might be 1.0207x faster
   proto-getter-access                                8.5610+-0.3118            8.2610+-0.1093          might be 1.0363x faster
   prototype-access-with-mutating-prototype           5.6252+-0.3409            5.4015+-0.2085          might be 1.0414x faster
   put-by-id-replace-and-transition                   8.3721+-0.9416            7.8046+-0.6490          might be 1.0727x faster
   put-by-id-slightly-polymorphic                     2.6907+-0.0318     ?      2.7278+-0.0755        ? might be 1.0138x slower
   put-by-id                                          9.8219+-0.3858     ?      9.9038+-0.6997        ?
   put-by-val-direct                                  0.3461+-0.0074     ?      0.3505+-0.0323        ? might be 1.0126x slower
   put-by-val-large-index-blank-indexing-type   
                                                      5.7254+-1.0220            5.2243+-0.1981          might be 1.0959x faster
   put-by-val-machine-int                             2.6129+-0.3076            2.5913+-0.2597        
   put-by-val-with-string-replace-and-transition   
                                                     10.1685+-0.3246     ?     10.3546+-0.6364        ? might be 1.0183x slower
   put-by-val-with-string-slightly-polymorphic   
                                                      2.9602+-0.0887            2.9180+-0.0523          might be 1.0144x faster
   put-by-val-with-string                            11.0256+-0.9660           10.6586+-0.5903          might be 1.0344x faster
   put-by-val-with-symbol-replace-and-transition   
                                                     12.4900+-0.6244           11.8240+-0.4416          might be 1.0563x faster
   put-by-val-with-symbol-slightly-polymorphic   
                                                      3.2466+-0.1047            3.1809+-0.2097          might be 1.0206x faster
   put-by-val-with-symbol                            10.7421+-0.6236           10.6057+-0.4282          might be 1.0129x faster
   rare-osr-exit-on-local                            13.8312+-0.6586           13.6232+-0.2965          might be 1.0153x faster
   raytrace-with-empty-try-catch                      5.1590+-0.0643            5.1391+-0.0858        
   raytrace-with-try-catch                            9.7299+-0.3897            9.6760+-0.2434        
   register-pressure-from-osr                        16.5949+-0.3654     ?     16.7685+-0.5873        ? might be 1.0105x slower
   repeat-multi-get-by-offset                        22.5227+-0.8433           22.3675+-0.7096        
   richards-empty-try-catch                          71.4288+-1.2260     ?     71.6728+-1.0041        ?
   richards-try-catch                               240.0627+-2.6876     ?    240.5556+-2.6201        ?
   setter-prototype                                   7.9257+-0.4645            7.7866+-0.1681          might be 1.0179x faster
   setter                                             5.4897+-0.5757            5.3991+-0.3440          might be 1.0168x faster
   simple-activation-demo                            24.2365+-0.4555     ?     24.3664+-0.4252        ?
   simple-getter-access                              10.8269+-0.4423           10.5677+-0.1460          might be 1.0245x faster
   simple-poly-call-nested                            8.6704+-0.5589            8.4938+-0.4793          might be 1.0208x faster
   simple-poly-call                                   1.3341+-0.1199            1.3026+-0.0630          might be 1.0242x faster
   sin-boolean                                       20.6515+-2.2220     ?     22.0121+-1.0249        ? might be 1.0659x slower
   singleton-scope                                   64.7460+-1.5284           64.4886+-2.1514        
   sink-function                                     10.8657+-1.1257            9.8303+-0.5982          might be 1.1053x faster
   sink-huge-activation                              16.5463+-1.0321     ?     16.7145+-0.5121        ? might be 1.0102x slower
   sinkable-new-object-dag                           54.0730+-1.6744     ?     54.9810+-2.4462        ? might be 1.0168x slower
   sinkable-new-object-taken                         43.2450+-1.3448     ?     44.3234+-0.8218        ? might be 1.0249x slower
   sinkable-new-object                               31.1006+-1.1597           29.9820+-0.8261          might be 1.0373x faster
   slow-array-profile-convergence                     2.4516+-0.0745     ?      2.5560+-0.2229        ? might be 1.0426x slower
   slow-convergence                                   2.4669+-0.0899            2.3860+-0.0652          might be 1.0339x faster
   slow-ternaries                                    17.1816+-1.6717           17.1423+-0.9354        
   sorting-benchmark                                 17.2404+-0.8120           17.1263+-0.6911        
   sparse-conditional                                 1.1912+-0.0304     ?      1.2350+-0.1090        ? might be 1.0368x slower
   splice-to-remove                                  13.7700+-2.6283           12.6535+-1.1839          might be 1.0882x faster
   string-char-code-at                               13.5191+-0.5265           13.3484+-0.1732          might be 1.0128x faster
   string-concat-object                               2.1649+-0.1478            2.1474+-0.1463        
   string-concat-pair-object                          2.3177+-0.3155            2.2336+-0.4062          might be 1.0377x faster
   string-concat-pair-simple                          9.5923+-0.6330            9.3040+-0.5367          might be 1.0310x faster
   string-concat-simple                               9.4160+-0.4654     ?      9.7839+-0.4784        ? might be 1.0391x slower
   string-cons-repeat                                 6.5054+-0.1950     ?      6.6885+-0.7409        ? might be 1.0281x slower
   string-cons-tower                                  6.8825+-0.3827            6.7255+-0.2373          might be 1.0234x faster
   string-equality                                   16.0033+-0.5527           15.9103+-0.4774        
   string-get-by-val-big-char                         6.4983+-0.0347     ?      6.5711+-0.2415        ? might be 1.0112x slower
   string-get-by-val-out-of-bounds-insane             3.2128+-0.2055     ?      3.3199+-0.2487        ? might be 1.0333x slower
   string-get-by-val-out-of-bounds                    3.9150+-0.0430            3.9109+-0.0850        
   string-get-by-val                                  2.8292+-0.0477     ?      2.8833+-0.1644        ? might be 1.0191x slower
   string-hash                                        1.8820+-0.0602     ?      1.9810+-0.2069        ? might be 1.0526x slower
   string-long-ident-equality                        13.8180+-0.7171           13.3218+-0.0842          might be 1.0372x faster
   string-out-of-bounds                              10.0782+-0.3687     ?     10.1044+-0.2383        ?
   string-repeat-arith                               27.1922+-0.8296     ?     27.3212+-0.6057        ?
   string-sub                                        57.6866+-0.9155           56.0896+-1.4230          might be 1.0285x faster
   string-test                                        2.9153+-0.0992            2.8909+-0.1227        
   string-var-equality                               25.2272+-0.6088     ?     25.5974+-0.9382        ? might be 1.0147x slower
   structure-hoist-over-transitions                   2.4672+-0.1388     ?      2.4710+-0.2664        ?
   substring-concat-weird                            37.1443+-1.3278           35.3100+-1.0507          might be 1.0519x faster
   substring-concat                                  40.7573+-1.3957           39.4852+-0.6337          might be 1.0322x faster
   substring                                         47.0482+-3.1126           44.3248+-1.0851          might be 1.0614x faster
   switch-char-constant                               2.6973+-0.0613            2.6801+-0.0489        
   switch-char                                        6.2025+-1.1381            5.9524+-0.8789          might be 1.0420x faster
   switch-constant                                    8.0628+-0.7123     ?      9.1995+-0.7118        ? might be 1.1410x slower
   switch-string-basic-big-var                       14.5237+-0.3834     ?     15.0274+-0.5842        ? might be 1.0347x slower
   switch-string-basic-big                           14.8190+-0.4240           14.7414+-0.2969        
   switch-string-basic-var                           13.4558+-0.1768           13.4253+-0.3476        
   switch-string-basic                               12.6992+-0.3720     ?     12.7307+-0.1929        ?
   switch-string-big-length-tower-var                17.7322+-0.2089     ?     17.9560+-0.4572        ? might be 1.0126x slower
   switch-string-length-tower-var                    13.2358+-0.3962           13.0722+-0.1990          might be 1.0125x faster
   switch-string-length-tower                        11.9363+-0.8678           11.6822+-0.3919          might be 1.0218x faster
   switch-string-short                               11.5517+-0.2554     ?     11.5911+-0.5493        ?
   switch                                            10.9414+-0.8863     ?     11.0668+-0.5149        ? might be 1.0115x slower
   tear-off-arguments-simple                          3.2044+-0.1472     ?      3.3293+-0.4550        ? might be 1.0390x slower
   tear-off-arguments                                 4.0836+-0.1468     ?      4.0863+-0.1065        ?
   temporal-structure                                12.0022+-0.3724           11.8212+-0.2178          might be 1.0153x faster
   to-int32-boolean                                  12.5948+-0.2769     ?     12.6905+-0.3593        ?
   try-catch-get-by-val-cloned-arguments              9.8086+-0.7155     ^      8.6825+-0.1514        ^ definitely 1.1297x faster
   try-catch-get-by-val-direct-arguments              2.1390+-0.0464            2.1098+-0.0765          might be 1.0138x faster
   try-catch-get-by-val-scoped-arguments              5.2287+-0.6336            4.4707+-0.1637          might be 1.1695x faster
   typed-array-get-set-by-val-profiling              27.9480+-1.1315           27.6592+-1.8256          might be 1.0104x faster
   undefined-property-access                        218.2427+-2.5404     ?    220.4834+-6.3676        ? might be 1.0103x slower
   undefined-test                                     2.9820+-0.0675     ?      3.0326+-0.0826        ? might be 1.0170x slower
   unprofiled-licm                                    9.4400+-0.3615     ?      9.6808+-0.1971        ? might be 1.0255x slower
   v8-raytrace-with-empty-try-catch                  23.8667+-0.4489     ?     23.8987+-0.6537        ?
   v8-raytrace-with-try-catch                        61.7437+-1.5290           61.5888+-1.3124        
   varargs-call                                      12.9170+-0.1239     ?     13.3928+-0.6767        ? might be 1.0368x slower
   varargs-construct-inline                          21.9964+-0.5430           21.6513+-0.1792          might be 1.0159x faster
   varargs-construct                                 21.1176+-1.3044           20.5968+-0.6737          might be 1.0253x faster
   varargs-inline                                     8.9554+-0.2950            8.8878+-0.3057        
   varargs-strict-mode                               10.3496+-0.3477           10.0535+-0.3420          might be 1.0294x faster
   varargs                                            9.9292+-0.4225     ?     10.1880+-0.6549        ? might be 1.0261x slower
   weird-inlining-const-prop                          2.2309+-0.1719            2.1445+-0.1309          might be 1.0403x faster

   <geometric>                                        8.1312+-0.0275            8.1041+-0.0278          might be 1.0033x faster

                                                        TipOfTree                  TriColor                                     
AsmBench:
   bigfib.cpp                                       449.5492+-7.8754     ?    456.4398+-10.8070       ? might be 1.0153x slower
   cray.c                                           402.1510+-18.9684         394.0226+-2.5497          might be 1.0206x faster
   dry.c                                            426.5391+-9.2430     ?    428.8692+-5.9365        ?
   FloatMM.c                                        687.0702+-4.0184     ?    687.6744+-6.0178        ?
   gcc-loops.cpp                                   3429.0258+-16.9937    ?   3464.4847+-55.7043       ? might be 1.0103x slower
   n-body.c                                         826.8549+-5.2508     ?    831.4011+-12.1747       ?
   Quicksort.c                                      411.9503+-7.5021          410.5385+-6.0766        
   stepanov_container.cpp                          3494.4157+-14.5683    ?   3506.8671+-27.2035       ?
   Towers.c                                         233.6331+-2.1049     ?    234.5983+-1.6373        ?

   <geometric>                                      717.5854+-5.6822     ?    719.3264+-2.9876        ? might be 1.0024x slower

                                                        TipOfTree                  TriColor                                     
CompressionBench:
   huffman                                           60.0215+-0.9570     ?     60.8060+-1.5299        ? might be 1.0131x slower
   arithmetic-simple                                275.0800+-5.5952          273.7597+-1.9602        
   arithmetic-precise                               244.3621+-1.8822          243.2103+-2.2156        
   arithmetic-complex-precise                       246.4117+-3.3482          245.0443+-1.6238        
   arithmetic-precise-order-0                       283.7094+-6.2338     ?    284.0113+-4.5331        ?
   arithmetic-precise-order-1                       299.0874+-1.2183     ?    300.1118+-2.5525        ?
   arithmetic-precise-order-2                       349.4418+-6.8891          346.4324+-4.5304        
   arithmetic-simple-order-1                        322.9844+-3.3686     ?    323.0703+-5.9924        ?
   arithmetic-simple-order-2                        371.5699+-5.0421     ?    375.3353+-7.0821        ? might be 1.0101x slower
   lz-string                                        312.1509+-7.1869          307.5258+-7.3850          might be 1.0150x faster

   <geometric>                                      253.6698+-2.1817          253.3874+-0.9171          might be 1.0011x faster

                                                        TipOfTree                  TriColor                                     
Geomean of preferred means:
   <scaled-result>                                   50.2563+-0.1850           50.0593+-0.2064          might be 1.0039x faster
Comment 7 Filip Pizlo 2015-10-03 20:52:16 PDT
Debug layout tests pass.

I'm pretty sure this change is sound.
Comment 8 Geoffrey Garen 2015-10-05 10:15:29 PDT
Comment on attachment 262382 [details]
the patch

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

> Source/JavaScriptCore/ChangeLog:31
> +        v is while, turn o grey again. This is like remembering an object, in the sense that our gen GC

v is white

> Source/JavaScriptCore/ChangeLog:36
> +        generational, and we want to basically keep our current barriers unchanged. The only thing missing

things missing

> Source/JavaScriptCore/ChangeLog:68
> +              we transitioned from MarkedAndRemembered to Marked at the bittern end of GC.

bitter end

> Source/JavaScriptCore/ChangeLog:84
> +          no longer as the cell for its state - instead they use the saved pre-visiting state.

ask the cell

> Source/JavaScriptCore/ChangeLog:112
> +        this kind of collector is that collector termination will rescan the stack. Termination is reached
> +        only if the at-termination re-scan greys no objects. This means that the collector is a fixpoint.
> +        Luckily, our collector is already a fixpoint because of opaque roots and structure transitions.

I would argue that we should consider these fixpoints to be separate, with the stack fixpoint running first. It should be impossible for the opaque root scan or the weak pointer scan to add roots to the stack.

> Source/JavaScriptCore/heap/CellState.h:54
> +    // The object is grey - i.e. it will be scanned - but it either belongs to old gen (if this is eden
> +    // GC) or it is grey a second time in this current GC (because a concurrent store barrier requested
> +    // re-greying).
> +    OldGrey = 2,
> +
> +    // The object is grey - i.e. it will be scanned - and this is the first time in this GC that we are
> +    // going to scan it. If this is an eden GC, this also means that the object is in eden.
> +    NewGrey = 3

The US English spelling is "Gray". So, you have to ask yourself: Am I writing an American GC or a European GC?

> Source/JavaScriptCore/heap/Heap.h:168
> +    void reportExtraMemoryVisited(CellState dataBeforeVisiting, size_t);

cellStateBeforeVisiting

> Source/JavaScriptCore/heap/HeapInlines.h:129
> +inline void Heap::reportExtraMemoryVisited(CellState dataBeforeVisiting, size_t size)

cellStateBeforeVisiting

> Source/JavaScriptCore/heap/SlotVisitor.h:117
> +    CellState dataBeforeVisitingCurrentObject() const { return m_dataBeforeVisiting; }

currentObjectCellStateBeforeVisiting

> Source/JavaScriptCore/heap/SlotVisitor.h:158
> +    CellState m_dataBeforeVisiting { CellState::NewWhite };

m_currentObjectCellStateBeforeVisiting

> Source/JavaScriptCore/runtime/JSCell.h:159
> +    // directly. We deliberately avoid helpers for this, because we don't want transparency about how the

I think you mean that we do want transparency and we don't want abstraction.
Comment 9 Geoffrey Garen 2015-10-05 10:25:13 PDT
BTW, I think I just merge conflicted with the SlotVisitor part of this patch. But the delta should be trivial, with no change in behavior.
Comment 10 Filip Pizlo 2015-10-05 10:34:51 PDT
(In reply to comment #8)
> Comment on attachment 262382 [details]
> the patch
> 
> View in context:
> https://bugs.webkit.org/attachment.cgi?id=262382&action=review
> 
> > Source/JavaScriptCore/ChangeLog:31
> > +        v is while, turn o grey again. This is like remembering an object, in the sense that our gen GC
> 
> v is white

Fixed.

> 
> > Source/JavaScriptCore/ChangeLog:36
> > +        generational, and we want to basically keep our current barriers unchanged. The only thing missing
> 
> things missing

Fixed.

> 
> > Source/JavaScriptCore/ChangeLog:68
> > +              we transitioned from MarkedAndRemembered to Marked at the bittern end of GC.
> 
> bitter end

Fixed.

> 
> > Source/JavaScriptCore/ChangeLog:84
> > +          no longer as the cell for its state - instead they use the saved pre-visiting state.
> 
> ask the cell

Fixed.

> 
> > Source/JavaScriptCore/ChangeLog:112
> > +        this kind of collector is that collector termination will rescan the stack. Termination is reached
> > +        only if the at-termination re-scan greys no objects. This means that the collector is a fixpoint.
> > +        Luckily, our collector is already a fixpoint because of opaque roots and structure transitions.
> 
> I would argue that we should consider these fixpoints to be separate, with
> the stack fixpoint running first. It should be impossible for the opaque
> root scan or the weak pointer scan to add roots to the stack.

I don't see how that would work.  Here's the combined fixpoint:

for (;;) {
    resume mutator;
    do some concurrent marking;
    suspend mutator;
    mark stacks;
    visit weak references; // this may mark things we previously thought were white
    if (no new things marked)
        break;
}

There is no way to make this two fixpoints.  Let's consider your proposal, where the stack fixpoint converges first:

for (;;) {
    resume mutator;
    do some concurrent marking;
    suspend mutator;
    mark stacks;
    if (no new things marked)
        break;
}
for (;;) {
    resume mutator;
    do some concurrent marking;
    suspend mutator;
    visit weak references;
    if (no new things marked)
        break;
}

This will fail to mark things because during concurrent mutator execution in the second fixpoint, the mutator may load white things onto the stack.

If the write barrier requires a grey stack, then you *must* rescan the stack after any concurrent execution that occurred before the collector reached termination.

Also, the other ordering of the fixpoints (converge weak first, then stack) would be wrong, because concurrent execution may cause weak references to have different opinions about liveness.  So, after any mutator execution that occurs before collector terminatin, you have to re-ask all of the weak references what they think about the world.

So, this fixpoint has to be unified.  And that's as it should be - it's super rare that it's correct to take a fixpoint and split it into two fixpoints that execute in sequence.

> 
> > Source/JavaScriptCore/heap/CellState.h:54
> > +    // The object is grey - i.e. it will be scanned - but it either belongs to old gen (if this is eden
> > +    // GC) or it is grey a second time in this current GC (because a concurrent store barrier requested
> > +    // re-greying).
> > +    OldGrey = 2,
> > +
> > +    // The object is grey - i.e. it will be scanned - and this is the first time in this GC that we are
> > +    // going to scan it. If this is an eden GC, this also means that the object is in eden.
> > +    NewGrey = 3
> 
> The US English spelling is "Gray". So, you have to ask yourself: Am I
> writing an American GC or a European GC?

I guess I chose European?

> 
> > Source/JavaScriptCore/heap/Heap.h:168
> > +    void reportExtraMemoryVisited(CellState dataBeforeVisiting, size_t);
> 
> cellStateBeforeVisiting

Fixed.

> 
> > Source/JavaScriptCore/heap/HeapInlines.h:129
> > +inline void Heap::reportExtraMemoryVisited(CellState dataBeforeVisiting, size_t size)
> 
> cellStateBeforeVisiting

Fixed.

> 
> > Source/JavaScriptCore/heap/SlotVisitor.h:117
> > +    CellState dataBeforeVisitingCurrentObject() const { return m_dataBeforeVisiting; }
> 
> currentObjectCellStateBeforeVisiting

Removed this method.

> 
> > Source/JavaScriptCore/heap/SlotVisitor.h:158
> > +    CellState m_dataBeforeVisiting { CellState::NewWhite };
> 
> m_currentObjectCellStateBeforeVisiting

Fixed.

> 
> > Source/JavaScriptCore/runtime/JSCell.h:159
> > +    // directly. We deliberately avoid helpers for this, because we don't want transparency about how the
> 
> I think you mean that we do want transparency and we don't want abstraction.

Fixed.
Comment 11 Filip Pizlo 2015-10-05 11:18:27 PDT
Created attachment 262448 [details]
patch for landing

Rebased against Geoff's SlotVisitor rewrite
Comment 12 Filip Pizlo 2015-10-05 11:29:09 PDT
Created attachment 262451 [details]
patch for landing
Comment 13 Filip Pizlo 2015-10-05 12:36:27 PDT
Landed in http://trac.webkit.org/changeset/190569
Comment 14 Joseph Pecoraro 2015-10-06 17:27:45 PDT
Comment on attachment 262451 [details]
patch for landing

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

> Source/JavaScriptCore/heap/SlotVisitor.cpp:381
>      LockHolder locker(&block->workListLock());
> -    if (heap()->operationInProgress() == FullCollection || block->shouldReportLiveBytes(locker, owner)) {
> +    // We always report live bytes, except if during an eden collection we see an old object pointing to an
> +    // old backing store and the old object is being marked because of the remembered set. Note that if we
> +    // ask the object itself, it will always tell us that it's an old black object - because even during an
> +    // eden collection we have already indicated that the object is old. That's why we use the
> +    // SlotVisitor's cache of the object's old state.
> +    if (heap()->operationInProgress() == FullCollection
> +        || !block->isOld()
> +        || m_currentObjectCellStateBeforeVisiting != CellState::OldGrey) {

Can we only take the workListLock inside the if block? The conditions don't seem to depend on it (like they did before the changes), only CopiedBlock::reportLiveBytes ends up modifying the worklist.