OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 // Flags: --turbo --turbo-escape --allow-natives-syntax | 5 // Flags: --turbo --turbo-escape --allow-natives-syntax |
6 | 6 |
7 "use strict"; | 7 "use strict"; |
8 | 8 |
| 9 const kDeoptimized = 2; |
| 10 const kTurbofanned = 7; |
| 11 const kInterpreted = 8; |
| 12 |
| 13 function GetOptimizationStatus(fn) { |
| 14 let status = %GetOptimizationStatus(fn); |
| 15 switch (status) { |
| 16 case kInterpreted: // Treat interpreted frames as unoptimized |
| 17 status = kDeoptimized; |
| 18 break; |
| 19 } |
| 20 |
| 21 return status; |
| 22 } |
| 23 |
9 let global = this; | 24 let global = this; |
10 let tests = { | 25 let tests = { |
11 FastElementsKind() { | 26 FastElementsKind() { |
12 let runners = { | 27 let runners = { |
13 FAST_SMI_ELEMENTS(array) { | 28 FAST_SMI_ELEMENTS(array) { |
14 let sum = 0; | 29 let sum = 0; |
15 for (let x of array) sum += x; | 30 for (let x of array) sum += x; |
16 return sum; | 31 return sum; |
17 }, | 32 }, |
18 | 33 |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
96 let { array, expected, array2, expected2 } = tests[key]; | 111 let { array, expected, array2, expected2 } = tests[key]; |
97 | 112 |
98 // Warmup: | 113 // Warmup: |
99 fn(array); | 114 fn(array); |
100 fn(array); | 115 fn(array); |
101 %OptimizeFunctionOnNextCall(fn); | 116 %OptimizeFunctionOnNextCall(fn); |
102 fn(array); | 117 fn(array); |
103 | 118 |
104 // TODO(bmeurer): FAST_HOLEY_DOUBLE_ELEMENTS maps generally deopt when | 119 // TODO(bmeurer): FAST_HOLEY_DOUBLE_ELEMENTS maps generally deopt when |
105 // a hole is encountered. Test should be fixed once that is corrected. | 120 // a hole is encountered. Test should be fixed once that is corrected. |
106 let expect_deopt = /HOLEY_DOUBLE/.test(key); | 121 let status = /HOLEY_DOUBLE/.test(key) ? kDeoptimized : kTurbofanned; |
107 | 122 |
108 if (expect_deopt) { | 123 assertEquals(status, GetOptimizationStatus(fn), key); |
109 assertUnoptimized(fn, '', key); | |
110 } else { | |
111 assertOptimized(fn, '', key); | |
112 } | |
113 assertEquals(expected, fn(array), key); | 124 assertEquals(expected, fn(array), key); |
114 if (expect_deopt) { | 125 assertEquals(status, GetOptimizationStatus(fn), key); |
115 assertUnoptimized(fn, '', key); | |
116 } else { | |
117 assertOptimized(fn, '', key); | |
118 } | |
119 | 126 |
120 // Check no deopt when another array with the same map is used | 127 // Check no deopt when another arra with the same map is used |
121 assertTrue(%HaveSameMap(array, array2), key); | 128 assertTrue(%HaveSameMap(array, array2), key); |
122 if (expect_deopt) { | 129 assertEquals(status, GetOptimizationStatus(fn), key); |
123 assertUnoptimized(fn, '', key); | |
124 } else { | |
125 assertOptimized(fn, '', key); | |
126 } | |
127 assertEquals(expected2, fn(array2), key); | 130 assertEquals(expected2, fn(array2), key); |
128 | 131 |
129 // CheckMaps bailout | 132 // CheckMaps bailout |
130 let newArray = Object.defineProperty( | 133 let newArray = Object.defineProperty( |
131 [1, 2, 3], 2, { enumerable: false, configurable: false, | 134 [1, 2, 3], 2, { enumerable: false, configurable: false, |
132 get() { return 7; } }); | 135 get() { return 7; } }); |
133 fn(newArray); | 136 fn(newArray); |
134 assertUnoptimized(fn, '', key); | 137 assertEquals(kDeoptimized, GetOptimizationStatus(fn), key); |
135 } | 138 } |
136 }, | 139 }, |
137 | 140 |
138 TypedArrays() { | 141 TypedArrays() { |
139 let tests = { | 142 let tests = { |
140 Uint8Array: { | 143 Uint8Array: { |
141 array: new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, -1, 256]), | 144 array: new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, -1, 256]), |
142 expected: 291, | 145 expected: 291, |
143 array2: new Uint8Array([1, 2, 3]), | 146 array2: new Uint8Array([1, 2, 3]), |
144 expected2: 6 | 147 expected2: 6 |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
212 for (let x of array) ret += x; | 215 for (let x of array) ret += x; |
213 return ret; | 216 return ret; |
214 }; | 217 }; |
215 | 218 |
216 // Warmup | 219 // Warmup |
217 sum(array); | 220 sum(array); |
218 sum(array); | 221 sum(array); |
219 %OptimizeFunctionOnNextCall(sum); | 222 %OptimizeFunctionOnNextCall(sum); |
220 assertEquals(expected, sum(array), key); | 223 assertEquals(expected, sum(array), key); |
221 | 224 |
222 assertOptimized(sum, '', key); | 225 assertEquals(kTurbofanned, GetOptimizationStatus(sum), key); |
223 | 226 |
224 // Not deoptimized when called on typed array of same type / map | 227 // Not deoptimized when called on typed array of same type / map |
225 assertTrue(%HaveSameMap(array, array2)); | 228 assertTrue(%HaveSameMap(array, array2)); |
226 assertEquals(expected2, sum(array2), key); | 229 assertEquals(expected2, sum(array2), key); |
227 assertOptimized(sum, '', key); | 230 assertEquals(kTurbofanned, GetOptimizationStatus(sum), key); |
228 | 231 |
229 // Throw when detached | 232 // Throw when detached |
230 let clone = new array.constructor(array); | 233 let clone = new array.constructor(array); |
231 %ArrayBufferNeuter(clone.buffer); | 234 %ArrayBufferNeuter(clone.buffer); |
232 assertThrows(() => sum(clone), TypeError); | 235 assertThrows(() => sum(clone), TypeError); |
233 } | 236 } |
234 } | 237 } |
235 }; | 238 }; |
236 | 239 |
237 for (let name of Object.keys(tests)) { | 240 for (let name of Object.keys(tests)) { |
238 let test = tests[name]; | 241 let test = tests[name]; |
239 test(); | 242 test(); |
240 } | 243 } |
OLD | NEW |