| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 // TODO(mvstanton): Remove this define after this flag is turned on globally | 5 // TODO(mvstanton): Remove this define after this flag is turned on globally |
| 6 #define V8_IMMINENT_DEPRECATION_WARNINGS | 6 #define V8_IMMINENT_DEPRECATION_WARNINGS |
| 7 | 7 |
| 8 #include "src/v8.h" | 8 #include "src/v8.h" |
| 9 #include "test/cctest/cctest.h" | 9 #include "test/cctest/cctest.h" |
| 10 | 10 |
| (...skipping 29 matching lines...) Expand all Loading... |
| 40 Isolate* isolate = CcTest::i_isolate(); | 40 Isolate* isolate = CcTest::i_isolate(); |
| 41 Factory* factory = isolate->factory(); | 41 Factory* factory = isolate->factory(); |
| 42 Zone* zone = isolate->runtime_zone(); | 42 Zone* zone = isolate->runtime_zone(); |
| 43 | 43 |
| 44 // Empty vectors are the empty fixed array. | 44 // Empty vectors are the empty fixed array. |
| 45 StaticFeedbackVectorSpec empty; | 45 StaticFeedbackVectorSpec empty; |
| 46 Handle<TypeFeedbackVector> vector = NewTypeFeedbackVector(isolate, &empty); | 46 Handle<TypeFeedbackVector> vector = NewTypeFeedbackVector(isolate, &empty); |
| 47 CHECK(Handle<FixedArray>::cast(vector) | 47 CHECK(Handle<FixedArray>::cast(vector) |
| 48 .is_identical_to(factory->empty_fixed_array())); | 48 .is_identical_to(factory->empty_fixed_array())); |
| 49 // Which can nonetheless be queried. | 49 // Which can nonetheless be queried. |
| 50 CHECK_EQ(0, vector->ic_with_type_info_count()); | |
| 51 CHECK_EQ(0, vector->ic_generic_count()); | |
| 52 CHECK(vector->is_empty()); | 50 CHECK(vector->is_empty()); |
| 53 | 51 |
| 54 { | 52 { |
| 55 FeedbackVectorSpec one_slot(zone); | 53 FeedbackVectorSpec one_slot(zone); |
| 56 one_slot.AddGeneralSlot(); | 54 one_slot.AddGeneralSlot(); |
| 57 vector = NewTypeFeedbackVector(isolate, &one_slot); | 55 vector = NewTypeFeedbackVector(isolate, &one_slot); |
| 58 FeedbackVectorHelper helper(vector); | 56 FeedbackVectorHelper helper(vector); |
| 59 CHECK_EQ(1, helper.slot_count()); | 57 CHECK_EQ(1, helper.slot_count()); |
| 60 } | 58 } |
| 61 | 59 |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 break; | 126 break; |
| 129 } | 127 } |
| 130 } | 128 } |
| 131 | 129 |
| 132 Handle<TypeFeedbackVector> vector = NewTypeFeedbackVector(isolate, &spec); | 130 Handle<TypeFeedbackVector> vector = NewTypeFeedbackVector(isolate, &spec); |
| 133 FeedbackVectorHelper helper(vector); | 131 FeedbackVectorHelper helper(vector); |
| 134 CHECK_EQ(40, helper.slot_count()); | 132 CHECK_EQ(40, helper.slot_count()); |
| 135 | 133 |
| 136 // Meanwhile set some feedback values and type feedback values to | 134 // Meanwhile set some feedback values and type feedback values to |
| 137 // verify the data structure remains intact. | 135 // verify the data structure remains intact. |
| 138 vector->change_ic_with_type_info_count(100); | |
| 139 vector->change_ic_generic_count(3333); | |
| 140 vector->Set(FeedbackVectorSlot(0), *vector); | 136 vector->Set(FeedbackVectorSlot(0), *vector); |
| 141 | 137 |
| 142 // Verify the metadata is correctly set up from the spec. | 138 // Verify the metadata is correctly set up from the spec. |
| 143 for (int i = 0; i < 40; i++) { | 139 for (int i = 0; i < 40; i++) { |
| 144 FeedbackVectorSlotKind kind = vector->GetKind(helper.slot(i)); | 140 FeedbackVectorSlotKind kind = vector->GetKind(helper.slot(i)); |
| 145 switch (i % 4) { | 141 switch (i % 4) { |
| 146 case 0: | 142 case 0: |
| 147 CHECK_EQ(FeedbackVectorSlotKind::GENERAL, kind); | 143 CHECK_EQ(FeedbackVectorSlotKind::GENERAL, kind); |
| 148 break; | 144 break; |
| 149 case 1: | 145 case 1: |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 | 189 |
| 194 // The feedback vector slots are cleared. AllocationSites are still granted | 190 // The feedback vector slots are cleared. AllocationSites are still granted |
| 195 // an exemption from clearing, as are smis. | 191 // an exemption from clearing, as are smis. |
| 196 CHECK_EQ(Smi::FromInt(1), vector->Get(helper.slot(0))); | 192 CHECK_EQ(Smi::FromInt(1), vector->Get(helper.slot(0))); |
| 197 CHECK_EQ(*TypeFeedbackVector::UninitializedSentinel(isolate), | 193 CHECK_EQ(*TypeFeedbackVector::UninitializedSentinel(isolate), |
| 198 vector->Get(helper.slot(1))); | 194 vector->Get(helper.slot(1))); |
| 199 CHECK(vector->Get(helper.slot(2))->IsAllocationSite()); | 195 CHECK(vector->Get(helper.slot(2))->IsAllocationSite()); |
| 200 } | 196 } |
| 201 | 197 |
| 202 | 198 |
| 203 TEST(VectorICProfilerStatistics) { | |
| 204 if (i::FLAG_always_opt) return; | |
| 205 CcTest::InitializeVM(); | |
| 206 LocalContext context; | |
| 207 v8::HandleScope scope(context->GetIsolate()); | |
| 208 Isolate* isolate = CcTest::i_isolate(); | |
| 209 Heap* heap = isolate->heap(); | |
| 210 | |
| 211 // Make sure function f has a call that uses a type feedback slot. | |
| 212 CompileRun( | |
| 213 "function fun() {};" | |
| 214 "function f(a) { a(); } f(fun);"); | |
| 215 Handle<JSFunction> f = GetFunction("f"); | |
| 216 // There should be one IC. | |
| 217 Handle<Code> code = handle(f->shared()->code(), isolate); | |
| 218 TypeFeedbackInfo* feedback_info = | |
| 219 TypeFeedbackInfo::cast(code->type_feedback_info()); | |
| 220 CHECK_EQ(1, feedback_info->ic_total_count()); | |
| 221 CHECK_EQ(0, feedback_info->ic_with_type_info_count()); | |
| 222 CHECK_EQ(0, feedback_info->ic_generic_count()); | |
| 223 Handle<TypeFeedbackVector> feedback_vector = | |
| 224 handle(f->shared()->feedback_vector(), isolate); | |
| 225 FeedbackVectorHelper helper(feedback_vector); | |
| 226 CallICNexus nexus(feedback_vector, helper.slot(0)); | |
| 227 CHECK_EQ(1, feedback_vector->ic_with_type_info_count()); | |
| 228 CHECK_EQ(0, feedback_vector->ic_generic_count()); | |
| 229 | |
| 230 // Now send the information generic. | |
| 231 CompileRun("f(Object);"); | |
| 232 CHECK_EQ(0, feedback_vector->ic_with_type_info_count()); | |
| 233 CHECK_EQ(1, feedback_vector->ic_generic_count()); | |
| 234 | |
| 235 // A collection will not affect the site. | |
| 236 heap->CollectAllGarbage(); | |
| 237 CHECK_EQ(0, feedback_vector->ic_with_type_info_count()); | |
| 238 CHECK_EQ(1, feedback_vector->ic_generic_count()); | |
| 239 | |
| 240 // The Array function is special. A call to array remains monomorphic | |
| 241 // and isn't cleared by gc because an AllocationSite is being held. | |
| 242 // Clear the IC manually in order to test this case. | |
| 243 nexus.Clear(*code); | |
| 244 CompileRun("f(Array);"); | |
| 245 CHECK_EQ(1, feedback_vector->ic_with_type_info_count()); | |
| 246 CHECK_EQ(0, feedback_vector->ic_generic_count()); | |
| 247 | |
| 248 | |
| 249 CHECK(nexus.GetFeedback()->IsAllocationSite()); | |
| 250 heap->CollectAllGarbage(); | |
| 251 CHECK_EQ(1, feedback_vector->ic_with_type_info_count()); | |
| 252 CHECK_EQ(0, feedback_vector->ic_generic_count()); | |
| 253 CHECK(nexus.GetFeedback()->IsAllocationSite()); | |
| 254 } | |
| 255 | |
| 256 | |
| 257 TEST(VectorCallICStates) { | 199 TEST(VectorCallICStates) { |
| 258 if (i::FLAG_always_opt) return; | 200 if (i::FLAG_always_opt) return; |
| 259 CcTest::InitializeVM(); | 201 CcTest::InitializeVM(); |
| 260 LocalContext context; | 202 LocalContext context; |
| 261 v8::HandleScope scope(context->GetIsolate()); | 203 v8::HandleScope scope(context->GetIsolate()); |
| 262 Isolate* isolate = CcTest::i_isolate(); | 204 Isolate* isolate = CcTest::i_isolate(); |
| 263 Heap* heap = isolate->heap(); | 205 Heap* heap = isolate->heap(); |
| 264 | 206 |
| 265 // Make sure function f has a call that uses a type feedback slot. | 207 // Make sure function f has a call that uses a type feedback slot. |
| 266 CompileRun( | 208 CompileRun( |
| (...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 567 // There should be one IC slot. | 509 // There should be one IC slot. |
| 568 Handle<TypeFeedbackVector> feedback_vector(f->shared()->feedback_vector()); | 510 Handle<TypeFeedbackVector> feedback_vector(f->shared()->feedback_vector()); |
| 569 FeedbackVectorHelper helper(feedback_vector); | 511 FeedbackVectorHelper helper(feedback_vector); |
| 570 CHECK_EQ(1, helper.slot_count()); | 512 CHECK_EQ(1, helper.slot_count()); |
| 571 FeedbackVectorSlot slot(0); | 513 FeedbackVectorSlot slot(0); |
| 572 StoreICNexus nexus(feedback_vector, slot); | 514 StoreICNexus nexus(feedback_vector, slot); |
| 573 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback()); | 515 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback()); |
| 574 } | 516 } |
| 575 | 517 |
| 576 } // namespace | 518 } // namespace |
| OLD | NEW |