RESOLVED FIXED 149654
Allow an object's marking state to track The Three Colors
https://bugs.webkit.org/show_bug.cgi?id=149654
Summary Allow an object's marking state to track The Three Colors
Filip Pizlo
Reported 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).
Attachments
a very rough start (8.80 KB, patch)
2015-09-29 20:44 PDT, Filip Pizlo
no flags
what I'm thinking so far (36.61 KB, patch)
2015-09-30 20:52 PDT, Filip Pizlo
no flags
it passes so many tests (52.13 KB, patch)
2015-10-03 15:30 PDT, Filip Pizlo
no flags
the patch (55.43 KB, patch)
2015-10-03 15:54 PDT, Filip Pizlo
ggaren: review+
patch for landing (55.49 KB, patch)
2015-10-05 11:18 PDT, Filip Pizlo
no flags
patch for landing (55.48 KB, patch)
2015-10-05 11:29 PDT, Filip Pizlo
no flags
Filip Pizlo
Comment 1 2015-09-29 20:44:03 PDT
Created attachment 262137 [details] a very rough start
Filip Pizlo
Comment 2 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.
Filip Pizlo
Comment 3 2015-09-30 20:52:44 PDT
Created attachment 262227 [details] what I'm thinking so far
Filip Pizlo
Comment 4 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.
Filip Pizlo
Comment 5 2015-10-03 15:54:35 PDT
Created attachment 262382 [details] the patch
Filip Pizlo
Comment 6 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
Filip Pizlo
Comment 7 2015-10-03 20:52:16 PDT
Debug layout tests pass. I'm pretty sure this change is sound.
Geoffrey Garen
Comment 8 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.
Geoffrey Garen
Comment 9 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.
Filip Pizlo
Comment 10 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.
Filip Pizlo
Comment 11 2015-10-05 11:18:27 PDT
Created attachment 262448 [details] patch for landing Rebased against Geoff's SlotVisitor rewrite
Filip Pizlo
Comment 12 2015-10-05 11:29:09 PDT
Created attachment 262451 [details] patch for landing
Filip Pizlo
Comment 13 2015-10-05 12:36:27 PDT
Joseph Pecoraro
Comment 14 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.
Note You need to log in before you can comment on or make changes to this bug.