Support the type profiler in the DFG
[WebKit-https.git] / Source / JavaScriptCore / tests / typeProfiler / dfg-jit-optimizations.js
1 load("./driver/driver.js");
2
3 function tierUpToDFG(func, arg) 
4 {
5     for (var i = 0; i < 1000; i++)
6         func(arg);
7 }
8
9 var types = [T.Boolean, T.Integer, T.Null, T.Number, T.String, T.Undefined];
10 var values = [true, 1, null, 1.1, "hello", undefined];
11 var funcs = [function(x) { return x; }, function(x) { return x; }, function(x) { return x; }, 
12     function(x) { return x; }, function(x) { return x; }, function(x) { return x; }]
13
14 assert(types.length === values.length && values.length === funcs.length);
15
16 // Make sure baseline DFG type check optimizations work.
17 // Tier up each function on a different type, then call it with all other primitive types to make sure they're recorded.
18 for (var i = 0; i < types.length; i++) {
19     var func = funcs[i];
20     var type = types[i];
21     var value = values[i];
22     noInline(func);
23     tierUpToDFG(func, value);
24     var typeInfo = findTypeForExpression(func, "x"); 
25     assert(typeInfo.instructionTypeSet.primitiveTypeNames.length === 1, "Only one primitive type should have been seen so far.");
26     assert(typeInfo.instructionTypeSet.primitiveTypeNames.indexOf(type) !== -1, "Should have been optimized on type: " + type);
27     for (var j = 0; j < types.length; j++) {
28         if (type === T.Number && types[j] === T.Integer) {
29             // If we optimize on type Number, but we pass in an Integer, our typecheck will still pass, so we wont directly get
30             // type Integer because T.Integer is implied to be contained in T.Number.
31             continue; 
32         }
33
34         func(values[j]);
35         typeInfo = findTypeForExpression(func, "x");
36         assert(typeInfo.instructionTypeSet.primitiveTypeNames.indexOf(types[j]) !== -1, "Should have seen type: " + types[j] + " " + i + "," + j);
37     }
38 }