[JSC] AI should not propagate AbstractValue relying on constant folding phase
[WebKit-https.git] / JSTests / microbenchmarks / try-catch-word-count.js
1 "use strict";
2
3 let assert = (b, m) => {
4     if (!b)
5         throw new Error("Bad assertion: " + m);
6 }
7
8 class EOF extends Error { };
9
10 let texts = [`function foo() {
11     var o = {};
12     o.a = 1;
13     o.b = 2;
14     o.c = 3;
15     o.d = 4;
16     o.e = 5;
17     o.f = 6;
18     o.g = 7;
19     return o;
20 }
21
22 var result = 0;
23 for (var i = 0; i < 100000; ++i)
24     result += foo().a;
25
26 if (result != 100000)
27     throw "Error, bad result: " + result;
28
29 `,`"use strict";
30
31 (function() {
32     let o = {
33         apply(a, b) {
34             return a + b;
35         }
36     };
37     
38     function foo() {
39         let result = 0;
40         for (let i = 0; i < 1000; ++i)
41             result = o.apply(result, 1);
42         return result;
43     }
44     
45     noInline(foo);
46     
47     let result = 0;
48     for (let i = 0; i < 10000; ++i)
49         result += foo();
50     
51     if (result != 10000000)
52         throw new "Bad result: " + result;
53 })();
54
55 `,`function foo(a, b) {
56     return arguments[0] + b;
57 }
58
59 noInline(foo);
60
61 for (var i = 0; i < 1000000; ++i) {
62     var result = foo(i, 1);
63     if (result != i + 1)
64         throw "Error: bad result: " + result;
65 }
66 `,`function foo() { return arguments; }
67 noInline(foo);
68
69 function bar(o) {
70     var tmp = o[0];
71     var result = 0;
72     for (var i = 0; i < 1000; ++i) {
73         if (tmp)
74             result += tmp * i;
75     }
76     return result;
77 }
78 noInline(bar);
79
80 var result = 0;
81 var o = foo();
82 for (var i = 0; i < 10000; ++i)
83     result += bar(o);
84
85 if (result !== 0)
86     throw "Error: bad result: " + result;
87 `,`function foo() {
88     "use strict";
89     return [...arguments];
90
91 }
92
93 noInline(foo);
94
95 for (var i = 0; i < 200000; ++i) {
96     var result = foo(i);
97     if (result[0] != i)
98         throw "Error: bad result: " + result;
99 }
100 `,`function foo() {
101     return arguments[0];
102 }
103
104 noInline(foo);
105
106 for (var i = 0; i < 1000000; ++i) {
107     var result = foo(i);
108     if (result != i)
109         throw "Error: bad result: " + result;
110 }
111 `,`function foo(a, b) {
112     return a + b;
113 }
114
115 for (var i = 0; i < 100000; ++i) {
116     var result = foo(1, 2, 3);
117     if (result != 3)
118         throw "Bad result: " + result;
119 }
120
121 `,`function foo(a) {
122     var result = a[0];
123     if (result)
124         result += a[1];
125     if (result)
126         result += a[2];
127     if (result)
128         result += a[3];
129     if (result)
130         result += a[4];
131     return result;
132 }
133
134 var result = 0;
135
136 for (var i = 0; i < 100000; ++i) {
137     var array = [1, 2, 3, 4, 5];
138     if (i & 1)
139         array.f = 42;
140     result += foo(array);
141 }
142
143 if (result != 1500000)
144     throw "Error: bad result: " + result;
145 `,`//@ runNoFTL
146
147 var f = function(a) {
148     var sum = 0;
149     for (var i = 0; i < a.length; i++) {
150         sum += a[i];
151     }   
152     return sum;
153 };
154
155 var run = function() {
156     var o1 = []; 
157     for (var i = 0; i < 100; i++) {
158         o1[i] = i;
159     }
160     
161     var o2 = {}; 
162     for (var i = 0; i < o1.length; i++) {
163         o2[i] = o1[i];
164     }
165     o2.length = o1.length;
166
167     var sum = 0;
168     for (var i = 0; i < 100000; i++) {
169         if (i % 2 === 0)
170             sum += f(o1);
171         else
172             sum += f(o2);
173     }
174     return sum;
175 };
176
177 var result = run();
178 if (result !== 495000000)
179     throw "Bad result: " + result;
180 `,`var result = 0;
181 function test1(a) {
182     result << 1;
183     result++;
184     return true;
185 }
186 function test2(a,b) {
187     result ^= 3;
188     result *= 3;
189     return true;
190 }
191 function test3(a,b,c) {
192     result ^= result >> 1;
193     return true;
194 }
195
196 var result = 0;
197 var array = []
198 for (var i = 0; i < 100000; ++i)
199     array[i] = 1;
200
201 for (var i = 0; i < 10; i++) {
202     array.every(test1);
203     array.every(test2);
204     array.every(test3);
205 }
206
207 if (result != 1428810496)
208     throw "Error: bad result: " + result;
209 `,`var result = 0;
210 function test1(a) {
211     result << 1;
212     result++;
213     return true;
214 }
215 function test2(a,b) {
216     result ^= 3;
217     result *= 3;
218     return true;
219 }
220 function test3(a,b,c) {
221     result ^= result >> 1;
222     return true;
223 }
224
225 var result = 0;
226 var array = []
227 for (var i = 0; i < 100000; ++i)
228     array[i] = 1;
229
230 for (var i = 0; i < 10; i++) {
231     array.forEach(test1);
232     array.forEach(test2);
233     array.forEach(test3);
234 }
235
236 if (result != 1428810496)
237     throw "Error: bad result: " + result;
238 `,`var result = 0;
239 function test1(a) {
240     result << 1;
241     result++;
242     return true;
243 }
244 function test2(a,b) {
245     result ^= 3;
246     result *= 3;
247     return true;
248 }
249 function test3(a,b,c) {
250     result ^= result >> 1;
251     return true;
252 }
253
254 var result = 0;
255 var array = []
256 for (var i = 0; i < 100000; ++i)
257     array[i] = 1;
258
259 for (var i = 0; i < 10; i++) {
260     array.map(test1);
261     array.map(test2);
262     array.map(test3);
263 }
264
265 if (result != 1428810496)
266     throw "Error: bad result: " + result;
267 `,`var result = 0;
268 function test1(a) {
269     result << 1;
270     result++;
271     return true;
272 }
273 function test2(a,b) {
274     result ^= 3;
275     result *= 3;
276     return true;
277 }
278 function test3(a,b,c) {
279     result ^= result >> 1;
280     return true;
281 }
282
283 var result = 0;
284 var array = []
285 for (var i = 0; i < 100000; ++i)
286     array[i] = 1;
287
288 for (var i = 0; i < 10; i++) {
289     array.reduce(test1, {});
290     array.reduce(test2, {});
291     array.reduce(test3, {});
292 }
293
294 if (result != 1428810496)
295     throw "Error: bad result: " + result;
296 `,`var result = 0;
297 function test1(a) {
298     result << 1;
299     result++;
300     return true;
301 }
302 function test2(a,b) {
303     result ^= 3;
304     result *= 3;
305     return true;
306 }
307 function test3(a,b,c) {
308     result ^= result >> 1;
309     return true;
310 }
311
312 var result = 0;
313 var array = []
314 for (var i = 0; i < 100000; ++i)
315     array[i] = 1;
316
317 for (var i = 0; i < 10; i++) {
318     array.reduceRight(test1, {});
319     array.reduceRight(test2, {});
320     array.reduceRight(test3, {});
321 }
322
323 if (result != 1428810496)
324     throw "Error: bad result: " + result;
325 `,`var result = 0;
326 function test1(a) {
327     result << 1;
328     result++;
329     return false;
330 }
331 function test2(a,b) {
332     result ^= 3;
333     result *= 3;
334     return false;
335 }
336 function test3(a,b,c) {
337     result ^= result >> 1;
338     return false;
339 }
340
341 var result = 0;
342 var array = []
343 for (var i = 0; i < 100000; ++i)
344     array[i] = 1;
345
346 for (var i = 0; i < 10; i++) {
347     array.some(test1);
348     array.some(test2);
349     array.some(test3);
350 }
351
352 if (result != 1428810496)
353     throw "Error: bad result: " + result;
354 `,`function foo() {
355     var a = new Array(1000);
356     for (var i = 0; i < 1000; ++i) {
357         if (i % 7 === 0)
358             continue;
359         a[i] = i;
360     }
361
362     var niters = 10000;
363     var remove = true;
364     var lastRemovedItem = null;
365     var lastRemovedIndex = null;
366     for (var i = 0; i < niters; ++i) {
367         if (remove) {
368             lastRemovedIndex = Math.floor(Math.random() * a.length);
369             lastRemovedItem = a[lastRemovedIndex];
370             a.splice(lastRemovedIndex, 1);
371         } else {
372             a.splice(lastRemovedIndex, 0, lastRemovedItem);
373         }
374         remove = !remove;
375     }
376     if (a.length !== 1000)
377         throw new Error("Incorrect length");
378 };
379 foo();
380 `,`function foo() {
381     var a = [];
382     var b = [];
383     
384     for (var i = 0; i < 1000; ++i) {
385         a.push(i + 0.5);
386         b.push(i - 0.5);
387     }
388     
389     for (var i = 0; i < 1000; ++i) {
390         for (var j = 0; j < a.length; ++j)
391             a[j] += b[j];
392     }
393
394     var result = 0;
395     for (var i = 0; i < a.length; ++i)
396         result += a[i];
397     
398     return result;
399 }
400
401 var result = foo();
402 if (result != 499500000)
403     throw "Bad result: " + result;
404
405 `,`function foo() {
406     var array = [];
407     
408     for (var i = 0; i < 1000; ++i)
409         array.push(i + 0.5);
410     
411     for (var i = 0; i < 1000; ++i) {
412         for (var j = 0; j < array.length; ++j)
413             array[j]++;
414     }
415
416     var result = 0;
417     for (var i = 0; i < array.length; ++i)
418         result += array[i];
419     
420     return result;
421 }
422
423 var result = foo();
424 if (result != 1500000)
425     throw "Bad result: " + result;
426
427
428 `,`function foo() {
429     var a = [];
430     var b = [];
431     var c = [];
432     
433     for (var i = 0; i < 1000; ++i) {
434         a.push(i + 0.5);
435         b.push(i - 0.5);
436         c.push((i % 2) ? 0.5 : -0.25);
437     }
438     
439     for (var i = 0; i < 1000; ++i) {
440         for (var j = 0; j < a.length; ++j)
441             a[j] += b[j] * c[j];
442     }
443
444     var result = 0;
445     for (var i = 0; i < a.length; ++i)
446         result += a[i];
447     
448     return result;
449 }
450
451 var result = foo();
452 if (result != 63062500)
453     throw "Bad result: " + result;
454
455
456 `,`function foo() {
457     var array = [];
458     
459     for (var i = 0; i < 1000; ++i)
460         array.push(i + 0.5);
461     
462     var result = 0;
463     for (var i = 0; i < 1000; ++i) {
464         for (var j = 0; j < array.length; ++j)
465             result += array[j];
466     }
467     
468     return result;
469 }
470
471 if (foo() != 500000000)
472     throw "ERROR";
473
474 `,`function foo() {
475     var a = [];
476     var b = [];
477     
478     for (var i = 0; i < 1000; ++i) {
479         a.push(i + 1);
480         b.push(i - 1);
481     }
482     
483     for (var i = 0; i < 1000; ++i) {
484         for (var j = 0; j < a.length; ++j)
485             a[j] += b[j];
486         for (var j = 0; j < a.length; ++j)
487             a[j] -= b[j];
488     }
489
490     var result = 0;
491     for (var i = 0; i < a.length; ++i)
492         result += a[i];
493     
494     return result;
495 }
496
497 if (foo() != 500500)
498     throw "ERROR";
499
500
501 `,`function foo() {
502     var array = [];
503     
504     for (var i = 0; i < 1000; ++i)
505         array.push(i + ((i % 2) ? 0.5 : 0));
506     
507     var result = 0;
508     for (var i = 0; i < 1000; ++i) {
509         for (var j = 0; j < array.length; ++j)
510             result += array[j];
511     }
512     
513     return result;
514 }
515
516 var result = foo();
517 if (result != 499750000)
518     throw "Bad result: " + result;
519
520 `,`//@ skip
521
522 var array = new Array(10000);
523
524 for (var i = 0; i < 100000; ++i)
525     array[i % array.length] = new DataView(new ArrayBuffer(1000));
526
527 for (var i = 0; i < array.length; ++i) {
528     if (array[i].byteLength != 1000)
529         throw "Error: bad length: " + array[i].byteLength;
530     if (array[i].buffer.byteLength != 1000)
531         throw "Error: bad buffer.byteLength: " + array[i].buffer.byteLength;
532 }
533 `,`//@ skip
534
535 var array = new Array(10000);
536
537 for (var i = 0; i < 70000; ++i)
538     array[i % array.length] = new DataView(new ArrayBuffer(10));
539
540 for (var i = 0; i < array.length; ++i) {
541     if (array[i].byteLength != 10)
542         throw "Error: bad length: " + array[i].byteLength;
543     if (array[i].buffer.byteLength != 10)
544         throw "Error: bad buffer.byteLength: " + array[i].buffer.byteLength;
545 }
546 `,`//@ skip
547
548 var result = 0;
549 var buffer = new ArrayBuffer(10);
550 var array1 = new Int32Array(buffer, 4, 1);
551 var array2 = new Uint32Array(10);
552
553 for (var i = 0; i < 1000000; ++i) {
554     result += array1.byteOffset;
555     result += array2.byteOffset;
556 }
557
558 if (result != 4000000)
559     throw "Error: wrong result: " + result;
560 `,`//@ skip
561
562 var array = new Array(10000);
563
564 for (var i = 0; i < 100000; ++i)
565     array[i % array.length] = new Int8Array(new ArrayBuffer(1000));
566
567 for (var i = 0; i < array.length; ++i) {
568     if (array[i].length != 1000)
569         throw "Error: bad length: " + array[i].length;
570     if (array[i].buffer.byteLength != 1000)
571         throw "Error: bad buffer.byteLength: " + array[i].buffer.byteLength;
572 }
573 `,`//@ skip
574
575 var array = new Array(10000);
576
577 for (var i = 0; i < 100000; ++i)
578     array[i % array.length] = new Int8Array(new ArrayBuffer(10)).buffer;
579
580 for (var i = 0; i < array.length; ++i) {
581     if (array[i].byteLength != 10)
582         throw "Error: bad byteLength: " + array[i].byteLength;
583 }
584 `,`//@ skip
585
586 var array = new Array(10000);
587
588 for (var i = 0; i < 70000; ++i)
589     array[i % array.length] = new Int8Array(new ArrayBuffer(10));
590
591 for (var i = 0; i < array.length; ++i) {
592     if (array[i].length != 10)
593         throw "Error: bad length: " + array[i].length;
594     if (array[i].buffer.byteLength != 10)
595         throw "Error: bad buffer.byteLength: " + array[i].buffer.byteLength;
596 }
597 `,`//@ skip
598
599 for (var i = 0; i < 70000; ++i)
600     new Int8Array(new ArrayBuffer(10));
601
602 `,`var fn = function() {
603     return () => arguments[0];
604 }(1);
605
606 for (var i = 0; i < 100000; i++) {
607     if(fn(2) !== 1) throw 0; 
608 }
609 `,`var testValue  = 'test-value';
610
611 class A {
612     constructor() {
613         this.value = testValue;
614     }
615 }
616
617 class B extends A {
618     constructor() {
619         super();
620         var arrow  = () => testValue;
621         arrow();
622     }
623 }
624
625 noInline(B);
626
627 for (let i = 0; i < 1000000; ++i) {
628     let b = new B();
629     if (b.value != testValue)
630         throw "Error: bad result: " + result;
631 }
632 `,`var testValue  = 'test-value';
633
634 class A {
635     constructor() {
636         this.value = testValue;
637     }
638
639     getValue () {
640         return this.value;
641     }
642 }
643
644 class B extends A {
645     getParentValue() {
646         var arrow  = () => testValue;
647         return arrow();
648     }
649 }
650
651 for (let i = 0; i < 100000; ++i) {
652     let b = new B();
653     if (b.getParentValue() != testValue)
654         throw "Error: bad result: " + result;
655 }
656 `,`function bar(a, b) {
657     return ((_a, _b) => _a + _b)(a, b);
658 }
659
660 noInline(bar);
661
662 for (let i = 0; i < 1000000; ++i) {
663     let result = bar(1, 2);
664     if (result != 3)
665         throw "Error: bad result: " + result;
666 }
667 `,`var af = (a, b) => a + b;
668
669 noInline(af);
670
671 function bar(a, b) {
672     return af(a, b);
673 }
674
675 noInline(bar);
676
677 for (let i = 0; i < 1000000; ++i) {
678     let result = bar(1, 2);
679     if (result != 3)
680         throw "Error: bad result: " + result;
681 }
682 `,`// The strlen function is derived from here:
683 // http://kripken.github.io/mloc_emscripten_talk/#/20
684
685 var MEM8  = new Uint8Array(1024);
686
687 // Calculate length of C string:
688 function strlen(ptr) {
689   ptr = ptr|0;
690   var curr = 0;
691   curr = ptr;
692   while (MEM8[curr]|0 != 0) {
693     curr = (curr + 1)|0;
694   }
695   return (curr - ptr)|0;
696 }
697
698 //----- Test driver ----
699
700 for (i = 0; i < 1024; i++) {
701  MEM8[i] = i%198;
702 }
703
704 MEM8[7] = 0;
705
706 var sum = 0
707 for (i = 0; i < 1000000; i++) {
708   sum += strlen(5);
709 }
710
711 if (sum != 2000000)
712     throw "Bad result: " + result;
713 `,`
714 o = RegExp;
715 j = 0;
716 l = 2;
717 z = 0;
718 function test(o, z) {
719     var k = arguments[(((j << 1 | l) >> 1) ^ 1) & (z *= 1)];
720     k.input = 0;
721     for (var i = 0; i < 25000; i++) {
722         k.input = "foo";
723     }
724
725     return k.input;
726 }
727 var result = test({__proto__: {bar:"wibble", input:"foo"}});
728 var result = test({input:"foo"});
729 var result = test(o)
730 for (var k = 0; k < 6; k++) {
731     var start = new Date;
732     var newResult = test(o)
733     var end = new Date;
734     if (newResult != result)
735         throw "Failed at " + k + "with " + newResult + " vs. " + result
736     result = newResult;
737     o = {__proto__ : o }
738 }
739 `,`// RegExp.input is a handy setter
740
741 var o = RegExp;
742 function test(o) {
743     var k = 0;
744     o.input = "bar";
745     for (var i = 0; i < 30000; i++)
746         o.input = "foo";
747
748     return o.input;
749 }
750
751 var result = test(o);
752
753 for (var k = 0; k < 9; k++) {
754     var start = new Date;
755     var newResult = test(o)
756     var end = new Date;
757     if (newResult != result)
758         throw "Failed at " + k + "with " +newResult + " vs. " + result
759     result = newResult; 
760     o = {__proto__ : o }
761 }
762
763 `,`//@ runNoFTL
764
765 var set = new Set;
766 for (var i = 0; i < 8000; ++i) {
767     set.add(i);
768     set.add("" + i)
769     set.add({})
770     set.add(i + .5)
771 }
772
773 var result = 0;
774
775 set.forEach(function(k){ result += set.size; })
776 for (var i = 8000; i >= 0; --i) {
777     set.delete(i)
778     set.has("" + i)
779     set.add(i + .5)
780 }
781 set.forEach(function(k){ result += set.size; })
782
783 if (result != 1600048001)
784     throw "Bad result: " + result;
785
786
787 `,`// Test the performance of integer multiplication by implementing a 16-bit
788 // string hash.
789
790 function stringHash(string)
791 {
792     // source: http://en.wikipedia.org/wiki/Java_hashCode()#Sample_implementations_of_the_java.lang.String_algorithm
793     var h = 0;
794     var len = string.length;
795     for (var index = 0; index < len; index++) {
796         h = (((31 * h) | 0) + string.charCodeAt(index)) | 0;
797     }
798     return h;
799 }
800
801 for (var i = 0; i < 10000; ++i) {
802     var result =
803         (stringHash("The spirit is willing but the flesh is weak.") *
804          stringHash("The vodka is strong but the meat is rotten.")) | 0;
805     if (result != -1136304128)
806         throw "Bad result: " + result;
807 }
808
809 `,`
810 Function.prototype.a = Function.prototype.apply;
811
812 function testFunction(a, b)
813 {
814     "use strict"
815     return this * 10000 + a * 1000 + b * 100 + arguments[2] * 10 + arguments.length;
816 }
817
818 var arrayArguments = [1, [2, 3, 4]]
819
820 for (var i = 0; i < 10000; i++) {
821     var result1 = testFunction.apply(...arrayArguments);
822     var result2 = testFunction.a(...arrayArguments);
823     if (result1 != result2) 
824         throw "Call with spread array failed at iteration " + i + ": " + result1 + " vs " + result2;
825 }
826
827 for (var i = 0; i < 10000; i++) {
828     var result1 = testFunction.apply(...[1, [2, 3, 4]]);
829     var result2 = testFunction.a(...[1, [2, 3, 4]]);
830     if (result1 != result2) 
831         throw "Call with spread array failed at iteration " + i + ": " + result1 + " vs " + result2;
832 }
833
834 function test2() {
835     for (var i = 0; i < 10000; i++) {
836         var result1 = testFunction.apply(...arguments);
837         var result2 = testFunction.a(...arguments);
838         if (result1 != result2)
839            throw "Call with spread arguments failed at iteration " + i + ": " + result1 + " vs " + result2;
840     }
841 }
842
843 test2(1,[2,3,4])
844
845
846 function test3() {
847     aliasedArguments = arguments;
848     for (var i = 0; i < 10000; i++) {
849         var result1 = testFunction.apply(...aliasedArguments);
850         var result2 = testFunction.a(...aliasedArguments);
851         if (result1 != result2)
852            throw "Call with spread arguments failed at iteration " + i + ": " + result1 + " vs " + result2;
853     }
854 }
855
856 test3(1,[2,3,4])`]
857
858 let processTexts = (texts) => {
859     let wc = 0;
860     for (let text of texts) {
861         try {
862             let globalIndex = 0;
863             while (1) {
864                 let index = globalIndex;
865                 let word;
866                 while (true) {
867                     let c = text[index];
868                     if (c.match(/\s/)) {
869                         word = text.substring(globalIndex, index);
870                         while (c.match(/\s/)) {
871                             ++index;
872                             if (index >= text.length) {
873                                 globalIndex = index;
874                                 break;
875                             }
876                             c = text[index];
877                         }
878
879                         globalIndex = index;
880                         break;
881                     }
882
883                     ++index;
884                     if (index >= text.length) {
885                         globalIndex = index;
886                         break;
887                     }
888                 }
889
890                 if (globalIndex < text.length)
891                     wc++;
892                 else 
893                     throw new EOF;
894             }
895         } catch(e) {
896             assert(e instanceof EOF);
897         }
898     }
899     return wc;
900 };
901
902 for (let i = 0; i < 20; ++i)
903     processTexts(texts);