[JSC] Add basic DFG/FTL support for Math.round
Created attachment 252562 [details] Patch
Comment on attachment 252562 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=252562&action=review > Source/JavaScriptCore/tests/stress/math-round-basics.js:21 > +for (var i = 1; i < 1e7; ++i) { Note to self: change all the 1e7 to 1e4 before landing.
Comment on attachment 252562 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=252562&action=review > Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h:771 > + if (node->result() == NodeResultInt32) Please use an OpInfo to convey this. We currently don't use NodeResult for this purpose. We probably could, but it's not how we do this elsewhere. Look at the ArithMode that a lot of other Arith* ops use. Maybe you can just adopt that?
Created attachment 252575 [details] Patch
Conf#1 Conf#2 SunSpider: 3d-cube 4.1408+-0.1538 4.0276+-0.1259 might be 1.0281x faster 3d-morph 4.8290+-0.2785 ? 5.0485+-0.8525 ? might be 1.0455x slower 3d-raytrace 4.7953+-0.0668 ? 5.0070+-0.1707 ? might be 1.0441x slower access-binary-trees 1.8532+-0.0437 1.8175+-0.0575 might be 1.0196x faster access-fannkuch 4.8389+-0.0320 ? 4.8873+-0.2649 ? access-nbody 2.3209+-0.2143 2.2186+-0.0189 might be 1.0461x faster access-nsieve 2.9828+-0.2532 2.9258+-0.0861 might be 1.0195x faster bitops-3bit-bits-in-byte 1.3005+-0.0642 ? 1.3358+-0.0813 ? might be 1.0271x slower bitops-bits-in-byte 3.2125+-0.2960 ? 3.3729+-0.2112 ? might be 1.0499x slower bitops-bitwise-and 2.0087+-0.5399 1.7947+-0.0220 might be 1.1192x faster bitops-nsieve-bits 2.8845+-0.8473 2.6803+-0.1700 might be 1.0762x faster controlflow-recursive 1.9271+-0.3576 ? 1.9525+-0.1982 ? might be 1.0132x slower crypto-aes 3.4355+-0.2600 3.4088+-0.1603 crypto-md5 2.3564+-0.4712 2.3140+-0.1180 might be 1.0184x faster crypto-sha1 2.3710+-0.3813 2.1962+-0.2614 might be 1.0796x faster date-format-tofte 6.3610+-0.2712 ? 6.9952+-0.8896 ? might be 1.0997x slower date-format-xparb 4.5204+-0.4078 4.3065+-0.1562 might be 1.0497x faster math-cordic 2.5794+-0.0978 ? 2.6075+-0.1006 ? might be 1.0109x slower math-partial-sums 3.9824+-0.0925 ? 4.2279+-0.7474 ? might be 1.0616x slower math-spectral-norm 1.6602+-0.0723 ? 1.7245+-0.2965 ? might be 1.0387x slower regexp-dna 5.7232+-0.2834 ? 6.0850+-0.6615 ? might be 1.0632x slower string-base64 3.8460+-0.4509 3.7258+-0.2409 might be 1.0323x faster string-fasta 5.2444+-0.1163 ? 5.3200+-0.2242 ? might be 1.0144x slower string-tagcloud 7.7955+-0.4066 7.5438+-0.1482 might be 1.0334x faster string-unpack-code 18.3552+-2.2503 17.8423+-0.9125 might be 1.0287x faster string-validate-input 4.0030+-0.1147 3.9822+-0.0517 <arithmetic> 4.2049+-0.0894 ? 4.2057+-0.0697 ? might be 1.0002x slower Conf#1 Conf#2 LongSpider: 3d-cube 742.0926+-6.2050 ? 748.6735+-1.4699 ? 3d-morph 1441.7476+-1.2056 ? 1443.6202+-3.6666 ? 3d-raytrace 625.7559+-0.8364 ? 626.2554+-1.3328 ? access-binary-trees 910.2609+-22.9322 ? 918.5071+-10.6800 ? access-fannkuch 250.7925+-10.5322 247.9307+-6.3436 might be 1.0115x faster access-nbody 519.2402+-2.5508 ? 521.3293+-1.9713 ? access-nsieve 478.1918+-14.2554 473.7713+-4.5105 bitops-3bit-bits-in-byte 38.9532+-1.5190 38.1597+-0.4094 might be 1.0208x faster bitops-bits-in-byte 68.2141+-3.5217 ? 69.2349+-3.0288 ? might be 1.0150x slower bitops-nsieve-bits 372.9376+-2.1016 ? 373.1197+-0.8348 ? controlflow-recursive 438.1106+-1.6255 429.1138+-15.3511 might be 1.0210x faster crypto-aes 539.0515+-4.0504 ? 540.9770+-12.4616 ? crypto-md5 464.2847+-6.1039 455.7278+-14.1588 might be 1.0188x faster crypto-sha1 544.1443+-17.1713 ? 546.0656+-17.2581 ? date-format-tofte 486.2997+-9.5814 ? 493.7668+-12.9947 ? might be 1.0154x slower date-format-xparb 614.8380+-10.5116 604.2457+-5.0432 might be 1.0175x faster hash-map 147.1874+-4.6784 ? 165.6903+-49.0994 ? might be 1.1257x slower math-cordic 473.6155+-0.8228 ? 474.5190+-2.0292 ? math-partial-sums 402.8023+-2.4723 ^ 398.3118+-0.5093 ^ definitely 1.0113x faster math-spectral-norm 529.7989+-2.0975 529.5065+-0.5446 string-base64 321.1147+-1.9659 320.8398+-3.8377 string-fasta 356.5018+-3.1154 ? 358.2148+-5.3363 ? string-tagcloud 169.4116+-2.0863 169.3607+-1.2258 <geometric> 378.1451+-2.0365 ? 379.2141+-4.9575 ? might be 1.0028x slower Conf#1 Conf#2 V8Spider: crypto 48.5956+-0.7492 47.2966+-2.3150 might be 1.0275x faster deltablue 81.5040+-8.0517 78.2980+-9.4841 might be 1.0409x faster earley-boyer 37.7719+-1.8089 37.5505+-0.9757 raytrace 29.8913+-2.3763 29.0375+-1.5596 might be 1.0294x faster regexp 66.0854+-2.4834 ? 66.4735+-6.2305 ? richards 74.1684+-4.6052 67.4373+-4.0951 might be 1.0998x faster splay 36.6972+-3.1347 ? 36.7380+-2.6863 ? <geometric> 50.1832+-1.6333 48.8375+-2.1782 might be 1.0276x faster Conf#1 Conf#2 Octane: encrypt 0.18806+-0.00181 ? 0.18836+-0.00155 ? decrypt 3.24250+-0.02470 ? 3.27323+-0.05516 ? deltablue x2 0.15486+-0.00602 0.15431+-0.00241 earley 0.44752+-0.00927 0.43919+-0.00905 might be 1.0190x faster boyer 5.68789+-0.07786 5.62806+-0.06387 might be 1.0106x faster navier-stokes x2 4.82803+-0.01536 ? 4.83638+-0.02194 ? raytrace x2 1.10704+-0.02818 1.03943+-0.09239 might be 1.0651x faster richards x2 0.08731+-0.00099 ? 0.08807+-0.00110 ? splay x2 0.39588+-0.00676 ? 0.40022+-0.00880 ? might be 1.0110x slower regexp x2 27.04717+-1.26738 26.96558+-0.57982 pdfjs x2 37.08901+-0.90512 36.51697+-0.78912 might be 1.0157x faster mandreel x2 42.85548+-0.82111 42.30857+-0.50992 might be 1.0129x faster gbemu x2 31.27731+-0.43313 30.98388+-0.40018 closure 0.45630+-0.00151 ? 0.45999+-0.00713 ? jquery 5.64665+-0.04966 ? 5.65332+-0.01967 ? box2d x2 9.80045+-0.22828 9.70455+-0.08865 zlib x2 365.98088+-7.60072 355.77212+-26.12710 might be 1.0287x faster typescript x2 653.52350+-21.57603 ? 668.55707+-32.34518 ? might be 1.0230x slower <geometric> 5.62825+-0.04750 5.58802+-0.02906 might be 1.0072x faster Conf#1 Conf#2 Kraken: ai-astar 394.653+-18.956 ^ 286.637+-9.304 ^ definitely 1.3768x faster audio-beat-detection 93.189+-1.486 92.837+-0.733 audio-dft 99.570+-2.315 ? 101.089+-4.512 ? might be 1.0152x slower audio-fft 77.202+-0.354 ? 77.341+-0.292 ? audio-oscillator 171.940+-6.512 ^ 61.136+-1.465 ^ definitely 2.8124x faster imaging-darkroom 89.956+-1.418 ? 90.223+-1.107 ? imaging-desaturate 53.181+-4.543 52.268+-2.165 might be 1.0175x faster imaging-gaussian-blur 82.337+-2.067 81.076+-1.237 might be 1.0155x faster json-parse-financial 36.527+-1.276 35.209+-0.493 might be 1.0374x faster json-stringify-tinderbox 41.711+-0.986 41.298+-1.239 stanford-crypto-aes 51.029+-1.578 50.444+-1.555 might be 1.0116x faster stanford-crypto-ccm 46.250+-1.079 ? 47.291+-2.726 ? might be 1.0225x slower stanford-crypto-pbkdf2 116.369+-1.113 ^ 114.677+-0.443 ^ definitely 1.0148x faster stanford-crypto-sha256-iterative 43.652+-0.443 43.093+-1.236 might be 1.0130x faster <arithmetic> 99.826+-1.340 ^ 83.901+-1.001 ^ definitely 1.1898x faster Conf#1 Conf#2 JSRegress: abs-boolean 2.1707+-0.0391 ? 2.2059+-0.0651 ? might be 1.0162x slower adapt-to-double-divide 14.9608+-0.2445 ? 15.3970+-1.2129 ? might be 1.0292x slower aliased-arguments-getbyval 0.9788+-0.0727 0.9706+-0.0899 allocate-big-object 2.3665+-0.1130 ? 2.4035+-0.0896 ? might be 1.0157x slower arguments-named-and-reflective 9.9796+-0.2786 ? 10.1203+-0.2851 ? might be 1.0141x slower arguments-out-of-bounds 9.3035+-0.2992 ? 9.5052+-0.7641 ? might be 1.0217x slower arguments-strict-mode 8.7437+-0.7168 8.5001+-0.0935 might be 1.0287x faster arguments 7.6077+-0.2753 7.4965+-0.2800 might be 1.0148x faster arity-mismatch-inlining 0.7410+-0.0693 ? 0.7617+-0.1125 ? might be 1.0279x slower array-access-polymorphic-structure 5.6805+-0.3525 ? 5.7295+-0.3969 ? array-nonarray-polymorhpic-access 26.3643+-1.3444 26.2675+-2.1015 array-prototype-every 74.4895+-2.3182 72.1460+-1.6974 might be 1.0325x faster array-prototype-forEach 71.5989+-1.0636 71.1128+-1.6782 array-prototype-map 81.1539+-4.6785 77.8512+-3.0128 might be 1.0424x faster array-prototype-some 73.3917+-1.9823 ? 74.6633+-5.7543 ? might be 1.0173x slower array-splice-contiguous 38.0793+-0.5818 ? 38.7025+-1.4564 ? might be 1.0164x slower array-with-double-add 3.1910+-0.4039 ? 3.2274+-0.5017 ? might be 1.0114x slower array-with-double-increment 2.7560+-0.1725 2.7161+-0.0231 might be 1.0147x faster array-with-double-mul-add 3.7534+-0.0831 ? 3.8052+-0.2257 ? might be 1.0138x slower array-with-double-sum 3.0185+-0.4226 2.8887+-0.0476 might be 1.0449x faster array-with-int32-add-sub 5.3752+-0.0781 5.3067+-0.2354 might be 1.0129x faster array-with-int32-or-double-sum 2.8518+-0.0311 ? 2.8998+-0.0419 ? might be 1.0168x slower ArrayBuffer-DataView-alloc-large-long-lived 29.9050+-1.1446 ? 30.0977+-1.8736 ? ArrayBuffer-DataView-alloc-long-lived 11.6537+-0.6909 ? 11.8667+-0.3449 ? might be 1.0183x slower ArrayBuffer-Int32Array-byteOffset 3.3138+-0.0885 ? 3.4898+-0.3809 ? might be 1.0531x slower ArrayBuffer-Int8Array-alloc-large-long-lived 30.2892+-2.1806 ? 45.4797+-33.9094 ? might be 1.5015x slower ArrayBuffer-Int8Array-alloc-long-lived-buffer 19.8328+-1.0598 19.5480+-0.3432 might be 1.0146x faster ArrayBuffer-Int8Array-alloc-long-lived 10.9482+-0.2063 ? 11.3303+-0.9217 ? might be 1.0349x slower ArrayBuffer-Int8Array-alloc 9.4655+-0.3181 ? 9.7499+-0.5644 ? might be 1.0301x slower asmjs_bool_bug 6.9682+-0.8248 6.7121+-0.2364 might be 1.0382x faster assign-custom-setter-polymorphic 2.2917+-0.0479 2.2416+-0.0415 might be 1.0224x faster assign-custom-setter 3.0968+-0.0925 ? 3.2080+-0.2058 ? might be 1.0359x slower basic-set 7.8178+-1.3821 7.3928+-0.9171 might be 1.0575x faster big-int-mul 3.2222+-0.1583 3.1298+-0.0234 might be 1.0295x faster boolean-test 2.5367+-0.1253 2.5140+-0.0452 branch-fold 3.3301+-0.1599 3.2914+-0.0469 might be 1.0118x faster branch-on-string-as-boolean 13.7684+-0.4069 ? 13.8007+-0.7698 ? by-val-generic 6.9795+-0.8140 6.5595+-0.0893 might be 1.0640x faster call-spread-apply 26.6556+-3.1630 25.5533+-0.9641 might be 1.0431x faster call-spread-call 21.1185+-1.2235 20.4924+-0.6770 might be 1.0306x faster captured-assignments 0.3192+-0.0156 ? 0.3246+-0.0201 ? might be 1.0172x slower cast-int-to-double 4.3957+-0.0992 4.3669+-0.2977 cell-argument 5.6570+-0.0544 5.6190+-0.3151 cfg-simplify 2.4593+-0.0234 ? 2.5029+-0.1319 ? might be 1.0177x slower chain-getter-access 7.5379+-0.1469 7.5150+-0.1175 cmpeq-obj-to-obj-other 9.6130+-1.9721 ? 12.0886+-3.4838 ? might be 1.2575x slower constant-test 4.0902+-0.0727 ? 4.2035+-0.1620 ? might be 1.0277x slower create-lots-of-functions 10.7288+-0.2483 10.7117+-0.2308 DataView-custom-properties 34.1357+-1.4443 ? 34.8354+-2.1948 ? might be 1.0205x slower deconstructing-parameters-overridden-by-function 0.3622+-0.0299 ? 0.3767+-0.0554 ? might be 1.0399x slower delay-tear-off-arguments-strictmode 11.7769+-0.3293 11.6714+-0.1642 deltablue-varargs 149.9948+-5.8519 148.8525+-1.5563 destructuring-arguments 14.7909+-0.2301 14.7690+-0.5764 destructuring-swap 4.4656+-0.3919 ? 4.4686+-0.5351 ? direct-arguments-getbyval 0.9990+-0.0931 0.9937+-0.1043 div-boolean-double 5.1048+-0.3680 4.9713+-0.1325 might be 1.0269x faster div-boolean 7.6152+-0.1349 ? 7.6910+-0.1582 ? double-get-by-val-out-of-bounds 3.8902+-0.1048 ? 4.0157+-0.1354 ? might be 1.0323x slower double-pollution-getbyval 8.6411+-1.3076 8.2016+-0.2874 might be 1.0536x faster double-pollution-putbyoffset 3.4963+-0.0562 ? 3.7742+-0.8879 ? might be 1.0795x slower double-to-int32-typed-array-no-inline 1.9650+-0.0984 ? 2.0133+-0.3036 ? might be 1.0246x slower double-to-int32-typed-array 1.6549+-0.1376 1.5928+-0.0909 might be 1.0390x faster double-to-uint32-typed-array-no-inline 2.0097+-0.0780 1.9711+-0.1486 might be 1.0196x faster double-to-uint32-typed-array 1.6829+-0.2157 1.6038+-0.0827 might be 1.0493x faster elidable-new-object-dag 37.1661+-0.7730 ? 37.3814+-1.1081 ? elidable-new-object-roflcopter 39.4862+-1.3082 39.1473+-1.7006 elidable-new-object-then-call 31.8257+-4.7430 30.2048+-1.6187 might be 1.0537x faster elidable-new-object-tree 40.7846+-1.0998 40.3422+-1.6529 might be 1.0110x faster empty-string-plus-int 4.4610+-0.0841 ? 4.4715+-0.1468 ? emscripten-cube2hash 24.1464+-2.3437 ? 25.1727+-2.4360 ? might be 1.0425x slower exit-length-on-plain-object 11.5229+-0.0323 ? 11.5255+-0.2975 ? external-arguments-getbyval 0.9725+-0.0575 ? 0.9900+-0.0734 ? might be 1.0180x slower external-arguments-putbyval 1.9135+-0.1551 ? 1.9439+-0.1653 ? might be 1.0159x slower fixed-typed-array-storage-var-index 0.9724+-0.0145 ? 1.0333+-0.0627 ? might be 1.0627x slower fixed-typed-array-storage 0.7640+-0.0812 ? 0.7833+-0.1327 ? might be 1.0252x slower Float32Array-matrix-mult 3.5615+-0.1680 3.4761+-0.0939 might be 1.0245x faster Float32Array-to-Float64Array-set 44.3898+-0.8819 ? 44.8405+-0.5586 ? might be 1.0102x slower Float64Array-alloc-long-lived 63.2968+-2.1876 61.4168+-0.7875 might be 1.0306x faster Float64Array-to-Int16Array-set 53.2209+-1.4505 52.5873+-1.4437 might be 1.0120x faster fold-double-to-int 11.2084+-0.1455 ? 11.2532+-0.2173 ? fold-get-by-id-to-multi-get-by-offset-rare-int 9.7832+-0.7676 ? 10.0682+-0.5893 ? might be 1.0291x slower fold-get-by-id-to-multi-get-by-offset 8.4203+-0.5027 8.0818+-0.2958 might be 1.0419x faster fold-multi-get-by-offset-to-get-by-offset 8.2079+-1.2179 7.5118+-2.3483 might be 1.0927x faster fold-multi-get-by-offset-to-poly-get-by-offset 8.2023+-0.5107 7.8900+-1.3132 might be 1.0396x faster fold-multi-put-by-offset-to-poly-put-by-offset 6.6140+-2.2769 ? 7.1415+-1.4050 ? might be 1.0798x slower fold-multi-put-by-offset-to-put-by-offset 3.5494+-0.4411 3.5005+-0.3918 might be 1.0140x faster fold-multi-put-by-offset-to-replace-or-transition-put-by-offset 8.3168+-0.1272 8.1092+-0.3521 might be 1.0256x faster fold-put-by-id-to-multi-put-by-offset 8.4591+-0.1240 8.1842+-0.4866 might be 1.0336x faster fold-put-structure 4.3883+-0.8894 3.9022+-0.4871 might be 1.1246x faster for-of-iterate-array-entries 4.1708+-0.8784 3.8546+-0.2674 might be 1.0820x faster for-of-iterate-array-keys 2.9442+-0.1111 ? 3.0408+-0.2597 ? might be 1.0328x slower for-of-iterate-array-values 2.9077+-0.1185 ? 3.0927+-0.5521 ? might be 1.0636x slower fround 17.0254+-0.5693 16.8832+-0.8294 ftl-library-inlining-dataview 55.3542+-1.8304 54.8253+-1.2813 ftl-library-inlining 104.3007+-1.9121 104.0242+-0.6178 function-dot-apply 1.5593+-0.1843 1.4932+-0.0665 might be 1.0442x faster function-test 2.6245+-0.5554 2.4208+-0.0417 might be 1.0842x faster function-with-eval 89.4238+-1.5689 ? 90.6534+-9.3003 ? might be 1.0137x slower gcse-poly-get-less-obvious 13.4318+-0.1460 ? 13.5419+-0.9975 ? gcse-poly-get 15.2101+-0.4316 13.5820+-1.4045 might be 1.1199x faster gcse 3.4615+-0.0867 ? 3.4977+-0.1152 ? might be 1.0105x slower get-by-id-bimorphic-check-structure-elimination-simple 2.3269+-0.0175 ? 2.3625+-0.1076 ? might be 1.0153x slower get-by-id-bimorphic-check-structure-elimination 5.4736+-0.2125 ? 5.5251+-1.0522 ? get-by-id-chain-from-try-block 6.0765+-0.5667 ? 6.1981+-0.6636 ? might be 1.0200x slower get-by-id-check-structure-elimination 4.0150+-0.2311 ? 4.0515+-0.2335 ? get-by-id-proto-or-self 12.6577+-0.3821 ? 13.0318+-0.5290 ? might be 1.0296x slower get-by-id-quadmorphic-check-structure-elimination-simple 2.7283+-0.2481 2.6121+-0.0292 might be 1.0445x faster get-by-id-self-or-proto 13.4865+-0.5841 ? 13.6916+-0.4031 ? might be 1.0152x slower get-by-val-out-of-bounds 3.7668+-0.0999 ? 3.8310+-0.0737 ? might be 1.0170x slower get_callee_monomorphic 2.6112+-0.1780 ? 2.6520+-0.1272 ? might be 1.0156x slower get_callee_polymorphic 3.1920+-0.3127 3.0980+-0.2279 might be 1.0303x faster getter-no-activation 4.9032+-0.4013 ? 5.0738+-0.4276 ? might be 1.0348x slower getter-richards 113.4353+-5.2670 112.8447+-4.8488 getter 5.7241+-0.8872 5.1642+-0.5850 might be 1.1084x faster global-var-const-infer-fire-from-opt 0.8569+-0.1929 0.8132+-0.0774 might be 1.0538x faster global-var-const-infer 0.6580+-0.0687 ? 0.7058+-0.0321 ? might be 1.0726x slower HashMap-put-get-iterate-keys 25.5944+-1.7445 ? 26.8098+-3.5296 ? might be 1.0475x slower HashMap-put-get-iterate 27.6923+-3.2380 26.1259+-1.3076 might be 1.0600x faster HashMap-string-put-get-iterate 25.0150+-0.7988 ? 25.5265+-2.1316 ? might be 1.0204x slower hoist-make-rope 8.3896+-1.0298 ? 9.3361+-0.7858 ? might be 1.1128x slower hoist-poly-check-structure-effectful-loop 3.8001+-0.1741 3.7828+-0.2115 hoist-poly-check-structure 3.0587+-0.1156 2.9454+-0.0369 might be 1.0385x faster imul-double-only 6.1921+-0.1695 ? 6.7007+-0.6829 ? might be 1.0821x slower imul-int-only 7.3465+-0.6455 ? 7.3607+-0.3277 ? imul-mixed 5.8228+-0.6710 5.8026+-0.3281 in-four-cases 14.3038+-0.4504 ? 14.6633+-1.0914 ? might be 1.0251x slower in-one-case-false 8.0408+-0.4386 ? 8.0644+-0.7126 ? in-one-case-true 8.2823+-1.1438 8.2745+-1.7483 in-two-cases 8.2083+-0.4324 ? 8.3016+-0.4569 ? might be 1.0114x slower indexed-properties-in-objects 2.6780+-0.5483 2.5317+-0.0947 might be 1.0578x faster infer-closure-const-then-mov-no-inline 2.9228+-0.0242 2.9077+-0.0437 infer-closure-const-then-mov 15.2515+-0.3419 ? 15.5440+-0.5407 ? might be 1.0192x slower infer-closure-const-then-put-to-scope-no-inline 10.0257+-0.7936 9.7704+-0.2326 might be 1.0261x faster infer-closure-const-then-put-to-scope 20.9005+-2.0851 20.0665+-0.6853 might be 1.0416x faster infer-closure-const-then-reenter-no-inline 45.6380+-1.5487 ? 45.6658+-1.5421 ? infer-closure-const-then-reenter 20.3535+-0.1657 20.1694+-0.3476 infer-constant-global-property 28.2578+-0.9717 28.1545+-0.6691 infer-constant-property 2.3542+-0.1386 2.3322+-0.0355 infer-one-time-closure-ten-vars 7.5142+-0.3343 ? 7.5958+-0.3031 ? might be 1.0109x slower infer-one-time-closure-two-vars 7.1171+-0.0395 ? 7.3277+-0.5174 ? might be 1.0296x slower infer-one-time-closure 7.2236+-0.2996 7.2191+-0.3326 infer-one-time-deep-closure 11.9421+-0.8327 ? 12.3832+-1.1461 ? might be 1.0369x slower inline-arguments-access 3.8728+-0.2725 ? 4.0796+-0.4238 ? might be 1.0534x slower inline-arguments-aliased-access 3.7840+-0.1797 3.7528+-0.0785 inline-arguments-local-escape 4.1345+-0.5682 3.9146+-0.2381 might be 1.0562x faster inline-get-scoped-var 4.5453+-0.3100 ? 4.7855+-0.1326 ? might be 1.0529x slower inlined-put-by-id-transition 10.8926+-0.5313 ? 10.9107+-0.4387 ? int-or-other-abs-then-get-by-val 3.8561+-0.1046 ? 4.1108+-0.6229 ? might be 1.0661x slower int-or-other-abs-zero-then-get-by-val 15.0338+-0.7155 14.7530+-0.2031 might be 1.0190x faster int-or-other-add-then-get-by-val 3.6936+-0.0981 ? 3.8492+-0.2109 ? might be 1.0421x slower int-or-other-add 4.5243+-0.0937 ? 4.5733+-0.0723 ? might be 1.0108x slower int-or-other-div-then-get-by-val 3.4083+-0.1668 ? 3.5550+-0.2938 ? might be 1.0430x slower int-or-other-max-then-get-by-val 3.5591+-0.0510 3.5114+-0.2419 might be 1.0136x faster int-or-other-min-then-get-by-val 3.6993+-0.1471 ? 3.8854+-0.4623 ? might be 1.0503x slower int-or-other-mod-then-get-by-val 3.4073+-0.3753 3.1743+-0.1261 might be 1.0734x faster int-or-other-mul-then-get-by-val 3.3234+-0.2592 3.1547+-0.0675 might be 1.0535x faster int-or-other-neg-then-get-by-val 3.6777+-0.2503 ? 3.7334+-0.2488 ? might be 1.0151x slower int-or-other-neg-zero-then-get-by-val 14.7737+-0.3340 14.7569+-0.4032 int-or-other-sub-then-get-by-val 3.6284+-0.0425 ? 3.8123+-0.2697 ? might be 1.0507x slower int-or-other-sub 3.0503+-0.0891 ? 3.1030+-0.5057 ? might be 1.0173x slower int-overflow-local 3.5140+-0.1998 3.3987+-0.0697 might be 1.0339x faster Int16Array-alloc-long-lived 44.7080+-1.0773 44.2729+-2.5796 Int16Array-bubble-sort-with-byteLength 16.5726+-0.8970 ? 16.5844+-1.5458 ? Int16Array-bubble-sort 15.5959+-0.6807 ? 15.7161+-0.9000 ? Int16Array-load-int-mul 1.2321+-0.0063 ? 1.2517+-0.0441 ? might be 1.0159x slower Int16Array-to-Int32Array-set 41.2156+-3.5637 41.0414+-1.8321 Int32Array-alloc-large 11.1010+-0.4580 ? 11.2252+-1.0276 ? might be 1.0112x slower Int32Array-alloc-long-lived 48.6909+-1.2204 ? 49.6205+-1.5392 ? might be 1.0191x slower Int32Array-alloc 2.8950+-0.0689 ? 3.0235+-0.2435 ? might be 1.0444x slower Int32Array-Int8Array-view-alloc 5.7628+-0.1169 ? 5.8920+-0.1278 ? might be 1.0224x slower int52-spill 5.4438+-0.2175 ? 5.6097+-0.4728 ? might be 1.0305x slower Int8Array-alloc-long-lived 38.7594+-1.5162 ? 39.1125+-2.1541 ? Int8Array-load-with-byteLength 3.0244+-0.0729 ? 3.0392+-0.1216 ? Int8Array-load 3.0805+-0.0764 3.0081+-0.0690 might be 1.0241x faster integer-divide 9.2883+-0.7360 ? 9.3298+-0.0706 ? integer-modulo 1.5623+-0.1488 ? 1.5735+-0.0722 ? is-boolean-fold-tricky 3.4228+-0.1070 3.4085+-0.1086 is-boolean-fold 2.3828+-0.1037 ? 2.4297+-0.2425 ? might be 1.0197x slower is-function-fold-tricky-internal-function 9.5034+-0.7941 9.0765+-0.2419 might be 1.0470x faster is-function-fold-tricky 3.7399+-0.2312 ? 3.7572+-0.1078 ? is-function-fold 2.4930+-0.2062 ? 2.6176+-0.6188 ? might be 1.0500x slower is-number-fold-tricky 3.7845+-0.4448 3.6795+-0.1799 might be 1.0285x faster is-number-fold 2.4998+-0.3696 2.3650+-0.0516 might be 1.0570x faster is-object-or-null-fold-functions 2.5558+-0.5516 2.4266+-0.0672 might be 1.0532x faster is-object-or-null-fold-less-tricky 3.6617+-0.0234 ? 3.9813+-0.4931 ? might be 1.0873x slower is-object-or-null-fold-tricky 4.8658+-0.2274 ? 4.9384+-0.4873 ? might be 1.0149x slower is-object-or-null-fold 2.3505+-0.0195 ? 2.3721+-0.0176 ? is-object-or-null-trickier-function 3.7864+-0.1979 ? 3.9188+-0.5193 ? might be 1.0350x slower is-object-or-null-trickier-internal-function 9.6810+-0.3789 ? 10.0200+-1.3901 ? might be 1.0350x slower is-object-or-null-tricky-function 3.7424+-0.2150 ? 3.7600+-0.1263 ? is-object-or-null-tricky-internal-function 7.2961+-0.7081 7.1132+-0.1167 might be 1.0257x faster is-string-fold-tricky 3.6204+-0.0661 ? 3.6423+-0.0676 ? is-string-fold 2.3476+-0.0220 ? 2.5370+-0.3832 ? might be 1.0807x slower is-undefined-fold-tricky 2.9507+-0.0127 ? 2.9777+-0.0232 ? is-undefined-fold 2.4963+-0.4662 ? 2.5267+-0.2914 ? might be 1.0122x slower large-int-captured 4.0579+-0.2811 4.0442+-0.2365 large-int-neg 13.4100+-0.2363 13.3930+-0.2713 large-int 12.6317+-0.3122 ? 13.3435+-0.9117 ? might be 1.0563x slower logical-not 3.6992+-0.0812 3.6312+-0.1752 might be 1.0187x faster lots-of-fields 9.5557+-0.1845 9.3506+-0.2083 might be 1.0219x faster make-indexed-storage 2.5885+-0.0849 ? 2.6447+-0.1465 ? might be 1.0217x slower make-rope-cse 4.3372+-0.0793 ? 4.8917+-1.2945 ? might be 1.1278x slower marsaglia-larger-ints 30.6463+-2.0049 ? 30.7347+-1.3156 ? marsaglia-osr-entry 19.5237+-0.4422 ? 20.2422+-1.3112 ? might be 1.0368x slower max-boolean 2.4637+-0.1338 2.4388+-0.0373 might be 1.0102x faster method-on-number 14.7213+-0.5013 14.5630+-0.4039 might be 1.0109x faster min-boolean 2.4130+-0.0537 ? 2.4326+-0.0939 ? minus-boolean-double 2.7503+-0.0223 ? 2.7979+-0.0936 ? might be 1.0173x slower minus-boolean 2.3549+-0.4863 2.0927+-0.0829 might be 1.1253x faster misc-strict-eq 27.7948+-2.5275 26.6064+-1.1510 might be 1.0447x faster mod-boolean-double 10.3531+-0.1636 ? 10.4375+-0.1610 ? mod-boolean 7.6772+-0.0308 ? 7.6798+-0.0617 ? mul-boolean-double 3.6855+-0.7669 3.2261+-0.0137 might be 1.1424x faster mul-boolean 2.5177+-0.0747 ? 2.8488+-0.6124 ? might be 1.1315x slower neg-boolean 2.8023+-0.1287 2.7727+-0.0392 might be 1.0107x faster negative-zero-divide 0.2582+-0.0193 ? 0.2610+-0.0124 ? might be 1.0106x slower negative-zero-modulo 0.2920+-0.1037 0.2905+-0.1217 negative-zero-negate 0.2401+-0.0035 ? 0.2416+-0.0129 ? nested-function-parsing 33.0396+-0.2871 ? 33.1509+-0.6180 ? new-array-buffer-dead 96.2360+-1.0873 ? 98.0498+-6.0321 ? might be 1.0188x slower new-array-buffer-push 6.3149+-0.3794 6.1479+-0.2788 might be 1.0272x faster new-array-dead 13.8781+-1.9851 13.2360+-1.1044 might be 1.0485x faster new-array-push 3.6558+-0.1577 3.6023+-0.3399 might be 1.0149x faster no-inline-constructor 110.4818+-4.5973 105.9281+-1.1793 might be 1.0430x faster number-test 2.7247+-0.5615 2.5497+-0.0743 might be 1.0686x faster object-closure-call 4.5638+-0.1317 ? 4.7870+-0.7263 ? might be 1.0489x slower object-test 2.3453+-0.0442 ? 2.5340+-0.5049 ? might be 1.0805x slower obvious-sink-pathology-taken 118.2666+-2.2391 ? 120.0546+-5.2881 ? might be 1.0151x slower obvious-sink-pathology 113.5497+-0.8640 113.5235+-1.8269 obviously-elidable-new-object 29.2182+-2.6200 27.0430+-0.1487 might be 1.0804x faster plus-boolean-arith 2.1182+-0.0169 ? 2.2325+-0.1988 ? might be 1.0540x slower plus-boolean-double 2.8306+-0.2716 ? 2.8593+-0.1440 ? might be 1.0101x slower plus-boolean 2.4205+-0.4506 2.3298+-0.0146 might be 1.0389x faster poly-chain-access-different-prototypes-simple 2.4305+-0.0050 ? 2.5050+-0.2599 ? might be 1.0307x slower poly-chain-access-different-prototypes 2.2637+-0.0431 ? 2.3345+-0.1515 ? might be 1.0312x slower poly-chain-access-simpler 2.4450+-0.0817 ? 2.4713+-0.0792 ? might be 1.0107x slower poly-chain-access 2.3954+-0.3330 2.2760+-0.0858 might be 1.0525x faster poly-stricteq 42.0096+-1.4723 41.7791+-1.5912 polymorphic-array-call 0.9795+-0.0629 ? 1.0243+-0.0637 ? might be 1.0457x slower polymorphic-get-by-id 2.5228+-0.0873 ? 2.5433+-0.0605 ? polymorphic-put-by-id 23.1641+-1.7473 22.9447+-0.4531 polymorphic-structure 11.6145+-0.1370 11.5432+-0.1030 polyvariant-monomorphic-get-by-id 6.1240+-0.0724 ? 6.4543+-1.1397 ? might be 1.0539x slower proto-getter-access 7.6945+-0.3600 ? 8.0447+-0.7053 ? might be 1.0455x slower put-by-id-replace-and-transition 8.0762+-1.0025 ? 8.1398+-1.0559 ? put-by-id-slightly-polymorphic 2.3002+-0.0329 ? 2.4075+-0.1524 ? might be 1.0466x slower put-by-id 12.2438+-0.2799 ^ 11.8952+-0.0661 ^ definitely 1.0293x faster put-by-val-direct 0.3331+-0.0148 0.3265+-0.0116 might be 1.0202x faster put-by-val-large-index-blank-indexing-type 5.3245+-0.3421 ? 5.3817+-0.5417 ? might be 1.0107x slower put-by-val-machine-int 2.1646+-0.0443 ? 2.3138+-0.1457 ? might be 1.0689x slower rare-osr-exit-on-local 13.6348+-0.4297 ? 13.6457+-0.4007 ? register-pressure-from-osr 15.2329+-0.4038 14.9760+-0.3111 might be 1.0172x faster setter 5.3923+-0.2533 ? 5.5655+-0.3316 ? might be 1.0321x slower simple-activation-demo 22.6383+-0.6282 ? 22.7936+-0.3713 ? simple-getter-access 9.7494+-0.2171 9.6143+-0.1835 might be 1.0141x faster simple-poly-call-nested 8.3760+-0.4468 ? 8.8411+-0.6401 ? might be 1.0555x slower simple-poly-call 1.1470+-0.0510 ? 1.1710+-0.1467 ? might be 1.0209x slower sin-boolean 16.6793+-1.6030 16.2102+-0.5963 might be 1.0289x faster singleton-scope 58.1704+-1.6125 ? 58.4650+-1.2252 ? sink-function 9.2067+-0.3572 9.1561+-0.3759 sink-huge-activation 15.3687+-1.2797 14.9748+-0.3616 might be 1.0263x faster sinkable-new-object-dag 56.9877+-3.8169 55.4910+-2.3970 might be 1.0270x faster sinkable-new-object-taken 46.1378+-1.7054 ? 46.5231+-2.0160 ? sinkable-new-object 32.1895+-1.7768 ? 32.4302+-1.1209 ? slow-array-profile-convergence 2.4015+-0.7592 2.1943+-0.0853 might be 1.0944x faster slow-convergence 2.3362+-0.4279 2.1356+-0.0359 might be 1.0940x faster sorting-benchmark 17.3640+-0.2545 17.1731+-0.3448 might be 1.0111x faster sparse-conditional 0.9967+-0.0286 0.9579+-0.0316 might be 1.0405x faster splice-to-remove 12.4217+-0.2645 12.4190+-0.2155 string-char-code-at 11.7400+-0.7929 ? 11.9744+-0.7138 ? might be 1.0200x slower string-concat-object 2.2735+-0.2910 2.2472+-0.1128 might be 1.0117x faster string-concat-pair-object 2.0671+-0.0470 ? 2.1863+-0.3453 ? might be 1.0577x slower string-concat-pair-simple 10.4166+-0.2181 ? 10.8223+-0.2571 ? might be 1.0390x slower string-concat-simple 10.6625+-0.2285 ? 10.7858+-0.8069 ? might be 1.0116x slower string-cons-repeat 7.6285+-0.5966 7.3878+-0.2928 might be 1.0326x faster string-cons-tower 7.7446+-0.3511 ? 7.7896+-0.3686 ? string-equality 14.0413+-1.1127 ? 14.5976+-1.1919 ? might be 1.0396x slower string-get-by-val-big-char 6.0761+-0.0668 ? 6.2242+-0.2175 ? might be 1.0244x slower string-get-by-val-out-of-bounds-insane 3.2073+-0.3097 3.0142+-0.1232 might be 1.0640x faster string-get-by-val-out-of-bounds 3.7384+-0.4442 3.7291+-0.2073 string-get-by-val 2.6218+-0.3024 ? 2.7733+-0.7391 ? might be 1.0578x slower string-hash 1.6666+-0.0145 ? 1.6974+-0.1064 ? might be 1.0185x slower string-long-ident-equality 11.0800+-0.1088 ? 11.1030+-0.1014 ? string-out-of-bounds 9.3950+-0.1560 9.3912+-0.2349 string-repeat-arith 25.8444+-1.8103 24.7103+-0.2293 might be 1.0459x faster string-sub 48.2728+-1.4096 47.2511+-0.8146 might be 1.0216x faster string-test 2.3976+-0.0131 ? 2.4615+-0.1239 ? might be 1.0267x slower string-var-equality 24.0847+-0.3989 ? 24.3770+-1.0953 ? might be 1.0121x slower structure-hoist-over-transitions 2.1474+-0.1309 ? 2.1786+-0.0889 ? might be 1.0146x slower substring-concat-weird 35.9947+-0.7102 35.4572+-1.7101 might be 1.0152x faster substring-concat 36.5112+-1.2844 36.0167+-0.4761 might be 1.0137x faster substring 41.2643+-0.8130 40.8342+-1.7899 might be 1.0105x faster switch-char-constant 2.6982+-0.2274 ? 2.7703+-0.1284 ? might be 1.0267x slower switch-char 5.6874+-0.8582 ? 5.9475+-1.0229 ? might be 1.0457x slower switch-constant 8.1365+-0.1827 7.9464+-0.3308 might be 1.0239x faster switch-string-basic-big-var 13.0591+-0.9093 12.4024+-0.1166 might be 1.0529x faster switch-string-basic-big 13.0443+-0.1635 12.9399+-1.2147 switch-string-basic-var 12.2295+-0.2097 ? 12.5209+-1.4352 ? might be 1.0238x slower switch-string-basic 11.6801+-0.7866 11.2132+-0.2156 might be 1.0416x faster switch-string-big-length-tower-var 17.8444+-0.2779 ^ 16.4628+-0.7524 ^ definitely 1.0839x faster switch-string-length-tower-var 12.1469+-0.2548 11.7234+-0.2283 might be 1.0361x faster switch-string-length-tower 10.7536+-1.0482 10.2365+-0.1534 might be 1.0505x faster switch-string-short 10.2935+-0.2334 10.2232+-0.0671 switch 12.3239+-1.2827 11.5049+-0.3304 might be 1.0712x faster tear-off-arguments-simple 3.1315+-0.5644 2.8785+-0.0493 might be 1.0879x faster tear-off-arguments 4.1161+-0.0596 4.0854+-0.3137 temporal-structure 10.8801+-0.2433 ? 10.8967+-0.1949 ? to-int32-boolean 12.1490+-1.0787 12.0208+-0.4317 might be 1.0107x faster try-catch-get-by-val-cloned-arguments 13.0632+-1.3594 12.4051+-0.0912 might be 1.0531x faster try-catch-get-by-val-direct-arguments 5.4548+-0.2681 ? 5.5142+-0.2833 ? might be 1.0109x slower try-catch-get-by-val-scoped-arguments 6.7856+-0.6834 6.6713+-0.3479 might be 1.0171x faster typed-array-get-set-by-val-profiling 29.2254+-1.9634 28.8467+-2.3882 might be 1.0131x faster undefined-property-access 201.9491+-0.3253 ? 202.2845+-0.5593 ? undefined-test 2.5217+-0.0458 ? 2.5873+-0.0649 ? might be 1.0260x slower unprofiled-licm 12.9734+-0.5255 12.8461+-0.7174 varargs-call 12.7744+-1.0065 11.8988+-0.0821 might be 1.0736x faster varargs-construct-inline 18.9385+-0.3374 ? 18.9477+-0.7582 ? varargs-construct 26.8636+-0.3642 ? 27.1548+-1.1879 ? might be 1.0108x slower varargs-inline 7.6400+-0.4426 ? 7.8483+-1.0337 ? might be 1.0273x slower varargs-strict-mode 8.3412+-0.3056 8.1160+-0.0829 might be 1.0277x faster varargs 8.1857+-0.2864 8.1345+-0.1240 weird-inlining-const-prop 2.0535+-0.3187 1.9532+-0.3059 might be 1.0513x faster <geometric> 6.9995+-0.0432 ? 7.0024+-0.0500 ? might be 1.0004x slower Conf#1 Conf#2 AsmBench: bigfib.cpp 430.0673+-5.3406 429.0679+-5.9068 cray.c 370.9434+-2.6266 370.7574+-3.4957 dry.c 391.3120+-28.1714 ? 400.3206+-28.4863 ? might be 1.0230x slower FloatMM.c 660.6706+-0.6043 ? 660.8911+-3.3617 ? gcc-loops.cpp 3379.4714+-42.2538 3365.6600+-24.2746 n-body.c 784.8190+-1.8584 ? 788.0121+-6.5370 ? Quicksort.c 394.7753+-6.9276 393.2552+-1.7536 stepanov_container.cpp 3319.1298+-64.8832 3290.7164+-19.7912 Towers.c 224.2418+-0.3797 ? 224.3572+-1.1079 ? <geometric> 682.4591+-4.0381 ? 683.0945+-4.3673 ? might be 1.0009x slower Conf#1 Conf#2 CompressionBench: huffman 283.3488+-4.0389 283.3203+-5.2277 arithmetic-simple 326.0441+-1.0772 ? 326.1645+-1.5984 ? arithmetic-precise 254.1752+-3.0214 ? 254.5490+-1.1787 ? arithmetic-complex-precise 256.6270+-3.7170 256.3231+-5.2345 arithmetic-precise-order-0 337.7275+-7.0976 ? 341.2655+-3.3992 ? might be 1.0105x slower arithmetic-precise-order-1 284.0228+-2.2518 282.9955+-4.1211 arithmetic-precise-order-2 316.1408+-2.9216 ? 322.2546+-10.5952 ? might be 1.0193x slower arithmetic-simple-order-1 316.1196+-1.5161 315.2775+-4.2455 arithmetic-simple-order-2 384.5463+-45.0267 363.9423+-10.0071 might be 1.0566x faster lz-string 292.8047+-6.6800 ? 293.0391+-5.9172 ? <geometric> 302.8536+-3.1452 301.9800+-1.3922 might be 1.0029x faster Conf#1 Conf#2 Geomean of preferred means: <scaled-result> 53.2699+-0.2365 ^ 51.9108+-0.3804 ^ definitely 1.0262x faster
Comment on attachment 252575 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=252575&action=review Looks good to me. Probably needs review from Phil too. > Source/JavaScriptCore/ChangeLog:14 > + Since ArithRound speculate it produces int32, the MacroAssembler assembler speculate => speculates > Source/JavaScriptCore/ChangeLog:20 > + but it is a good start known to be valid and inlining alone alread provides alread => already
c:\cygwin\home\buildbot\webkit\webkitbuild\release\include\private\javascriptcore\X86Assembler.h(1811): error C2039: 'twoByteOp64' : is not a member of 'JSC::X86Assembler::X86InstructionFormatter' [C:\cygwin\home\buildbot\WebKit\Source\JavaScriptCore\JavaScriptCore.vcxproj\LLInt\LLIntOffsetsExtractor\LLIntOffsetsExtractor.vcxproj] c:\cygwin\home\buildbot\webkit\webkitbuild\release\include\private\javascriptcore\X86Assembler.h(2332) : see declaration of 'JSC::X86Assembler::X86InstructionFormatter'
Comment on attachment 252575 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=252575&action=review > Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h:770 > + if (operand && operand.isNumber()) { > + setConstant(node, jsNumber(jsRound(operand.asNumber()))); > + break; > + } This constant folding should correctly consider what happens under all of the rounding modes. - This is wrong for Int32, since it fails to convert -0 to 0. It also fails to always produce an int32. There is sort of another bug. It also will remove the Int32: check, which is pretty catastrophic: you could have previously had code that assumed that the incoming value was checked for Int32, but now the check will be gone and you'll have a double constant instead. That's not quite true since: (1) This code is reached only after the edge checks are executed. But the guiding principle of the abstract interpreter is that anytime it sets an abstract value to be V, it could instead set it to W if W is a superset of V. Therefore, it would be legal to change the Int32: check logic in the abstract interpreter to just do nothing for a double constant: the right result would be the clear value (i.e. the empty set of values), but you'd be setting it to some value instead, and some value is a superset of no values. Also: (2) the constant folder will try keep the edge checks intact after removing a node. But that all gets weird, because you'd then have an Int32: check on a double constant and a node that previously returned an int32 will now return a double. Soooooper weird. - This is wrong for Int32WithNegBlahBlah, since it will sort of remove the Int32:. This would be catastrophic if it weren't for other mitigations, but we still want to avoid it. Look at the pattern used for other arith nodes. Roughly, we do: - Don't constant fold if we know that some check that this does would have failed. Basically, this means that if you're in the Int32 modes, check that operand.isInt32(). - Make sure you correctly model the behavior of the node in the DFG and FTL backends. In the Int32 rounding mode, then will not return the same result as jsRound() for -0. - Make sure that when calling setConstant(), you set a constant that matches the type this would have otherwise returned. In the Int32 rounding mode, this node will always return Int32, but you might return a double (due to -0). A good idiom to follow is to make damn sure that when you construct a jsNumber() for an int32-returning node, you call the jsNumber() overload that takes an int32.
Created attachment 252639 [details] Patch
Comment on attachment 252639 [details] Patch View in context: https://bugs.webkit.org/attachment.cgi?id=252639&action=review > Source/JavaScriptCore/ftl/FTLLowerDFGToLLVM.cpp:980 > + LValue convertDoubleToInt32(LValue value, bool shouldCheckNegativeZero) Something I try to do is put all of the helpers below the compileNodeType methods.
Committed r183963: <http://trac.webkit.org/changeset/183963>
Looks like a 9% progression on Kraken on the bots.