Bug 146602 - DFG fragile frozen values are fundamentally broken
Summary: DFG fragile frozen values are fundamentally broken
Status: RESOLVED FIXED
Alias: None
Product: WebKit
Classification: Unclassified
Component: JavaScriptCore (show other bugs)
Version: 528+ (Nightly build)
Hardware: All All
: P2 Normal
Assignee: Filip Pizlo
URL:
Keywords: InRadar
Depends on:
Blocks:
 
Reported: 2015-07-03 23:09 PDT by Filip Pizlo
Modified: 2015-07-10 14:21 PDT (History)
14 users (show)

See Also:


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

Note You need to log in before you can comment on or make changes to this bug.
Description Filip Pizlo 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.
Comment 1 Filip Pizlo 2015-07-03 23:10:45 PDT
Created attachment 256137 [details]
work towards finding the issue
Comment 2 Filip Pizlo 2015-07-04 12:46:39 PDT
Created attachment 256156 [details]
more
Comment 3 Filip Pizlo 2015-07-04 13:14:38 PDT
Created attachment 256158 [details]
validation is written

It might make it easier to catch these bugs.
Comment 4 Filip Pizlo 2015-07-04 13:56:46 PDT
Created attachment 256160 [details]
more

Running tests now.
Comment 5 Filip Pizlo 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
Comment 6 Filip Pizlo 2015-07-04 19:18:10 PDT
Created attachment 256165 [details]
probably done

Still need to do some perf testing.
Comment 7 WebKit Commit Bot 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.
Comment 8 Filip Pizlo 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
Comment 9 Filip Pizlo 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
Comment 10 Mark Lam 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.
Comment 11 Radar WebKit Bug Importer 2015-07-10 12:10:43 PDT
<rdar://problem/21771059>
Comment 12 Filip Pizlo 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.
Comment 13 Filip Pizlo 2015-07-10 14:21:32 PDT
Landed in http://trac.webkit.org/changeset/186691