WebKit Bugzilla
New
Browse
Log In
×
Sign in with GitHub
or
Remember my login
Create Account
·
Forgot Password
Forgotten password account recovery
RESOLVED FIXED
146602
DFG fragile frozen values are fundamentally broken
https://bugs.webkit.org/show_bug.cgi?id=146602
Summary
DFG fragile frozen values are fundamentally broken
Filip Pizlo
Reported
2015-07-03 23:09:44 PDT
We currently have the notion of a FragileValue, which is a value known to the compiler but not tracked by the GC in any way - it's not marked and it's not weak. This is used to support AI bootstrap for OSR must-handle values. The philosophy is that if the compiler does use the value for optimization, it will be strengthened to a weak value (or maybe even a strong value, though we probably won't do that). But this is too much of a pipe dream. I've found at least one case where the compiler does use the value, but never strengthens it: it will happen if the value ends up in an OSR entry data expected value. Then if we GC, we might kill the value, but OSR entry will still try to use it for validation. That might sort of just work, but it's clearly shady. The reason why we make must-handle values fragile and not weak is that most of the time the values disappear from the abstract state: they are LUBed to a non-constant. If we kept them around as weak, we'd have too many cases of the GC killing the code because it thought that the value was somehow meaningful to the code when it was only used as a temporary artifact of optimization. So, it's true that it's very important for must-handle values not to automatically be weak or strong. It's also true that the values are necessary for AI bootstrap because we need to know what values OSR entry will require. But we shouldn't accomplish these goals by having the compiler hold onto what are essentially dangling pointers. A better solution is to turn the bootstrap into a late widening pass: after CFAPhase achieves convergence, it should check if the must-handle values would widen the valuesAtHead of the must-handle block. If they would widen them into a non-constant, then we don't need to ever have the compiler track the must-handle values. If some must-handle value widen a valueAtHead from bottom to a constant, then we can do weak freezing. This makes sense: in that case we know for sure that the compilation's validity relies on the value being alive, and it makes perfect sense for the GC to jettison the resulting JIT code if the value dies. This approach will let us get rid of FragileValue. It will also let us get rid of the must-handle bootstrap in InPlaceAbstractState, and replace it with a must-handle widening in CFAPhase. CFAPhase will then rerun its fixpoint if the widening changed the results.
Attachments
work towards finding the issue
(13.48 KB, patch)
2015-07-03 23:10 PDT
,
Filip Pizlo
no flags
Details
Formatted Diff
Diff
more
(25.43 KB, patch)
2015-07-04 12:46 PDT
,
Filip Pizlo
no flags
Details
Formatted Diff
Diff
validation is written
(39.48 KB, patch)
2015-07-04 13:14 PDT
,
Filip Pizlo
no flags
Details
Formatted Diff
Diff
more
(54.95 KB, patch)
2015-07-04 13:56 PDT
,
Filip Pizlo
no flags
Details
Formatted Diff
Diff
probably done
(79.76 KB, patch)
2015-07-04 19:18 PDT
,
Filip Pizlo
mark.lam
: review+
Details
Formatted Diff
Diff
Show Obsolete
(4)
View All
Add attachment
proposed patch, testcase, etc.
Filip Pizlo
Comment 1
2015-07-03 23:10:45 PDT
Created
attachment 256137
[details]
work towards finding the issue
Filip Pizlo
Comment 2
2015-07-04 12:46:39 PDT
Created
attachment 256156
[details]
more
Filip Pizlo
Comment 3
2015-07-04 13:14:38 PDT
Created
attachment 256158
[details]
validation is written It might make it easier to catch these bugs.
Filip Pizlo
Comment 4
2015-07-04 13:56:46 PDT
Created
attachment 256160
[details]
more Running tests now.
Filip Pizlo
Comment 5
2015-07-04 14:09:59 PDT
It appears that the OSR entry fragile value bug is very real. Here are the tests that fail now that I have the validation in place. Note that dead-osr-entry-value is the new test added in this patch. ** The following JSC stress test failures have been introduced: internal-js-tests.yaml/V8v7/earley.js.ftl-no-cjit-validate stress/dead-osr-entry-value.js.dfg-eager-no-cjit-validate stress/dead-osr-entry-value.js.ftl-eager-no-cjit stress/dead-osr-entry-value.js.ftl-no-cjit-no-inline-validate stress/dead-osr-entry-value.js.ftl-no-cjit-validate stress/dead-osr-entry-value.js.no-cjit-validate-phases stress/flatten-oversize-dictionary-object.js.dfg-eager-no-cjit-validate stress/flatten-oversize-dictionary-object.js.ftl-eager-no-cjit sunspider-1.0/3d-raytrace.js.dfg-eager-no-cjit-validate sunspider-1.0/3d-raytrace.js.ftl-eager-no-cjit v8-v6/v8-earley-boyer.js.dfg-eager-no-cjit-validate v8-v6/v8-earley-boyer.js.ftl-eager-no-cjit
Filip Pizlo
Comment 6
2015-07-04 19:18:10 PDT
Created
attachment 256165
[details]
probably done Still need to do some perf testing.
WebKit Commit Bot
Comment 7
2015-07-04 19:19:59 PDT
Attachment 256165
[details]
did not pass style-queue: ERROR: Source/JavaScriptCore/ftl/FTLExitTimeObjectMaterialization.h:60: The parameter name "trackedReferences" adds no information, so it should be removed. [readability/parameter_name] [5] ERROR: Source/JavaScriptCore/dfg/DFGGraph.h:189: The parameter name "value" adds no information, so it should be removed. [readability/parameter_name] [5] ERROR: Source/JavaScriptCore/dfg/DFGGraph.h:190: The parameter name "value" adds no information, so it should be removed. [readability/parameter_name] [5] ERROR: Source/JavaScriptCore/bytecode/TrackedReferences.h:29: Alphabetical sorting problem. [build/include_order] [4] ERROR: Source/JavaScriptCore/bytecode/StructureSet.cpp:103: Place brace on its own line for function definitions. [whitespace/braces] [4] ERROR: Source/JavaScriptCore/dfg/DFGJITCompiler.cpp:481: Multi line control clauses should use braces. [whitespace/braces] [4] ERROR: Source/JavaScriptCore/dfg/DFGOSREntry.cpp:47: Place brace on its own line for function definitions. [whitespace/braces] [4] Total errors found: 7 in 48 files If any of these errors are false positives, please file a bug against check-webkit-style.
Filip Pizlo
Comment 8
2015-07-04 20:06:41 PDT
I did two benchmark runs, and cannot find any reasons to believe that this is a regression. Which is good - I was fearing that this might screw up OSR entry. That doesn't seem to be the case. First report is below: Benchmark report for SunSpider, LongSpider, V8Spider, Octane, Kraken, JSRegress, AsmBench, and CompressionBench on dethklok (MacBookPro9,1). VMs tested: "TipOfTree" at /Volumes/Data/pizlo/secondary/OpenSource/WebKitBuild/Release/jsc (
r186271
) "KillFragile" at /Volumes/Data/pizlo/tertiary/OpenSource/WebKitBuild/Release/jsc (
r186271
) Collected 6 samples per benchmark/VM, with 6 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 KillFragile SunSpider: 3d-cube 5.1658+-0.1139 ? 5.3016+-0.3218 ? might be 1.0263x slower 3d-morph 5.9030+-0.2500 5.7909+-0.1054 might be 1.0194x faster 3d-raytrace 6.8110+-0.4910 6.5057+-0.1764 might be 1.0469x faster access-binary-trees 2.3487+-0.0570 ? 2.4775+-0.2058 ? might be 1.0548x slower access-fannkuch 6.3613+-0.4316 6.2417+-0.1236 might be 1.0192x faster access-nbody 2.9751+-0.1781 2.8835+-0.0250 might be 1.0318x faster access-nsieve 3.4624+-0.0511 ? 3.4931+-0.1165 ? bitops-3bit-bits-in-byte 1.6587+-0.1626 1.6460+-0.0750 bitops-bits-in-byte 3.9999+-0.3375 3.7528+-0.0815 might be 1.0658x faster bitops-bitwise-and 2.1406+-0.0420 ? 2.2910+-0.1712 ? might be 1.0703x slower bitops-nsieve-bits 3.2180+-0.0167 ? 3.2709+-0.0997 ? might be 1.0164x slower controlflow-recursive 2.7410+-0.1287 ! 3.0517+-0.1751 ! definitely 1.1133x slower crypto-aes 4.7267+-0.2546 ? 4.7601+-0.2028 ? crypto-md5 2.7595+-0.0265 2.7413+-0.0654 crypto-sha1 3.7397+-0.1962 ? 3.8553+-0.2389 ? might be 1.0309x slower date-format-tofte 9.3505+-0.1944 ? 9.3905+-0.1069 ? date-format-xparb 5.4230+-0.0828 ? 5.6960+-0.2186 ? might be 1.0503x slower math-cordic 3.1071+-0.0822 3.1050+-0.0469 math-partial-sums 5.4154+-0.1905 ? 5.4918+-0.3024 ? might be 1.0141x slower math-spectral-norm 2.0257+-0.0540 ? 2.1313+-0.1027 ? might be 1.0521x slower regexp-dna 8.1180+-1.2585 ? 8.2002+-1.2945 ? might be 1.0101x slower string-base64 5.1721+-0.7790 5.0391+-0.2488 might be 1.0264x faster string-fasta 6.8041+-0.4140 ? 6.8783+-0.3566 ? might be 1.0109x slower string-tagcloud 10.3134+-0.9240 10.0135+-0.5165 might be 1.0299x faster string-unpack-code 21.0568+-0.6950 ? 21.1302+-1.4146 ? string-validate-input 5.9877+-0.3966 ? 6.3720+-0.6683 ? might be 1.0642x slower <arithmetic> 5.4148+-0.0653 ? 5.4427+-0.0627 ? might be 1.0052x slower TipOfTree KillFragile LongSpider: 3d-cube 1111.6484+-13.6909 ? 1129.0247+-47.0946 ? might be 1.0156x slower 3d-morph 1533.5403+-9.1098 1531.1944+-5.5061 3d-raytrace 706.4413+-11.4719 698.5375+-7.1135 might be 1.0113x faster access-binary-trees 1002.3462+-8.0472 ? 1006.6850+-7.2561 ? access-fannkuch 351.2570+-11.9549 ? 354.9881+-22.4554 ? might be 1.0106x slower access-nbody 590.0514+-1.4876 ? 593.0566+-5.5511 ? access-nsieve 477.3623+-6.6054 ? 479.2903+-5.3086 ? bitops-3bit-bits-in-byte 44.9222+-1.5452 ? 46.9449+-3.2299 ? might be 1.0450x slower bitops-bits-in-byte 100.3494+-1.3994 99.3380+-0.4403 might be 1.0102x faster bitops-nsieve-bits 416.6311+-3.0204 ? 418.5774+-3.8022 ? controlflow-recursive 488.8066+-9.4110 479.7889+-10.1047 might be 1.0188x faster crypto-aes 686.6007+-23.2664 679.1970+-12.6436 might be 1.0109x faster crypto-md5 522.6184+-6.5017 ? 526.4530+-9.1409 ? crypto-sha1 683.8693+-12.3408 683.5646+-13.9903 date-format-tofte 730.7314+-22.5279 ? 738.7426+-18.7207 ? might be 1.0110x slower date-format-xparb 809.8194+-52.6761 ? 837.0182+-32.2235 ? might be 1.0336x slower hash-map 188.3042+-9.2363 184.5827+-5.0380 might be 1.0202x faster math-cordic 579.0139+-5.3374 576.5954+-1.9425 math-partial-sums 515.7079+-8.9618 ? 520.8332+-19.3225 ? math-spectral-norm 568.2700+-3.3616 ? 572.2967+-4.7012 ? string-base64 407.5018+-3.8717 406.3160+-5.4002 string-fasta 419.0234+-2.7629 ? 423.2995+-8.0328 ? might be 1.0102x slower string-tagcloud 198.8052+-7.5008 198.0483+-6.8016 <geometric> 459.6168+-3.6128 ? 461.2429+-1.8889 ? might be 1.0035x slower TipOfTree KillFragile V8Spider: crypto 55.4757+-2.1297 ? 58.2491+-2.4580 ? might be 1.0500x slower deltablue 99.0967+-1.7898 ? 104.8929+-6.9563 ? might be 1.0585x slower earley-boyer 47.3778+-1.8227 ? 48.0252+-1.0096 ? might be 1.0137x slower raytrace 41.3442+-2.1605 41.2783+-3.2746 regexp 77.9365+-4.6408 75.2558+-0.6068 might be 1.0356x faster richards 79.6482+-1.5252 79.6150+-1.1204 splay 40.9108+-1.2991 ? 45.2399+-14.7671 ? might be 1.1058x slower <geometric> 59.7685+-0.7144 ? 61.1315+-3.4439 ? might be 1.0228x slower TipOfTree KillFragile Octane: encrypt 0.19593+-0.00443 ? 0.20365+-0.01297 ? might be 1.0394x slower decrypt 3.30864+-0.03806 ? 3.34438+-0.16406 ? might be 1.0108x slower deltablue x2 0.19207+-0.00697 ? 0.19449+-0.01031 ? might be 1.0126x slower earley 0.35666+-0.01644 0.34671+-0.00197 might be 1.0287x faster boyer 5.08604+-0.04222 ? 5.11047+-0.03869 ? navier-stokes x2 5.14762+-0.03507 5.12602+-0.00701 raytrace x2 1.29500+-0.03942 1.27381+-0.03536 might be 1.0166x faster richards x2 0.12778+-0.00176 0.12761+-0.00202 splay x2 0.40455+-0.00645 0.39746+-0.00481 might be 1.0178x faster regexp x2 28.89192+-0.17189 ? 29.16002+-0.11726 ? pdfjs x2 42.95033+-0.11565 ? 43.18191+-0.40655 ? mandreel x2 50.69832+-0.87303 ? 51.30054+-2.26108 ? might be 1.0119x slower gbemu x2 42.97147+-1.30845 ? 43.75604+-2.30081 ? might be 1.0183x slower closure 0.62759+-0.00376 0.62218+-0.00340 jquery 8.16884+-0.02996 ? 8.27291+-0.40614 ? might be 1.0127x slower box2d x2 11.85675+-0.07092 ? 12.03736+-0.29166 ? might be 1.0152x slower zlib x2 403.32547+-27.03232 ? 404.47605+-2.78829 ? typescript x2 830.38896+-10.70370 ? 852.90312+-83.22869 ? might be 1.0271x slower <geometric> 6.54650+-0.04089 ? 6.57834+-0.06668 ? might be 1.0049x slower TipOfTree KillFragile Kraken: ai-astar 226.346+-5.806 ? 227.788+-9.129 ? audio-beat-detection 82.928+-1.464 ? 84.818+-6.491 ? might be 1.0228x slower audio-dft 121.797+-1.339 ? 126.608+-12.643 ? might be 1.0395x slower audio-fft 70.353+-4.758 ? 71.962+-2.366 ? might be 1.0229x slower audio-oscillator 78.924+-4.560 76.828+-1.230 might be 1.0273x faster imaging-darkroom 106.470+-2.142 ? 106.901+-2.058 ? imaging-desaturate 62.327+-2.056 62.194+-2.125 imaging-gaussian-blur 109.900+-1.799 ? 113.846+-8.177 ? might be 1.0359x slower json-parse-financial 48.063+-1.867 ? 49.470+-2.333 ? might be 1.0293x slower json-stringify-tinderbox 30.298+-2.002 28.574+-0.872 might be 1.0603x faster stanford-crypto-aes 58.383+-1.224 ? 59.634+-2.747 ? might be 1.0214x slower stanford-crypto-ccm 48.788+-1.085 ? 50.880+-3.302 ? might be 1.0429x slower stanford-crypto-pbkdf2 105.286+-2.654 ? 106.570+-1.083 ? might be 1.0122x slower stanford-crypto-sha256-iterative 43.263+-2.792 41.963+-0.547 might be 1.0310x faster <arithmetic> 85.223+-0.638 ? 86.288+-1.356 ? might be 1.0125x slower TipOfTree KillFragile JSRegress: abc-forward-loop-equal 48.8656+-3.1739 47.6755+-0.7228 might be 1.0250x faster abc-postfix-backward-loop 47.5457+-1.2181 47.4857+-1.6844 abc-simple-backward-loop 46.9294+-0.7073 46.8554+-0.2443 abc-simple-forward-loop 47.5520+-1.8449 46.5876+-0.2892 might be 1.0207x faster abc-skippy-loop 33.1906+-1.8353 32.1427+-0.4142 might be 1.0326x faster abs-boolean 2.7937+-0.2470 2.6542+-0.0375 might be 1.0526x faster adapt-to-double-divide 17.0269+-0.7045 16.9888+-0.9646 aliased-arguments-getbyval 1.2569+-0.0434 ? 1.2805+-0.0458 ? might be 1.0188x slower allocate-big-object 2.8575+-0.1402 ? 2.8764+-0.2151 ? arguments-named-and-reflective 13.0465+-0.9768 12.9622+-1.4357 arguments-out-of-bounds 14.8404+-0.6232 14.7170+-0.6420 arguments-strict-mode 11.5647+-1.4900 11.3732+-0.7950 might be 1.0168x faster arguments 9.6032+-0.1141 ? 9.9503+-0.8095 ? might be 1.0361x slower arity-mismatch-inlining 0.9099+-0.0365 ? 0.9856+-0.1372 ? might be 1.0832x slower array-access-polymorphic-structure 6.6110+-0.1471 ? 7.0507+-1.1571 ? might be 1.0665x slower array-nonarray-polymorhpic-access 32.7572+-1.6663 32.5632+-1.1736 array-prototype-every 88.5128+-3.1296 87.8908+-3.8281 array-prototype-forEach 85.8632+-2.0153 85.6193+-1.1476 array-prototype-map 96.3062+-3.1659 92.9744+-1.9200 might be 1.0358x faster array-prototype-reduce 86.1436+-3.2155 83.5887+-1.3737 might be 1.0306x faster array-prototype-reduceRight 85.5524+-3.0433 81.9420+-1.3088 might be 1.0441x faster array-prototype-some 89.1138+-4.8958 87.0966+-1.8909 might be 1.0232x faster array-splice-contiguous 26.5886+-0.2765 ? 27.2762+-1.1168 ? might be 1.0259x slower array-with-double-add 4.2373+-0.0475 ? 4.3924+-0.3629 ? might be 1.0366x slower array-with-double-increment 3.3459+-0.2699 ? 3.6550+-0.7383 ? might be 1.0924x slower array-with-double-mul-add 5.3520+-0.2911 5.2235+-0.1045 might be 1.0246x faster array-with-double-sum 3.4028+-0.1822 3.3653+-0.0511 might be 1.0111x faster array-with-int32-add-sub 6.8269+-0.0398 ? 7.2637+-0.7778 ? might be 1.0640x slower array-with-int32-or-double-sum 3.4497+-0.2075 ? 3.5410+-0.2782 ? might be 1.0265x slower ArrayBuffer-DataView-alloc-large-long-lived 36.2631+-0.9472 ! 38.9834+-1.4991 ! definitely 1.0750x slower ArrayBuffer-DataView-alloc-long-lived 15.5404+-2.4266 ? 15.9283+-1.5297 ? might be 1.0250x slower ArrayBuffer-Int32Array-byteOffset 3.9292+-0.1573 3.8568+-0.1520 might be 1.0188x faster ArrayBuffer-Int8Array-alloc-large-long-lived 39.4789+-2.5846 39.0430+-1.7040 might be 1.0112x faster ArrayBuffer-Int8Array-alloc-long-lived-buffer 22.8830+-2.0659 ? 22.9473+-1.2714 ? ArrayBuffer-Int8Array-alloc-long-lived 14.1545+-1.7294 ? 14.2828+-1.3662 ? ArrayBuffer-Int8Array-alloc 11.0574+-1.2077 10.9041+-0.7418 might be 1.0141x faster asmjs_bool_bug 7.8291+-0.2369 ! 18.5383+-1.3053 ! definitely 2.3679x slower assign-custom-setter-polymorphic 3.3088+-0.1565 3.2319+-0.0622 might be 1.0238x faster assign-custom-setter 4.6873+-0.2575 4.6745+-0.1944 basic-set 9.4895+-0.2623 ? 9.6869+-0.3566 ? might be 1.0208x slower big-int-mul 4.0697+-0.0474 ? 4.0905+-0.1092 ? boolean-test 3.2308+-0.1219 ? 3.2551+-0.1345 ? branch-fold 3.9612+-0.2302 ? 4.0981+-0.1313 ? might be 1.0346x slower branch-on-string-as-boolean 20.7430+-0.4712 20.6926+-0.4615 by-val-generic 8.6214+-0.2568 8.4107+-0.0874 might be 1.0251x faster call-spread-apply 31.6786+-2.0432 31.1379+-1.4849 might be 1.0174x faster call-spread-call 25.6069+-1.0033 25.0826+-0.6862 might be 1.0209x faster captured-assignments 0.6066+-0.1897 0.5515+-0.0479 might be 1.0999x faster cast-int-to-double 5.3323+-0.0618 5.3077+-0.0244 cell-argument 8.9934+-0.6219 8.5852+-0.1996 might be 1.0475x faster cfg-simplify 2.8853+-0.1092 ? 2.8921+-0.0661 ? chain-getter-access 9.4790+-0.2785 ? 9.5269+-0.4083 ? cmpeq-obj-to-obj-other 11.7711+-0.7494 ? 12.2868+-1.2302 ? might be 1.0438x slower constant-test 5.0017+-0.0191 ? 5.0482+-0.1124 ? create-lots-of-functions 11.7094+-0.6472 11.6580+-0.6335 cse-new-array-buffer 2.5092+-0.0285 ? 2.5701+-0.1183 ? might be 1.0243x slower cse-new-array 2.6077+-0.0393 ? 2.7307+-0.2638 ? might be 1.0472x slower DataView-custom-properties 42.6788+-0.8554 ? 42.9906+-2.4471 ? delay-tear-off-arguments-strictmode 14.2223+-1.1840 13.9430+-0.5564 might be 1.0200x faster deltablue-varargs 219.2578+-11.0620 216.1359+-8.4887 might be 1.0144x faster destructuring-arguments 243.2455+-17.5824 ^ 186.1989+-4.6737 ^ definitely 1.3064x faster destructuring-parameters-overridden-by-function 0.5915+-0.0308 ? 0.6174+-0.0494 ? might be 1.0439x slower destructuring-swap 5.1321+-0.0599 ? 5.1388+-0.0897 ? direct-arguments-getbyval 1.2355+-0.0427 ? 1.2933+-0.0965 ? might be 1.0468x slower div-boolean-double 5.3106+-0.1119 5.2974+-0.0476 div-boolean 7.8267+-0.0308 ? 7.8502+-0.0912 ? double-get-by-val-out-of-bounds 4.7448+-0.0639 ^ 4.6082+-0.0530 ^ definitely 1.0297x faster double-pollution-getbyval 8.9664+-0.0965 ? 9.0214+-0.3278 ? double-pollution-putbyoffset 4.4117+-0.1700 ? 4.4287+-0.1653 ? double-real-use 31.7875+-2.0038 30.0139+-1.2591 might be 1.0591x faster double-to-int32-typed-array-no-inline 2.5334+-0.2329 ? 2.5378+-0.1284 ? double-to-int32-typed-array 1.9543+-0.0323 ? 1.9956+-0.0283 ? might be 1.0211x slower double-to-uint32-typed-array-no-inline 2.5728+-0.0882 ? 2.7020+-0.2401 ? might be 1.0502x slower double-to-uint32-typed-array 2.2045+-0.2791 2.0610+-0.1053 might be 1.0697x faster elidable-new-object-dag 43.3591+-1.8146 ? 43.3979+-1.9395 ? elidable-new-object-roflcopter 43.8473+-2.0571 43.1228+-0.6415 might be 1.0168x faster elidable-new-object-then-call 40.0031+-1.5484 39.3519+-0.9611 might be 1.0165x faster elidable-new-object-tree 46.7940+-1.5835 46.2204+-2.3917 might be 1.0124x faster empty-string-plus-int 5.6799+-0.3588 5.4617+-0.1921 might be 1.0399x faster emscripten-cube2hash 39.3350+-2.5317 38.7665+-2.3517 might be 1.0147x faster exit-length-on-plain-object 14.3972+-1.3795 13.9520+-0.4362 might be 1.0319x faster external-arguments-getbyval 1.2651+-0.0444 ? 1.4343+-0.1721 ? might be 1.1337x slower external-arguments-putbyval 2.3350+-0.0323 ! 2.4221+-0.0513 ! definitely 1.0373x slower fixed-typed-array-storage-var-index 1.2662+-0.0823 1.2157+-0.0573 might be 1.0415x faster fixed-typed-array-storage 0.9425+-0.0814 0.9006+-0.0275 might be 1.0465x faster Float32Array-matrix-mult 4.5906+-0.1292 ? 4.6967+-0.1048 ? might be 1.0231x slower Float32Array-to-Float64Array-set 56.8227+-1.9334 ^ 51.6147+-1.5963 ^ definitely 1.1009x faster Float64Array-alloc-long-lived 86.9775+-3.6954 ? 87.7484+-1.8540 ? Float64Array-to-Int16Array-set 69.6254+-1.4555 ? 69.8114+-1.7463 ? fold-double-to-int 14.2906+-1.2589 ! 22.4733+-0.5278 ! definitely 1.5726x slower fold-get-by-id-to-multi-get-by-offset-rare-int 10.7929+-1.0848 ? 11.0518+-1.2137 ? might be 1.0240x slower fold-get-by-id-to-multi-get-by-offset 10.5487+-0.8843 9.9752+-1.1051 might be 1.0575x faster fold-multi-get-by-offset-to-get-by-offset 9.2335+-0.8697 8.8104+-1.5861 might be 1.0480x faster fold-multi-get-by-offset-to-poly-get-by-offset 9.2823+-0.3638 ? 9.4632+-0.5330 ? might be 1.0195x slower fold-multi-put-by-offset-to-poly-put-by-offset 10.1414+-0.8393 ? 10.6445+-0.7129 ? might be 1.0496x slower fold-multi-put-by-offset-to-put-by-offset 8.1075+-0.3644 8.0507+-0.8025 fold-multi-put-by-offset-to-replace-or-transition-put-by-offset 10.1613+-0.8650 9.9653+-0.6842 might be 1.0197x faster fold-put-by-id-to-multi-put-by-offset 10.7037+-1.0329 10.2995+-0.9381 might be 1.0392x faster fold-put-structure 7.6039+-0.3897 ? 7.6462+-0.5356 ? for-of-iterate-array-entries 12.9559+-1.3629 12.5558+-0.1687 might be 1.0319x faster for-of-iterate-array-keys 3.9853+-0.3665 3.8548+-0.0564 might be 1.0339x faster for-of-iterate-array-values 4.0295+-0.4059 3.9248+-0.1809 might be 1.0267x faster fround 21.0765+-0.6807 20.9597+-0.6053 ftl-library-inlining-dataview 67.8527+-4.8458 67.3314+-3.5550 ftl-library-inlining 73.9913+-18.6773 ? 74.5857+-17.0658 ? function-dot-apply 2.2917+-0.1164 ? 2.2944+-0.0723 ? function-test 2.9986+-0.1382 ? 3.0422+-0.1499 ? might be 1.0145x slower function-with-eval 104.6504+-2.6099 102.1421+-4.0751 might be 1.0246x faster gcse-poly-get-less-obvious 18.5585+-0.9065 ? 19.2482+-1.1608 ? might be 1.0372x slower gcse-poly-get 21.0581+-2.0404 20.6571+-1.9984 might be 1.0194x faster gcse 4.4058+-0.0622 ? 4.4383+-0.1571 ? get-by-id-bimorphic-check-structure-elimination-simple 2.7962+-0.1146 ? 2.8297+-0.1051 ? might be 1.0120x slower get-by-id-bimorphic-check-structure-elimination 6.0188+-0.0632 ? 6.1523+-0.3415 ? might be 1.0222x slower get-by-id-chain-from-try-block 7.0326+-1.1779 6.8705+-0.1547 might be 1.0236x faster get-by-id-check-structure-elimination 5.1882+-0.0461 5.1403+-0.0831 get-by-id-proto-or-self 19.6470+-2.7154 ? 19.9227+-2.6742 ? might be 1.0140x slower get-by-id-quadmorphic-check-structure-elimination-simple 3.0656+-0.1741 3.0421+-0.1559 get-by-id-self-or-proto 19.3027+-2.0398 18.2064+-1.8615 might be 1.0602x faster get-by-val-out-of-bounds 4.4951+-0.1098 4.4148+-0.0366 might be 1.0182x faster get_callee_monomorphic 2.9344+-0.5788 2.6504+-0.0776 might be 1.1072x faster get_callee_polymorphic 3.6644+-0.2309 ! 4.3853+-0.0827 ! definitely 1.1967x slower getter-no-activation 5.2174+-0.3309 5.1107+-0.2790 might be 1.0209x faster getter-prototype 15.0947+-0.7633 14.8254+-0.2975 might be 1.0182x faster getter-richards 125.6264+-4.4010 ? 126.5938+-11.0964 ? getter 6.2266+-0.9945 5.6010+-0.4990 might be 1.1117x faster global-var-const-infer-fire-from-opt 0.9292+-0.0315 ? 0.9463+-0.0506 ? might be 1.0183x slower global-var-const-infer 0.8698+-0.1731 ? 0.9160+-0.2495 ? might be 1.0531x slower HashMap-put-get-iterate-keys 31.3818+-1.7341 31.3200+-2.0030 HashMap-put-get-iterate 32.8168+-0.8292 31.3636+-1.9721 might be 1.0463x faster HashMap-string-put-get-iterate 32.4993+-2.6791 ? 32.7550+-1.5033 ? hoist-make-rope 13.4399+-0.9726 12.4910+-0.9916 might be 1.0760x faster hoist-poly-check-structure-effectful-loop 5.1434+-0.1413 ? 5.3437+-0.5042 ? might be 1.0390x slower hoist-poly-check-structure 3.7586+-0.0701 3.7557+-0.0624 imul-double-only 8.6942+-0.2109 8.6239+-0.7505 imul-int-only 9.9823+-0.1631 9.8886+-0.1736 imul-mixed 8.2263+-0.4108 ? 8.4532+-0.3132 ? might be 1.0276x slower in-four-cases 23.5408+-1.2967 22.7229+-0.2625 might be 1.0360x faster in-one-case-false 11.2818+-0.4317 ? 11.3230+-0.1716 ? in-one-case-true 11.1762+-0.2180 ? 11.3520+-0.2820 ? might be 1.0157x slower in-two-cases 11.4252+-0.0952 ? 11.5972+-0.4166 ? might be 1.0151x slower indexed-properties-in-objects 2.9386+-0.0367 ! 3.1696+-0.0828 ! definitely 1.0786x slower infer-closure-const-then-mov-no-inline 3.9707+-0.0162 ! 4.5913+-0.4841 ! definitely 1.1563x slower infer-closure-const-then-mov 20.0662+-0.7732 19.8011+-0.3405 might be 1.0134x faster infer-closure-const-then-put-to-scope-no-inline 13.1515+-1.0753 13.0079+-0.8154 might be 1.0110x faster infer-closure-const-then-put-to-scope 22.1228+-0.6736 21.5544+-0.5891 might be 1.0264x faster infer-closure-const-then-reenter-no-inline 56.8105+-2.5850 55.0740+-1.6806 might be 1.0315x faster infer-closure-const-then-reenter 23.0161+-1.2799 ? 23.2373+-0.2649 ? infer-constant-global-property 3.6643+-0.1860 3.5857+-0.1092 might be 1.0219x faster infer-constant-property 2.7596+-0.0866 ? 2.8103+-0.1267 ? might be 1.0184x slower infer-one-time-closure-ten-vars 12.5919+-0.2666 ? 13.0062+-0.7755 ? might be 1.0329x slower infer-one-time-closure-two-vars 12.5990+-0.7363 ? 12.8025+-0.9210 ? might be 1.0162x slower infer-one-time-closure 12.3515+-0.7743 ? 12.8923+-1.0654 ? might be 1.0438x slower infer-one-time-deep-closure 21.3260+-1.0696 ? 21.9395+-1.1716 ? might be 1.0288x slower inline-arguments-access 4.4963+-0.3298 4.3958+-0.0842 might be 1.0229x faster inline-arguments-aliased-access 4.5196+-0.3304 4.4453+-0.1837 might be 1.0167x faster inline-arguments-local-escape 4.3909+-0.1384 ? 4.4279+-0.2329 ? inline-get-scoped-var 4.8132+-0.1018 ? 4.9755+-0.2526 ? might be 1.0337x slower inlined-put-by-id-transition 11.8921+-0.7158 ? 11.9030+-0.3108 ? int-or-other-abs-then-get-by-val 5.0362+-0.0699 4.9916+-0.0100 int-or-other-abs-zero-then-get-by-val 19.1250+-1.7199 17.8445+-0.7941 might be 1.0718x faster int-or-other-add-then-get-by-val 4.4007+-0.1034 4.3542+-0.0203 might be 1.0107x faster int-or-other-add 5.4477+-0.1156 ? 5.5089+-0.2023 ? might be 1.0112x slower int-or-other-div-then-get-by-val 4.2552+-0.0369 ? 4.2854+-0.0428 ? int-or-other-max-then-get-by-val 4.3778+-0.0772 ? 4.4424+-0.2245 ? might be 1.0148x slower int-or-other-min-then-get-by-val 4.3628+-0.0421 ? 4.5683+-0.4145 ? might be 1.0471x slower int-or-other-mod-then-get-by-val 3.9526+-0.0204 ? 4.0192+-0.1063 ? might be 1.0169x slower int-or-other-mul-then-get-by-val 3.9506+-0.0356 3.9461+-0.0272 int-or-other-neg-then-get-by-val 4.9621+-0.3243 4.8850+-0.1301 might be 1.0158x faster int-or-other-neg-zero-then-get-by-val 18.4331+-0.9600 17.8401+-0.2970 might be 1.0332x faster int-or-other-sub-then-get-by-val 4.4175+-0.0284 ? 4.4535+-0.0914 ? int-or-other-sub 3.6675+-0.1194 ? 3.7567+-0.3148 ? might be 1.0243x slower int-overflow-local 4.7100+-0.3392 ? 4.7203+-0.2684 ? Int16Array-alloc-long-lived 53.0855+-1.5062 ? 54.0390+-1.1558 ? might be 1.0180x slower Int16Array-bubble-sort-with-byteLength 20.2757+-0.5137 ^ 15.8335+-0.1630 ^ definitely 1.2806x faster Int16Array-bubble-sort 20.6977+-1.5178 ^ 16.5044+-0.8800 ^ definitely 1.2541x faster Int16Array-load-int-mul 1.6093+-0.0981 1.5074+-0.0352 might be 1.0676x faster Int16Array-to-Int32Array-set 56.8641+-2.0835 53.8638+-2.7646 might be 1.0557x faster Int32Array-alloc-large 24.3234+-0.5300 24.0205+-0.3998 might be 1.0126x faster Int32Array-alloc-long-lived 64.2209+-2.0207 63.3881+-1.2789 might be 1.0131x faster Int32Array-alloc 3.4843+-0.3063 3.3528+-0.1334 might be 1.0392x faster Int32Array-Int8Array-view-alloc 6.8088+-0.7801 ? 7.0131+-0.8868 ? might be 1.0300x slower int52-spill 5.6659+-0.1405 5.6159+-0.6383 Int8Array-alloc-long-lived 48.6840+-1.4842 ? 49.4736+-2.3957 ? might be 1.0162x slower Int8Array-load-with-byteLength 3.6733+-0.3868 3.3708+-0.0459 might be 1.0898x faster Int8Array-load 3.3730+-0.0448 ? 3.4354+-0.1293 ? might be 1.0185x slower integer-divide 10.9601+-0.1536 ? 11.0705+-0.1326 ? might be 1.0101x slower integer-modulo 2.2535+-0.2249 2.1164+-0.0822 might be 1.0648x faster is-boolean-fold-tricky 4.6072+-0.2544 4.5149+-0.1948 might be 1.0205x faster is-boolean-fold 2.9569+-0.1541 2.9435+-0.1213 is-function-fold-tricky-internal-function 12.1052+-0.1060 12.0088+-0.2362 is-function-fold-tricky 4.7812+-0.3185 4.7007+-0.1172 might be 1.0171x faster is-function-fold 2.8813+-0.0530 ? 2.9418+-0.0951 ? might be 1.0210x slower is-number-fold-tricky 4.4711+-0.0508 ? 4.4825+-0.0751 ? is-number-fold 2.9513+-0.1176 2.8931+-0.1279 might be 1.0201x faster is-object-or-null-fold-functions 2.9494+-0.0630 ? 3.0299+-0.1397 ? might be 1.0273x slower is-object-or-null-fold-less-tricky 4.7859+-0.5558 4.6829+-0.3717 might be 1.0220x faster is-object-or-null-fold-tricky 6.6710+-0.1639 ? 6.8134+-0.2398 ? might be 1.0213x slower is-object-or-null-fold 2.9689+-0.1559 2.9112+-0.0392 might be 1.0198x faster is-object-or-null-trickier-function 4.5975+-0.0199 ? 4.6213+-0.0578 ? is-object-or-null-trickier-internal-function 12.5915+-0.3019 ? 12.7368+-0.1211 ? might be 1.0115x slower is-object-or-null-tricky-function 4.6618+-0.1000 ? 4.7439+-0.2329 ? might be 1.0176x slower is-object-or-null-tricky-internal-function 9.2953+-0.1329 ? 9.3736+-0.1415 ? is-string-fold-tricky 4.4848+-0.0505 ? 4.6975+-0.3056 ? might be 1.0474x slower is-string-fold 2.8922+-0.0682 ? 2.9178+-0.1238 ? is-undefined-fold-tricky 3.7618+-0.0329 ? 3.8999+-0.1929 ? might be 1.0367x slower is-undefined-fold 2.9103+-0.0932 ? 2.9685+-0.1292 ? might be 1.0200x slower large-int-captured 4.6919+-0.2234 ? 4.7647+-0.1007 ? might be 1.0155x slower large-int-neg 17.4164+-1.3340 17.2292+-1.7193 might be 1.0109x faster large-int 16.3160+-1.7241 15.0413+-0.3826 might be 1.0847x faster load-varargs-elimination 23.0845+-0.3773 ? 23.9302+-1.9131 ? might be 1.0366x slower logical-not-weird-types 3.5027+-0.1000 3.4358+-0.0371 might be 1.0195x faster logical-not 4.7383+-0.0761 4.7196+-0.1211 lots-of-fields 12.0102+-0.2783 ? 12.4755+-0.5081 ? might be 1.0387x slower make-indexed-storage 3.2052+-0.0566 3.1512+-0.0598 might be 1.0171x faster make-rope-cse 12.6359+-1.1304 ? 13.8017+-1.2327 ? might be 1.0923x slower marsaglia-larger-ints 36.5624+-0.8877 ? 36.8232+-0.8595 ? marsaglia-osr-entry 23.1437+-0.6059 ? 23.5035+-1.4732 ? might be 1.0155x slower math-with-out-of-bounds-array-values 25.2302+-0.7472 ^ 24.0509+-0.3887 ^ definitely 1.0490x faster max-boolean 2.5192+-0.0531 2.5187+-0.0458 method-on-number 18.6099+-0.2662 18.0300+-0.8806 might be 1.0322x faster min-boolean 2.5479+-0.0925 ? 2.5504+-0.0998 ? minus-boolean-double 3.2247+-0.0452 3.1755+-0.0342 might be 1.0155x faster minus-boolean 2.4399+-0.1142 2.4355+-0.2259 misc-strict-eq 38.3765+-2.0020 ? 39.9556+-3.0714 ? might be 1.0411x slower mod-boolean-double 10.9436+-0.0353 ? 11.1086+-0.1431 ? might be 1.0151x slower mod-boolean 7.8731+-0.0260 ? 7.9188+-0.0627 ? mul-boolean-double 3.7953+-0.0541 3.7323+-0.0769 might be 1.0169x faster mul-boolean 2.8971+-0.0230 ? 2.9403+-0.0525 ? might be 1.0149x slower neg-boolean 3.2299+-0.0431 ? 3.2428+-0.0467 ? negative-zero-divide 0.4176+-0.0193 0.4078+-0.0493 might be 1.0238x faster negative-zero-modulo 0.3995+-0.0307 0.3873+-0.0222 might be 1.0314x faster negative-zero-negate 0.3821+-0.0288 ? 0.3896+-0.0251 ? might be 1.0197x slower nested-function-parsing 39.6056+-1.8359 ? 41.9015+-2.5262 ? might be 1.0580x slower new-array-buffer-dead 115.6413+-1.0790 113.4774+-2.8829 might be 1.0191x faster new-array-buffer-push 7.2028+-0.9184 7.1790+-0.9169 new-array-dead 19.7540+-0.8675 19.6535+-0.4286 new-array-push 6.5706+-0.2280 ? 6.6888+-0.1152 ? might be 1.0180x slower no-inline-constructor 41.4896+-1.7647 41.4545+-1.9069 number-test 3.2260+-0.2184 3.1711+-0.1030 might be 1.0173x faster object-closure-call 6.0102+-0.6591 5.7353+-0.1013 might be 1.0479x faster object-test 2.8739+-0.0135 ? 2.8960+-0.0209 ? obvious-sink-pathology-taken 142.0662+-3.8283 ? 142.9138+-0.6500 ? obvious-sink-pathology 131.2300+-2.2354 ? 133.5909+-1.2626 ? might be 1.0180x slower obviously-elidable-new-object 34.5745+-1.6824 ? 35.0348+-2.0001 ? might be 1.0133x slower plus-boolean-arith 2.5289+-0.0479 ? 2.5947+-0.1376 ? might be 1.0260x slower plus-boolean-double 3.2545+-0.0458 ? 3.3408+-0.1658 ? might be 1.0265x slower plus-boolean 2.5442+-0.1815 2.4703+-0.0897 might be 1.0299x faster poly-chain-access-different-prototypes-simple 3.3705+-0.0668 3.3550+-0.0514 poly-chain-access-different-prototypes 2.5782+-0.0190 ? 2.6873+-0.1073 ? might be 1.0423x slower poly-chain-access-simpler 3.3444+-0.0569 3.3141+-0.0528 poly-chain-access 2.6253+-0.1403 2.5925+-0.0421 might be 1.0126x faster poly-stricteq 64.5675+-2.8903 62.7793+-2.2574 might be 1.0285x faster polymorphic-array-call 1.3654+-0.0831 ? 1.3757+-0.0418 ? polymorphic-get-by-id 3.1881+-0.0369 3.1626+-0.0377 polymorphic-put-by-id 31.1657+-2.4050 ? 33.0242+-2.9986 ? might be 1.0596x slower polymorphic-structure 15.1262+-0.6822 14.7732+-0.1844 might be 1.0239x faster polyvariant-monomorphic-get-by-id 8.6115+-0.1693 ? 8.6822+-0.2107 ? proto-getter-access 9.3233+-0.1668 9.2735+-0.1557 put-by-id-replace-and-transition 9.7245+-0.3252 ? 9.7318+-0.2561 ? put-by-id-slightly-polymorphic 2.9256+-0.1979 2.8653+-0.0381 might be 1.0210x faster put-by-id 12.7977+-0.3831 ? 12.9371+-0.6515 ? might be 1.0109x slower put-by-val-direct 0.4156+-0.0546 ? 0.4202+-0.0621 ? might be 1.0110x slower put-by-val-large-index-blank-indexing-type 12.8735+-1.4777 12.4545+-1.0238 might be 1.0336x faster put-by-val-machine-int 2.8578+-0.0510 2.8532+-0.0772 rare-osr-exit-on-local 15.1293+-0.8831 14.9592+-0.2221 might be 1.0114x faster register-pressure-from-osr 22.0940+-1.1368 21.4066+-0.1723 might be 1.0321x faster repeat-multi-get-by-offset 24.7769+-0.5270 ? 24.9869+-1.2387 ? setter-prototype 10.7756+-0.5646 10.3408+-0.2578 might be 1.0420x faster setter 6.4272+-0.6087 6.0461+-0.8105 might be 1.0630x faster simple-activation-demo 26.1675+-1.6006 25.3679+-0.0909 might be 1.0315x faster simple-getter-access 11.6413+-0.1959 ? 12.0388+-0.5057 ? might be 1.0341x slower simple-poly-call-nested 8.1929+-0.1404 ? 8.2848+-0.3160 ? might be 1.0112x slower simple-poly-call 1.3306+-0.0197 1.3275+-0.0150 sin-boolean 23.0531+-0.8890 ? 23.5378+-1.4342 ? might be 1.0210x slower singleton-scope 62.4755+-0.5823 62.3252+-0.4383 sink-function 11.9483+-0.5913 11.4709+-0.3051 might be 1.0416x faster sink-huge-activation 19.0968+-0.4666 ? 19.6622+-1.1697 ? might be 1.0296x slower sinkable-new-object-dag 69.3654+-1.6685 ? 72.2611+-3.4394 ? might be 1.0417x slower sinkable-new-object-taken 52.6157+-2.1783 ? 53.8029+-2.3903 ? might be 1.0226x slower sinkable-new-object 38.4804+-1.0714 ? 39.3876+-2.0001 ? might be 1.0236x slower slow-array-profile-convergence 3.0564+-0.3626 2.8841+-0.1559 might be 1.0597x faster slow-convergence 2.7940+-0.1046 ? 2.8886+-0.3572 ? might be 1.0338x slower slow-ternaries 21.1374+-2.2417 ? 21.9553+-3.8604 ? might be 1.0387x slower sorting-benchmark 19.4988+-1.1274 19.3558+-2.1198 sparse-conditional 1.1905+-0.0398 ? 1.2417+-0.0753 ? might be 1.0430x slower splice-to-remove 15.3677+-0.7446 15.0920+-0.1888 might be 1.0183x faster string-char-code-at 16.3259+-0.2594 16.1285+-0.1281 might be 1.0122x faster string-concat-object 2.6724+-0.3609 2.5131+-0.1035 might be 1.0634x faster string-concat-pair-object 2.4733+-0.0876 ? 2.5082+-0.1148 ? might be 1.0141x slower string-concat-pair-simple 12.5156+-1.0503 ? 12.6041+-1.0514 ? string-concat-simple 13.0330+-1.4362 12.3118+-1.0451 might be 1.0586x faster string-cons-repeat 8.6525+-0.9279 ? 8.8453+-0.9191 ? might be 1.0223x slower string-cons-tower 8.3058+-0.9019 ? 8.3438+-0.9312 ? string-equality 18.5274+-0.5978 18.0775+-0.6984 might be 1.0249x faster string-get-by-val-big-char 7.7325+-1.1912 7.2164+-0.0508 might be 1.0715x faster string-get-by-val-out-of-bounds-insane 3.7172+-0.1112 ? 3.7803+-0.0485 ? might be 1.0170x slower string-get-by-val-out-of-bounds 5.3929+-0.0322 ? 5.4357+-0.1438 ? string-get-by-val 3.4978+-0.1642 3.4891+-0.0693 string-hash 2.2407+-0.2532 2.1108+-0.0609 might be 1.0615x faster string-long-ident-equality 15.0696+-0.2651 14.9672+-0.1593 string-out-of-bounds 15.2966+-0.8476 14.9972+-0.2842 might be 1.0200x faster string-repeat-arith 33.6455+-1.8277 ? 36.1458+-1.6684 ? might be 1.0743x slower string-sub 65.9492+-3.3752 ? 69.6652+-5.1862 ? might be 1.0563x slower string-test 3.0201+-0.0676 3.0023+-0.0536 string-var-equality 35.1777+-1.2960 ? 35.5000+-1.6534 ? structure-hoist-over-transitions 2.8464+-0.3144 2.7013+-0.1285 might be 1.0537x faster substring-concat-weird 42.1429+-1.5862 ? 42.3613+-1.2920 ? substring-concat 44.4506+-0.6594 ? 45.2700+-1.7799 ? might be 1.0184x slower substring 50.9342+-1.9239 48.7130+-0.9766 might be 1.0456x faster switch-char-constant 2.8702+-0.2039 2.8126+-0.0924 might be 1.0205x faster switch-char 7.1647+-0.9895 6.8535+-0.7762 might be 1.0454x faster switch-constant 8.0011+-0.1447 ? 8.2594+-0.2242 ? might be 1.0323x slower switch-string-basic-big-var 18.5733+-0.4846 ? 18.7262+-0.7000 ? switch-string-basic-big 15.1267+-0.2544 14.8735+-0.1081 might be 1.0170x faster switch-string-basic-var 15.2437+-0.5006 ? 15.2782+-0.4442 ? switch-string-basic 13.8925+-0.2909 ? 14.0035+-0.3449 ? switch-string-big-length-tower-var 22.0644+-4.4160 20.6120+-0.2261 might be 1.0705x faster switch-string-length-tower-var 16.2492+-1.6432 15.7633+-0.3332 might be 1.0308x faster switch-string-length-tower 13.7802+-1.1728 13.1676+-0.1901 might be 1.0465x faster switch-string-short 13.4786+-1.0207 13.1995+-0.2405 might be 1.0211x faster switch 11.9593+-0.1626 ! 12.3039+-0.1797 ! definitely 1.0288x slower tear-off-arguments-simple 3.5521+-0.3023 3.4054+-0.0293 might be 1.0431x faster tear-off-arguments 4.6705+-0.1952 4.6121+-0.0720 might be 1.0126x faster temporal-structure 12.2968+-0.2986 ? 12.3464+-0.1411 ? to-int32-boolean 14.3273+-1.0445 14.3192+-0.2811 try-catch-get-by-val-cloned-arguments 14.2920+-0.2109 ! 14.9113+-0.2812 ! definitely 1.0433x slower try-catch-get-by-val-direct-arguments 6.4448+-0.1721 ? 6.8330+-0.9406 ? might be 1.0602x slower try-catch-get-by-val-scoped-arguments 8.6464+-1.3469 7.6858+-0.6264 might be 1.1250x faster typed-array-get-set-by-val-profiling 28.5802+-0.7759 27.8738+-0.6227 might be 1.0253x faster undefined-property-access 348.4008+-14.9946 346.1859+-4.6793 undefined-test 3.1840+-0.1294 3.1286+-0.0957 might be 1.0177x faster unprofiled-licm 22.7118+-0.1355 ? 23.3580+-0.8449 ? might be 1.0285x slower varargs-call 15.2708+-0.8350 ? 15.3372+-0.8999 ? varargs-construct-inline 28.5618+-1.2666 28.1510+-1.4714 might be 1.0146x faster varargs-construct 22.2691+-0.6037 ? 22.4684+-0.3555 ? varargs-inline 9.4354+-0.1684 ? 9.7201+-0.7012 ? might be 1.0302x slower varargs-strict-mode 10.3371+-0.3616 10.1779+-0.1281 might be 1.0156x faster varargs 10.1707+-0.3064 10.0124+-0.0636 might be 1.0158x faster weird-inlining-const-prop 3.2585+-0.1974 3.2266+-0.1422 <geometric> 9.1972+-0.0262 ? 9.1992+-0.0484 ? might be 1.0002x slower TipOfTree KillFragile AsmBench: bigfib.cpp 503.1381+-1.9663 503.0874+-1.8400 cray.c 434.1497+-6.7057 432.7891+-3.5702 dry.c 497.1062+-24.3499 484.9703+-7.7320 might be 1.0250x faster FloatMM.c 722.3258+-1.1890 ? 722.7931+-2.9430 ? gcc-loops.cpp 4100.3635+-10.6698 ? 4107.5069+-19.2818 ? n-body.c 975.2502+-6.9370 975.1615+-4.3094 Quicksort.c 424.3606+-5.9779 ? 425.5798+-8.5908 ? stepanov_container.cpp 3630.8795+-47.4893 ? 3905.0840+-788.0100 ? might be 1.0755x slower Towers.c 258.9187+-5.4771 256.1815+-0.3897 might be 1.0107x faster <geometric> 793.6923+-5.5677 ? 796.2095+-15.3297 ? might be 1.0032x slower TipOfTree KillFragile CompressionBench: huffman 256.2840+-2.5448 254.4128+-4.0414 arithmetic-simple 339.6688+-4.6325 336.7405+-3.1863 arithmetic-precise 280.3256+-8.5690 ? 284.9015+-13.2448 ? might be 1.0163x slower arithmetic-complex-precise 274.5852+-1.6576 ? 277.4342+-3.3463 ? might be 1.0104x slower arithmetic-precise-order-0 347.9025+-4.5894 346.2756+-3.9645 arithmetic-precise-order-1 334.8490+-13.0501 ? 337.6881+-18.4019 ? arithmetic-precise-order-2 368.3077+-6.3634 ? 378.2010+-29.0458 ? might be 1.0269x slower arithmetic-simple-order-1 398.8512+-6.0499 ? 401.0932+-2.3577 ? arithmetic-simple-order-2 452.5039+-23.8773 ? 467.1750+-30.7293 ? might be 1.0324x slower lz-string 349.5501+-27.4781 334.9349+-55.5408 might be 1.0436x faster <geometric> 335.5017+-4.9465 ? 336.4103+-8.6828 ? might be 1.0027x slower TipOfTree KillFragile Geomean of preferred means: <scaled-result> 61.4454+-0.1858 ? 61.8571+-0.6300 ? might be 1.0067x slower
Filip Pizlo
Comment 9
2015-07-04 20:07:18 PDT
And the second report. The "maybe slower" results on SunSpider, Octane, and Kraken scared me so I ran those for more samples. It doesn't seem to be a real slow-down. Benchmark report for SunSpider, Octane, and Kraken on dethklok (MacBookPro9,1). VMs tested: "TipOfTree" at /Volumes/Data/pizlo/secondary/OpenSource/WebKitBuild/Release/jsc (
r186271
) "KillFragile" at /Volumes/Data/pizlo/tertiary/OpenSource/WebKitBuild/Release/jsc (
r186271
) Collected 10 samples per benchmark/VM, with 10 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 KillFragile SunSpider: 3d-cube 5.1293+-0.0442 ? 5.2465+-0.1316 ? might be 1.0228x slower 3d-morph 5.7951+-0.1085 5.7557+-0.0958 3d-raytrace 6.4439+-0.0407 ? 6.4597+-0.0772 ? access-binary-trees 2.4223+-0.0786 2.3714+-0.0344 might be 1.0215x faster access-fannkuch 6.1557+-0.0517 ? 6.1691+-0.0474 ? access-nbody 2.9227+-0.0792 ? 2.9714+-0.1578 ? might be 1.0167x slower access-nsieve 3.4820+-0.0585 3.4099+-0.0321 might be 1.0211x faster bitops-3bit-bits-in-byte 1.6385+-0.0484 1.6215+-0.0379 might be 1.0104x faster bitops-bits-in-byte 3.8623+-0.1720 3.7648+-0.1152 might be 1.0259x faster bitops-bitwise-and 2.1984+-0.0722 2.1878+-0.0657 bitops-nsieve-bits 3.3171+-0.1228 3.2506+-0.0244 might be 1.0205x faster controlflow-recursive 2.9163+-0.1943 ? 2.9672+-0.0932 ? might be 1.0174x slower crypto-aes 4.5993+-0.1610 ? 4.6437+-0.1389 ? crypto-md5 2.7903+-0.0624 2.7326+-0.0574 might be 1.0211x faster crypto-sha1 3.8042+-0.1603 ? 3.9509+-0.2498 ? might be 1.0386x slower date-format-tofte 9.3351+-0.1104 ? 9.3712+-0.0750 ? date-format-xparb 5.5909+-0.1190 ? 5.6083+-0.0934 ? math-cordic 3.0812+-0.0445 ? 3.1395+-0.0605 ? might be 1.0189x slower math-partial-sums 5.5950+-0.4002 5.4566+-0.1468 might be 1.0254x faster math-spectral-norm 2.0889+-0.0652 ? 2.1359+-0.0836 ? might be 1.0225x slower regexp-dna 7.7418+-0.4260 ? 7.8222+-0.5664 ? might be 1.0104x slower string-base64 5.2304+-0.4408 ? 5.3036+-0.4575 ? might be 1.0140x slower string-fasta 6.7334+-0.0883 6.6701+-0.0430 string-tagcloud 10.2324+-0.4026 ? 10.4727+-0.4453 ? might be 1.0235x slower string-unpack-code 20.7005+-0.5495 ? 21.0774+-0.9380 ? might be 1.0182x slower string-validate-input 5.8569+-0.0840 ! 6.0503+-0.0925 ! definitely 1.0330x slower <arithmetic> 5.3717+-0.0415 ? 5.4081+-0.0586 ? might be 1.0068x slower TipOfTree KillFragile Octane: encrypt 0.19896+-0.00378 0.19717+-0.00218 decrypt 3.29929+-0.01251 ? 3.31996+-0.03442 ? deltablue x2 0.18825+-0.00115 ? 0.18925+-0.00104 ? earley 0.35339+-0.01600 0.34733+-0.00190 might be 1.0174x faster boyer 5.10765+-0.02175 ? 5.15394+-0.14331 ? navier-stokes x2 5.14554+-0.01582 5.14547+-0.02716 raytrace x2 1.29973+-0.03262 ? 1.30358+-0.02636 ? richards x2 0.12794+-0.00127 ? 0.12863+-0.00123 ? splay x2 0.40407+-0.00270 ^ 0.39805+-0.00174 ^ definitely 1.0151x faster regexp x2 29.01224+-0.18441 ! 29.50007+-0.29002 ! definitely 1.0168x slower pdfjs x2 43.40926+-0.29495 43.12008+-0.33860 mandreel x2 50.55601+-0.22013 ? 50.78135+-0.14937 ? gbemu x2 43.60232+-1.74862 43.07001+-1.49889 might be 1.0124x faster closure 0.63105+-0.00419 ^ 0.62312+-0.00365 ^ definitely 1.0127x faster jquery 8.14471+-0.06003 8.07440+-0.07629 box2d x2 11.92097+-0.03301 11.87842+-0.06024 zlib x2 405.13209+-2.40868 400.24526+-8.69643 might be 1.0122x faster typescript x2 820.05754+-9.74306 ? 830.07786+-8.68243 ? might be 1.0122x slower <geometric> 6.55202+-0.02877 6.54404+-0.02757 might be 1.0012x faster TipOfTree KillFragile Kraken: ai-astar 224.504+-3.281 ? 225.628+-2.848 ? audio-beat-detection 83.596+-0.915 82.752+-0.976 might be 1.0102x faster audio-dft 121.407+-3.316 120.299+-2.357 audio-fft 70.585+-1.219 70.039+-2.274 audio-oscillator 77.222+-1.221 ? 78.095+-1.136 ? might be 1.0113x slower imaging-darkroom 106.485+-1.919 105.591+-1.560 imaging-desaturate 61.390+-0.907 ? 62.295+-1.916 ? might be 1.0147x slower imaging-gaussian-blur 109.364+-1.520 ? 110.620+-2.804 ? might be 1.0115x slower json-parse-financial 48.934+-1.483 ? 49.555+-1.825 ? might be 1.0127x slower json-stringify-tinderbox 29.925+-1.187 29.185+-1.148 might be 1.0254x faster stanford-crypto-aes 59.159+-1.897 58.974+-0.538 stanford-crypto-ccm 49.101+-0.873 ? 50.762+-2.074 ? might be 1.0338x slower stanford-crypto-pbkdf2 105.320+-0.966 ! 108.326+-1.856 ! definitely 1.0285x slower stanford-crypto-sha256-iterative 42.899+-1.254 42.317+-1.269 might be 1.0137x faster <arithmetic> 84.992+-0.691 ? 85.317+-0.613 ? might be 1.0038x slower TipOfTree KillFragile Geomean of preferred means: <scaled-result> 14.4082+-0.0639 ? 14.4531+-0.0731 ? might be 1.0031x slower
Mark Lam
Comment 10
2015-07-07 11:40:41 PDT
Comment on
attachment 256165
[details]
probably done View in context:
https://bugs.webkit.org/attachment.cgi?id=256165&action=review
r=me with fixes.
> Source/JavaScriptCore/ChangeLog:16 > + found at least one case where the compiler did use the value, but never strengthene
typo: strengthene ==> strengthened
> Source/JavaScriptCore/ChangeLog:47 > + inside the loop, which is both efficient (yay constant folding!) and necesary
typo: necesary ==> necessary
> Source/JavaScriptCore/dfg/DFGFrozenValue.h:94 > + // The strength of the value itself. The structure is almost always weak.
By "The structure is almost always weak”, did you mean "The strength is almost always weak”?
> Source/JavaScriptCore/dfg/DFGValidate.cpp:257 > + case JSConstant: > + VALIDATE((node), !node->constant()->pointsToHeap() || node->constant()->strength() >= WeakValue); > + break;
Is this still meaningful? All DFGValueStrength values are >= WeakValue.
Radar WebKit Bug Importer
Comment 11
2015-07-10 12:10:43 PDT
<
rdar://problem/21771059
>
Filip Pizlo
Comment 12
2015-07-10 14:19:16 PDT
(In reply to
comment #10
)
> Comment on
attachment 256165
[details]
> probably done > > View in context: >
https://bugs.webkit.org/attachment.cgi?id=256165&action=review
> > r=me with fixes. > > > Source/JavaScriptCore/ChangeLog:16 > > + found at least one case where the compiler did use the value, but never strengthene > > typo: strengthene ==> strengthened
Fixed.
> > > Source/JavaScriptCore/ChangeLog:47 > > + inside the loop, which is both efficient (yay constant folding!) and necesary > > typo: necesary ==> necessary
Fixed.
> > > Source/JavaScriptCore/dfg/DFGFrozenValue.h:94 > > + // The strength of the value itself. The structure is almost always weak. > > By "The structure is almost always weak”, did you mean "The strength is > almost always weak”?
No, I meant structure. A frozen value is a tuple that contains the value itself and the value's structure. The strength() method returns the strength of the value itself. The structure, on the other hand, has a strength that is selected by a different mechanism, and it's almost always weak.
> > > Source/JavaScriptCore/dfg/DFGValidate.cpp:257 > > + case JSConstant: > > + VALIDATE((node), !node->constant()->pointsToHeap() || node->constant()->strength() >= WeakValue); > > + break; > > Is this still meaningful? All DFGValueStrength values are >= WeakValue.
Nope, not meaningful. I removed it.
Filip Pizlo
Comment 13
2015-07-10 14:21:32 PDT
Landed in
http://trac.webkit.org/changeset/186691
Note
You need to
log in
before you can comment on or make changes to this bug.
Top of Page
Format For Printing
XML
Clone This Bug