Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(140)

Side by Side Diff: test/cctest/test-feedback-vector.cc

Issue 1370303004: Distinction between FeedbackVectorICSlot and FeedbackVectorSlot eliminated. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fixed release builds Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « test/cctest/test-feedback-vector.h ('k') | test/cctest/test-heap.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #include "src/v8.h" 5 #include "src/v8.h"
6 #include "test/cctest/cctest.h" 6 #include "test/cctest/cctest.h"
7 7
8 #include "src/api.h" 8 #include "src/api.h"
9 #include "src/debug/debug.h" 9 #include "src/debug/debug.h"
10 #include "src/execution.h" 10 #include "src/execution.h"
11 #include "src/factory.h" 11 #include "src/factory.h"
12 #include "src/global-handles.h" 12 #include "src/global-handles.h"
13 #include "src/macro-assembler.h" 13 #include "src/macro-assembler.h"
14 #include "src/objects.h" 14 #include "src/objects.h"
15 #include "test/cctest/test-feedback-vector.h"
15 16
16 using namespace v8::internal; 17 using namespace v8::internal;
17 18
18 namespace { 19 namespace {
19 20
20 #define CHECK_SLOT_KIND(vector, slot, expected_kind) \ 21 #define CHECK_SLOT_KIND(helper, index, expected_kind) \
21 CHECK_EQ(expected_kind, vector->GetKind(FeedbackVectorICSlot(slot))); 22 CHECK_EQ(expected_kind, helper.vector()->GetKind(helper.slot(index)));
22 23
23 24
24 TEST(VectorStructure) { 25 TEST(VectorStructure) {
25 LocalContext context; 26 LocalContext context;
26 v8::HandleScope scope(context->GetIsolate()); 27 v8::HandleScope scope(context->GetIsolate());
27 Isolate* isolate = CcTest::i_isolate(); 28 Isolate* isolate = CcTest::i_isolate();
28 Factory* factory = isolate->factory(); 29 Factory* factory = isolate->factory();
29 Zone* zone = isolate->runtime_zone(); 30 Zone* zone = isolate->runtime_zone();
30 31
31 // Empty vectors are the empty fixed array. 32 // Empty vectors are the empty fixed array.
32 StaticFeedbackVectorSpec empty; 33 StaticFeedbackVectorSpec empty;
33 Handle<TypeFeedbackVector> vector = factory->NewTypeFeedbackVector(&empty); 34 Handle<TypeFeedbackVector> vector = TypeFeedbackVector::New(isolate, &empty);
34 CHECK(Handle<FixedArray>::cast(vector) 35 CHECK(Handle<FixedArray>::cast(vector)
35 .is_identical_to(factory->empty_fixed_array())); 36 .is_identical_to(factory->empty_fixed_array()));
36 // Which can nonetheless be queried. 37 // Which can nonetheless be queried.
37 CHECK_EQ(0, vector->ic_with_type_info_count()); 38 CHECK_EQ(0, vector->ic_with_type_info_count());
38 CHECK_EQ(0, vector->ic_generic_count()); 39 CHECK_EQ(0, vector->ic_generic_count());
39 CHECK_EQ(0, vector->Slots()); 40 CHECK(vector->is_empty());
40 CHECK_EQ(0, vector->ICSlots());
41 41
42 FeedbackVectorSpec one_slot(zone); 42 {
43 one_slot.AddStubSlot(); 43 FeedbackVectorSpec one_slot(zone);
44 vector = factory->NewTypeFeedbackVector(&one_slot); 44 one_slot.AddGeneralSlot();
45 CHECK_EQ(1, vector->Slots()); 45 vector = TypeFeedbackVector::New(isolate, &one_slot);
46 CHECK_EQ(0, vector->ICSlots()); 46 FeedbackVectorHelper helper(vector);
47 CHECK_EQ(1, helper.slot_count());
48 }
47 49
48 FeedbackVectorSpec one_icslot(zone); 50 {
49 one_icslot.AddSlot(FeedbackVectorSlotKind::CALL_IC); 51 FeedbackVectorSpec one_icslot(zone);
50 vector = factory->NewTypeFeedbackVector(&one_icslot); 52 one_icslot.AddCallICSlot();
51 CHECK_EQ(0, vector->Slots()); 53 vector = TypeFeedbackVector::New(isolate, &one_icslot);
52 CHECK_EQ(1, vector->ICSlots()); 54 FeedbackVectorHelper helper(vector);
55 CHECK_EQ(1, helper.slot_count());
56 }
53 57
54 FeedbackVectorSpec spec(zone); 58 {
55 spec.AddStubSlots(3); 59 FeedbackVectorSpec spec(zone);
56 spec.AddSlots(FeedbackVectorSlotKind::CALL_IC, 5); 60 for (int i = 0; i < 3; i++) {
57 vector = factory->NewTypeFeedbackVector(&spec); 61 spec.AddGeneralSlot();
58 CHECK_EQ(3, vector->Slots()); 62 }
59 CHECK_EQ(5, vector->ICSlots()); 63 for (int i = 0; i < 5; i++) {
64 spec.AddCallICSlot();
65 }
66 vector = TypeFeedbackVector::New(isolate, &spec);
67 FeedbackVectorHelper helper(vector);
68 CHECK_EQ(8, helper.slot_count());
60 69
61 int metadata_length = vector->ic_metadata_length(); 70 int metadata_length = vector->ic_metadata_length();
62 CHECK(metadata_length > 0); 71 CHECK(metadata_length > 0);
63 72
64 int index = vector->GetIndex(FeedbackVectorSlot(0)); 73 int index = vector->GetIndex(helper.slot(0));
65 74
66 CHECK_EQ(TypeFeedbackVector::kReservedIndexCount + metadata_length, index); 75 CHECK_EQ(TypeFeedbackVector::kReservedIndexCount + metadata_length, index);
67 CHECK(FeedbackVectorSlot(0) == vector->ToSlot(index)); 76 CHECK(helper.slot(0) == vector->ToSlot(index));
68 77
69 index = vector->GetIndex(FeedbackVectorICSlot(0)); 78 index = vector->GetIndex(helper.slot(3));
70 CHECK_EQ(index, 79 CHECK_EQ(TypeFeedbackVector::kReservedIndexCount + metadata_length + 3,
71 TypeFeedbackVector::kReservedIndexCount + metadata_length + 3); 80 index);
72 CHECK(FeedbackVectorICSlot(0) == vector->ToICSlot(index)); 81 CHECK(helper.slot(3) == vector->ToSlot(index));
73 CHECK_EQ(TypeFeedbackVector::kReservedIndexCount + metadata_length + 3 + 82
74 5 * TypeFeedbackVector::elements_per_ic_slot(), 83 index = vector->GetIndex(helper.slot(7));
75 vector->length()); 84 CHECK_EQ(TypeFeedbackVector::kReservedIndexCount + metadata_length + 3 +
85 4 * TypeFeedbackVector::GetSlotSize(
86 FeedbackVectorSlotKind::CALL_IC),
87 index);
88 CHECK(helper.slot(7) == vector->ToSlot(index));
89
90 CHECK_EQ(TypeFeedbackVector::kReservedIndexCount + metadata_length + 3 +
91 5 * TypeFeedbackVector::GetSlotSize(
92 FeedbackVectorSlotKind::CALL_IC),
93 vector->length());
94 }
76 } 95 }
77 96
78 97
79 // IC slots need an encoding to recognize what is in there. 98 // IC slots need an encoding to recognize what is in there.
80 TEST(VectorICMetadata) { 99 TEST(VectorICMetadata) {
81 LocalContext context; 100 LocalContext context;
82 v8::HandleScope scope(context->GetIsolate()); 101 v8::HandleScope scope(context->GetIsolate());
83 Isolate* isolate = CcTest::i_isolate(); 102 Isolate* isolate = CcTest::i_isolate();
84 Factory* factory = isolate->factory();
85 Zone* zone = isolate->runtime_zone(); 103 Zone* zone = isolate->runtime_zone();
86 104
87 FeedbackVectorSpec spec(zone); 105 FeedbackVectorSpec spec(zone);
88 // Set metadata. 106 // Set metadata.
89 spec.AddStubSlots(10); 107 for (int i = 0; i < 40; i++) {
90 for (int i = 0; i < 30; i++) { 108 switch (i % 4) {
91 switch (i % 3) {
92 case 0: 109 case 0:
93 spec.AddSlot(FeedbackVectorSlotKind::CALL_IC); 110 spec.AddGeneralSlot();
94 break; 111 break;
95 case 1: 112 case 1:
96 spec.AddSlot(FeedbackVectorSlotKind::LOAD_IC); 113 spec.AddCallICSlot();
97 break; 114 break;
98 case 2: 115 case 2:
99 spec.AddSlot(FeedbackVectorSlotKind::KEYED_LOAD_IC); 116 spec.AddLoadICSlot();
117 break;
118 case 3:
119 spec.AddKeyedLoadICSlot();
100 break; 120 break;
101 } 121 }
102 } 122 }
103 123
104 Handle<TypeFeedbackVector> vector = factory->NewTypeFeedbackVector(&spec); 124 Handle<TypeFeedbackVector> vector = TypeFeedbackVector::New(isolate, &spec);
105 CHECK_EQ(10, vector->Slots()); 125 FeedbackVectorHelper helper(vector);
106 CHECK_EQ(3 * 10, vector->ICSlots()); 126 CHECK_EQ(40, helper.slot_count());
107 127
108 // Meanwhile set some feedback values and type feedback values to 128 // Meanwhile set some feedback values and type feedback values to
109 // verify the data structure remains intact. 129 // verify the data structure remains intact.
110 vector->change_ic_with_type_info_count(100); 130 vector->change_ic_with_type_info_count(100);
111 vector->change_ic_generic_count(3333); 131 vector->change_ic_generic_count(3333);
112 vector->Set(FeedbackVectorSlot(0), *vector); 132 vector->Set(FeedbackVectorSlot(0), *vector);
113 133
114 // Verify the metadata is correctly set up from the spec. 134 // Verify the metadata is correctly set up from the spec.
115 for (int i = 0; i < 30; i++) { 135 for (int i = 0; i < 40; i++) {
116 FeedbackVectorSlotKind kind = vector->GetKind(FeedbackVectorICSlot(i)); 136 FeedbackVectorSlotKind kind = vector->GetKind(helper.slot(i));
117 if (i % 3 == 0) { 137 switch (i % 4) {
118 CHECK_EQ(FeedbackVectorSlotKind::CALL_IC, kind); 138 case 0:
119 } else if (i % 3 == 1) { 139 CHECK_EQ(FeedbackVectorSlotKind::GENERAL, kind);
120 CHECK_EQ(FeedbackVectorSlotKind::LOAD_IC, kind); 140 break;
121 } else { 141 case 1:
122 CHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, kind); 142 CHECK_EQ(FeedbackVectorSlotKind::CALL_IC, kind);
143 break;
144 case 2:
145 CHECK_EQ(FeedbackVectorSlotKind::LOAD_IC, kind);
146 break;
147 case 3:
148 CHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, kind);
149 break;
123 } 150 }
124 } 151 }
125 } 152 }
126 153
127 154
128 TEST(VectorSlotClearing) { 155 TEST(VectorSlotClearing) {
129 LocalContext context; 156 LocalContext context;
130 v8::HandleScope scope(context->GetIsolate()); 157 v8::HandleScope scope(context->GetIsolate());
131 Isolate* isolate = CcTest::i_isolate(); 158 Isolate* isolate = CcTest::i_isolate();
132 Factory* factory = isolate->factory(); 159 Factory* factory = isolate->factory();
133 Zone* zone = isolate->runtime_zone(); 160 Zone* zone = isolate->runtime_zone();
134 161
135 // We only test clearing FeedbackVectorSlots, not FeedbackVectorICSlots. 162 // We only test clearing FeedbackVectorSlots, not FeedbackVectorSlots.
136 // The reason is that FeedbackVectorICSlots need a full code environment 163 // The reason is that FeedbackVectorSlots need a full code environment
137 // to fully test (See VectorICProfilerStatistics test below). 164 // to fully test (See VectorICProfilerStatistics test below).
138 FeedbackVectorSpec spec(zone); 165 FeedbackVectorSpec spec(zone);
139 spec.AddStubSlots(5); 166 for (int i = 0; i < 5; i++) {
140 Handle<TypeFeedbackVector> vector = factory->NewTypeFeedbackVector(&spec); 167 spec.AddGeneralSlot();
168 }
169 Handle<TypeFeedbackVector> vector = TypeFeedbackVector::New(isolate, &spec);
170 FeedbackVectorHelper helper(vector);
141 171
142 // Fill with information 172 // Fill with information
143 vector->Set(FeedbackVectorSlot(0), Smi::FromInt(1)); 173 vector->Set(helper.slot(0), Smi::FromInt(1));
144 Handle<WeakCell> cell = factory->NewWeakCell(factory->fixed_array_map()); 174 Handle<WeakCell> cell = factory->NewWeakCell(factory->fixed_array_map());
145 vector->Set(FeedbackVectorSlot(1), *cell); 175 vector->Set(helper.slot(1), *cell);
146 Handle<AllocationSite> site = factory->NewAllocationSite(); 176 Handle<AllocationSite> site = factory->NewAllocationSite();
147 vector->Set(FeedbackVectorSlot(2), *site); 177 vector->Set(helper.slot(2), *site);
148 178
149 // GC time clearing leaves slots alone. 179 // GC time clearing leaves slots alone.
150 vector->ClearSlotsAtGCTime(NULL); 180 vector->ClearSlotsAtGCTime(NULL);
151 Object* obj = vector->Get(FeedbackVectorSlot(1)); 181 Object* obj = vector->Get(helper.slot(1));
152 CHECK(obj->IsWeakCell() && !WeakCell::cast(obj)->cleared()); 182 CHECK(obj->IsWeakCell() && !WeakCell::cast(obj)->cleared());
153 183
154 vector->ClearSlots(NULL); 184 vector->ClearSlots(NULL);
155 185
156 // The feedback vector slots are cleared. AllocationSites are still granted 186 // The feedback vector slots are cleared. AllocationSites are still granted
157 // an exemption from clearing, as are smis. 187 // an exemption from clearing, as are smis.
158 CHECK_EQ(Smi::FromInt(1), vector->Get(FeedbackVectorSlot(0))); 188 CHECK_EQ(Smi::FromInt(1), vector->Get(helper.slot(0)));
159 CHECK_EQ(*TypeFeedbackVector::UninitializedSentinel(isolate), 189 CHECK_EQ(*TypeFeedbackVector::UninitializedSentinel(isolate),
160 vector->Get(FeedbackVectorSlot(1))); 190 vector->Get(helper.slot(1)));
161 CHECK(vector->Get(FeedbackVectorSlot(2))->IsAllocationSite()); 191 CHECK(vector->Get(helper.slot(2))->IsAllocationSite());
162 } 192 }
163 193
164 194
165 TEST(VectorICProfilerStatistics) { 195 TEST(VectorICProfilerStatistics) {
166 if (i::FLAG_always_opt) return; 196 if (i::FLAG_always_opt) return;
167 CcTest::InitializeVM(); 197 CcTest::InitializeVM();
168 LocalContext context; 198 LocalContext context;
169 v8::HandleScope scope(context->GetIsolate()); 199 v8::HandleScope scope(context->GetIsolate());
170 Isolate* isolate = CcTest::i_isolate(); 200 Isolate* isolate = CcTest::i_isolate();
171 Heap* heap = isolate->heap(); 201 Heap* heap = isolate->heap();
172 202
173 // Make sure function f has a call that uses a type feedback slot. 203 // Make sure function f has a call that uses a type feedback slot.
174 CompileRun( 204 CompileRun(
175 "function fun() {};" 205 "function fun() {};"
176 "function f(a) { a(); } f(fun);"); 206 "function f(a) { a(); } f(fun);");
177 Handle<JSFunction> f = v8::Utils::OpenHandle( 207 Handle<JSFunction> f = v8::Utils::OpenHandle(
178 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f")))); 208 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f"))));
179 // There should be one IC. 209 // There should be one IC.
180 Handle<Code> code = handle(f->shared()->code(), isolate); 210 Handle<Code> code = handle(f->shared()->code(), isolate);
181 TypeFeedbackInfo* feedback_info = 211 TypeFeedbackInfo* feedback_info =
182 TypeFeedbackInfo::cast(code->type_feedback_info()); 212 TypeFeedbackInfo::cast(code->type_feedback_info());
183 CHECK_EQ(1, feedback_info->ic_total_count()); 213 CHECK_EQ(1, feedback_info->ic_total_count());
184 CHECK_EQ(0, feedback_info->ic_with_type_info_count()); 214 CHECK_EQ(0, feedback_info->ic_with_type_info_count());
185 CHECK_EQ(0, feedback_info->ic_generic_count()); 215 CHECK_EQ(0, feedback_info->ic_generic_count());
186 Handle<TypeFeedbackVector> feedback_vector = 216 Handle<TypeFeedbackVector> feedback_vector =
187 handle(f->shared()->feedback_vector(), isolate); 217 handle(f->shared()->feedback_vector(), isolate);
188 int ic_slot = 0; 218 FeedbackVectorHelper helper(feedback_vector);
189 CallICNexus nexus(feedback_vector, FeedbackVectorICSlot(ic_slot)); 219 CallICNexus nexus(feedback_vector, helper.slot(0));
190 CHECK_EQ(1, feedback_vector->ic_with_type_info_count()); 220 CHECK_EQ(1, feedback_vector->ic_with_type_info_count());
191 CHECK_EQ(0, feedback_vector->ic_generic_count()); 221 CHECK_EQ(0, feedback_vector->ic_generic_count());
192 222
193 // Now send the information generic. 223 // Now send the information generic.
194 CompileRun("f(Object);"); 224 CompileRun("f(Object);");
195 CHECK_EQ(0, feedback_vector->ic_with_type_info_count()); 225 CHECK_EQ(0, feedback_vector->ic_with_type_info_count());
196 CHECK_EQ(1, feedback_vector->ic_generic_count()); 226 CHECK_EQ(1, feedback_vector->ic_generic_count());
197 227
198 // A collection will not affect the site. 228 // A collection will not affect the site.
199 heap->CollectAllGarbage(); 229 heap->CollectAllGarbage();
(...skipping 27 matching lines...) Expand all
227 257
228 // Make sure function f has a call that uses a type feedback slot. 258 // Make sure function f has a call that uses a type feedback slot.
229 CompileRun( 259 CompileRun(
230 "function foo() { return 17; }" 260 "function foo() { return 17; }"
231 "function f(a) { a(); } f(foo);"); 261 "function f(a) { a(); } f(foo);");
232 Handle<JSFunction> f = v8::Utils::OpenHandle( 262 Handle<JSFunction> f = v8::Utils::OpenHandle(
233 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f")))); 263 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f"))));
234 // There should be one IC. 264 // There should be one IC.
235 Handle<TypeFeedbackVector> feedback_vector = 265 Handle<TypeFeedbackVector> feedback_vector =
236 Handle<TypeFeedbackVector>(f->shared()->feedback_vector(), isolate); 266 Handle<TypeFeedbackVector>(f->shared()->feedback_vector(), isolate);
237 FeedbackVectorICSlot slot(0); 267 FeedbackVectorSlot slot(0);
238 CallICNexus nexus(feedback_vector, slot); 268 CallICNexus nexus(feedback_vector, slot);
239 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback()); 269 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback());
240 // CallIC doesn't return map feedback. 270 // CallIC doesn't return map feedback.
241 CHECK(!nexus.FindFirstMap()); 271 CHECK(!nexus.FindFirstMap());
242 272
243 CompileRun("f(function() { return 16; })"); 273 CompileRun("f(function() { return 16; })");
244 CHECK_EQ(GENERIC, nexus.StateFromFeedback()); 274 CHECK_EQ(GENERIC, nexus.StateFromFeedback());
245 275
246 // After a collection, state should remain GENERIC. 276 // After a collection, state should remain GENERIC.
247 heap->CollectAllGarbage(); 277 heap->CollectAllGarbage();
(...skipping 21 matching lines...) Expand all
269 299
270 // Make sure function f has a call that uses a type feedback slot. 300 // Make sure function f has a call that uses a type feedback slot.
271 CompileRun( 301 CompileRun(
272 "var o = { foo: 3 };" 302 "var o = { foo: 3 };"
273 "function f(a) { return a.foo; } f(o);"); 303 "function f(a) { return a.foo; } f(o);");
274 Handle<JSFunction> f = v8::Utils::OpenHandle( 304 Handle<JSFunction> f = v8::Utils::OpenHandle(
275 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f")))); 305 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f"))));
276 // There should be one IC. 306 // There should be one IC.
277 Handle<TypeFeedbackVector> feedback_vector = 307 Handle<TypeFeedbackVector> feedback_vector =
278 Handle<TypeFeedbackVector>(f->shared()->feedback_vector(), isolate); 308 Handle<TypeFeedbackVector>(f->shared()->feedback_vector(), isolate);
279 FeedbackVectorICSlot slot(0); 309 FeedbackVectorSlot slot(0);
280 LoadICNexus nexus(feedback_vector, slot); 310 LoadICNexus nexus(feedback_vector, slot);
281 CHECK_EQ(PREMONOMORPHIC, nexus.StateFromFeedback()); 311 CHECK_EQ(PREMONOMORPHIC, nexus.StateFromFeedback());
282 312
283 CompileRun("f(o)"); 313 CompileRun("f(o)");
284 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback()); 314 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback());
285 // Verify that the monomorphic map is the one we expect. 315 // Verify that the monomorphic map is the one we expect.
286 Handle<JSObject> o = v8::Utils::OpenHandle( 316 Handle<JSObject> o = v8::Utils::OpenHandle(
287 *v8::Handle<v8::Object>::Cast(CcTest::global()->Get(v8_str("o")))); 317 *v8::Handle<v8::Object>::Cast(CcTest::global()->Get(v8_str("o"))));
288 CHECK_EQ(o->map(), nexus.FindFirstMap()); 318 CHECK_EQ(o->map(), nexus.FindFirstMap());
289 319
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
327 "function f() {" 357 "function f() {"
328 " var x = o + 10;" 358 " var x = o + 10;"
329 " return o + x + o;" 359 " return o + x + o;"
330 "}" 360 "}"
331 "f();"); 361 "f();");
332 Handle<JSFunction> f = v8::Utils::OpenHandle( 362 Handle<JSFunction> f = v8::Utils::OpenHandle(
333 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f")))); 363 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f"))));
334 // There should be one IC slot. 364 // There should be one IC slot.
335 Handle<TypeFeedbackVector> feedback_vector = 365 Handle<TypeFeedbackVector> feedback_vector =
336 Handle<TypeFeedbackVector>(f->shared()->feedback_vector(), isolate); 366 Handle<TypeFeedbackVector>(f->shared()->feedback_vector(), isolate);
337 CHECK_EQ(1, feedback_vector->ICSlots()); 367 FeedbackVectorHelper helper(feedback_vector);
338 FeedbackVectorICSlot slot(0); 368 CHECK_EQ(1, helper.slot_count());
369 FeedbackVectorSlot slot(0);
339 LoadICNexus nexus(feedback_vector, slot); 370 LoadICNexus nexus(feedback_vector, slot);
340 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback()); 371 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback());
341 } 372 }
342 373
343 374
344 TEST(VectorLoadICOnSmi) { 375 TEST(VectorLoadICOnSmi) {
345 if (i::FLAG_always_opt) return; 376 if (i::FLAG_always_opt) return;
346 CcTest::InitializeVM(); 377 CcTest::InitializeVM();
347 LocalContext context; 378 LocalContext context;
348 v8::HandleScope scope(context->GetIsolate()); 379 v8::HandleScope scope(context->GetIsolate());
349 Isolate* isolate = CcTest::i_isolate(); 380 Isolate* isolate = CcTest::i_isolate();
350 Heap* heap = isolate->heap(); 381 Heap* heap = isolate->heap();
351 382
352 // Make sure function f has a call that uses a type feedback slot. 383 // Make sure function f has a call that uses a type feedback slot.
353 CompileRun( 384 CompileRun(
354 "var o = { foo: 3 };" 385 "var o = { foo: 3 };"
355 "function f(a) { return a.foo; } f(o);"); 386 "function f(a) { return a.foo; } f(o);");
356 Handle<JSFunction> f = v8::Utils::OpenHandle( 387 Handle<JSFunction> f = v8::Utils::OpenHandle(
357 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f")))); 388 *v8::Handle<v8::Function>::Cast(CcTest::global()->Get(v8_str("f"))));
358 // There should be one IC. 389 // There should be one IC.
359 Handle<TypeFeedbackVector> feedback_vector = 390 Handle<TypeFeedbackVector> feedback_vector =
360 Handle<TypeFeedbackVector>(f->shared()->feedback_vector(), isolate); 391 Handle<TypeFeedbackVector>(f->shared()->feedback_vector(), isolate);
361 FeedbackVectorICSlot slot(0); 392 FeedbackVectorSlot slot(0);
362 LoadICNexus nexus(feedback_vector, slot); 393 LoadICNexus nexus(feedback_vector, slot);
363 CHECK_EQ(PREMONOMORPHIC, nexus.StateFromFeedback()); 394 CHECK_EQ(PREMONOMORPHIC, nexus.StateFromFeedback());
364 395
365 CompileRun("f(34)"); 396 CompileRun("f(34)");
366 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback()); 397 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback());
367 // Verify that the monomorphic map is the one we expect. 398 // Verify that the monomorphic map is the one we expect.
368 Map* number_map = heap->heap_number_map(); 399 Map* number_map = heap->heap_number_map();
369 CHECK_EQ(number_map, nexus.FindFirstMap()); 400 CHECK_EQ(number_map, nexus.FindFirstMap());
370 401
371 // Now go polymorphic on o. 402 // Now go polymorphic on o.
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
406 } 437 }
407 438
408 439
409 TEST(ReferenceContextAllocatesNoSlots) { 440 TEST(ReferenceContextAllocatesNoSlots) {
410 if (i::FLAG_always_opt) return; 441 if (i::FLAG_always_opt) return;
411 CcTest::InitializeVM(); 442 CcTest::InitializeVM();
412 LocalContext context; 443 LocalContext context;
413 v8::HandleScope scope(context->GetIsolate()); 444 v8::HandleScope scope(context->GetIsolate());
414 Isolate* isolate = CcTest::i_isolate(); 445 Isolate* isolate = CcTest::i_isolate();
415 446
416 CompileRun( 447 {
417 "function testvar(x) {" 448 CompileRun(
418 " y = x;" 449 "function testvar(x) {"
419 " y = a;" 450 " y = x;"
420 " return y;" 451 " y = a;"
421 "}" 452 " return y;"
422 "a = 3;" 453 "}"
423 "testvar({});"); 454 "a = 3;"
455 "testvar({});");
424 456
425 Handle<JSFunction> f = GetFunction("testvar"); 457 Handle<JSFunction> f = GetFunction("testvar");
426 458
427 // There should be two LOAD_ICs, one for a and one for y at the end. 459 // There should be two LOAD_ICs, one for a and one for y at the end.
428 Handle<TypeFeedbackVector> feedback_vector = 460 Handle<TypeFeedbackVector> feedback_vector =
429 handle(f->shared()->feedback_vector(), isolate); 461 handle(f->shared()->feedback_vector(), isolate);
430 if (FLAG_vector_stores) { 462 FeedbackVectorHelper helper(feedback_vector);
431 CHECK_EQ(4, feedback_vector->ICSlots()); 463 if (FLAG_vector_stores) {
432 CHECK_SLOT_KIND(feedback_vector, 0, FeedbackVectorSlotKind::STORE_IC); 464 CHECK_EQ(4, helper.slot_count());
433 CHECK_SLOT_KIND(feedback_vector, 1, FeedbackVectorSlotKind::LOAD_IC); 465 CHECK_SLOT_KIND(helper, 0, FeedbackVectorSlotKind::STORE_IC);
434 CHECK_SLOT_KIND(feedback_vector, 2, FeedbackVectorSlotKind::STORE_IC); 466 CHECK_SLOT_KIND(helper, 1, FeedbackVectorSlotKind::LOAD_IC);
435 CHECK_SLOT_KIND(feedback_vector, 3, FeedbackVectorSlotKind::LOAD_IC); 467 CHECK_SLOT_KIND(helper, 2, FeedbackVectorSlotKind::STORE_IC);
436 } else { 468 CHECK_SLOT_KIND(helper, 3, FeedbackVectorSlotKind::LOAD_IC);
437 CHECK_EQ(2, feedback_vector->ICSlots()); 469 } else {
438 CHECK_SLOT_KIND(feedback_vector, 0, FeedbackVectorSlotKind::LOAD_IC); 470 CHECK_EQ(2, helper.slot_count());
439 CHECK_SLOT_KIND(feedback_vector, 1, FeedbackVectorSlotKind::LOAD_IC); 471 CHECK_SLOT_KIND(helper, 0, FeedbackVectorSlotKind::LOAD_IC);
472 CHECK_SLOT_KIND(helper, 1, FeedbackVectorSlotKind::LOAD_IC);
473 }
440 } 474 }
441 475
442 CompileRun( 476 {
443 "function testprop(x) {" 477 CompileRun(
444 " x.blue = a;" 478 "function testprop(x) {"
445 "}" 479 " x.blue = a;"
446 "testprop({ blue: 3 });"); 480 "}"
481 "testprop({ blue: 3 });");
447 482
448 f = GetFunction("testprop"); 483 Handle<JSFunction> f = GetFunction("testprop");
449 484
450 // There should be one LOAD_IC, for the load of a. 485 // There should be one LOAD_IC, for the load of a.
451 feedback_vector = handle(f->shared()->feedback_vector(), isolate); 486 Handle<TypeFeedbackVector> feedback_vector(f->shared()->feedback_vector());
452 if (FLAG_vector_stores) { 487 FeedbackVectorHelper helper(feedback_vector);
453 CHECK_EQ(2, feedback_vector->ICSlots()); 488 if (FLAG_vector_stores) {
454 } else { 489 CHECK_EQ(2, helper.slot_count());
455 CHECK_EQ(1, feedback_vector->ICSlots()); 490 } else {
491 CHECK_EQ(1, helper.slot_count());
492 }
456 } 493 }
457 494
458 CompileRun( 495 {
459 "function testpropfunc(x) {" 496 CompileRun(
460 " x().blue = a;" 497 "function testpropfunc(x) {"
461 " return x().blue;" 498 " x().blue = a;"
462 "}" 499 " return x().blue;"
463 "function makeresult() { return { blue: 3 }; }" 500 "}"
464 "testpropfunc(makeresult);"); 501 "function makeresult() { return { blue: 3 }; }"
502 "testpropfunc(makeresult);");
465 503
466 f = GetFunction("testpropfunc"); 504 Handle<JSFunction> f = GetFunction("testpropfunc");
467 505
468 // There should be 2 LOAD_ICs and 2 CALL_ICs. 506 // There should be 2 LOAD_ICs and 2 CALL_ICs.
469 feedback_vector = handle(f->shared()->feedback_vector(), isolate); 507 Handle<TypeFeedbackVector> feedback_vector(f->shared()->feedback_vector());
470 if (FLAG_vector_stores) { 508 FeedbackVectorHelper helper(feedback_vector);
471 CHECK_EQ(5, feedback_vector->ICSlots()); 509 if (FLAG_vector_stores) {
472 CHECK_SLOT_KIND(feedback_vector, 0, FeedbackVectorSlotKind::CALL_IC); 510 CHECK_EQ(5, helper.slot_count());
473 CHECK_SLOT_KIND(feedback_vector, 1, FeedbackVectorSlotKind::LOAD_IC); 511 CHECK_SLOT_KIND(helper, 0, FeedbackVectorSlotKind::CALL_IC);
474 CHECK_SLOT_KIND(feedback_vector, 2, FeedbackVectorSlotKind::STORE_IC); 512 CHECK_SLOT_KIND(helper, 1, FeedbackVectorSlotKind::LOAD_IC);
475 CHECK_SLOT_KIND(feedback_vector, 3, FeedbackVectorSlotKind::CALL_IC); 513 CHECK_SLOT_KIND(helper, 2, FeedbackVectorSlotKind::STORE_IC);
476 CHECK_SLOT_KIND(feedback_vector, 4, FeedbackVectorSlotKind::LOAD_IC); 514 CHECK_SLOT_KIND(helper, 3, FeedbackVectorSlotKind::CALL_IC);
477 } else { 515 CHECK_SLOT_KIND(helper, 4, FeedbackVectorSlotKind::LOAD_IC);
478 CHECK_EQ(4, feedback_vector->ICSlots()); 516 } else {
479 CHECK_SLOT_KIND(feedback_vector, 0, FeedbackVectorSlotKind::CALL_IC); 517 CHECK_EQ(4, helper.slot_count());
480 CHECK_SLOT_KIND(feedback_vector, 1, FeedbackVectorSlotKind::LOAD_IC); 518 CHECK_SLOT_KIND(helper, 0, FeedbackVectorSlotKind::CALL_IC);
481 CHECK_SLOT_KIND(feedback_vector, 2, FeedbackVectorSlotKind::CALL_IC); 519 CHECK_SLOT_KIND(helper, 1, FeedbackVectorSlotKind::LOAD_IC);
482 CHECK_SLOT_KIND(feedback_vector, 3, FeedbackVectorSlotKind::LOAD_IC); 520 CHECK_SLOT_KIND(helper, 2, FeedbackVectorSlotKind::CALL_IC);
521 CHECK_SLOT_KIND(helper, 3, FeedbackVectorSlotKind::LOAD_IC);
522 }
483 } 523 }
484 524
485 CompileRun( 525 {
486 "function testkeyedprop(x) {" 526 CompileRun(
487 " x[0] = a;" 527 "function testkeyedprop(x) {"
488 " return x[0];" 528 " x[0] = a;"
489 "}" 529 " return x[0];"
490 "testkeyedprop([0, 1, 2]);"); 530 "}"
531 "testkeyedprop([0, 1, 2]);");
491 532
492 f = GetFunction("testkeyedprop"); 533 Handle<JSFunction> f = GetFunction("testkeyedprop");
493 534
494 // There should be 1 LOAD_ICs for the load of a, and one KEYED_LOAD_IC for the 535 // There should be 1 LOAD_ICs for the load of a, and one KEYED_LOAD_IC for
495 // load of x[0] in the return statement. 536 // the load of x[0] in the return statement.
496 feedback_vector = handle(f->shared()->feedback_vector(), isolate); 537 Handle<TypeFeedbackVector> feedback_vector(f->shared()->feedback_vector());
497 if (FLAG_vector_stores) { 538 FeedbackVectorHelper helper(feedback_vector);
498 CHECK_EQ(3, feedback_vector->ICSlots()); 539 if (FLAG_vector_stores) {
499 CHECK_SLOT_KIND(feedback_vector, 0, FeedbackVectorSlotKind::LOAD_IC); 540 CHECK_EQ(3, helper.slot_count());
500 CHECK_SLOT_KIND(feedback_vector, 1, FeedbackVectorSlotKind::KEYED_STORE_IC); 541 CHECK_SLOT_KIND(helper, 0, FeedbackVectorSlotKind::LOAD_IC);
501 CHECK_SLOT_KIND(feedback_vector, 2, FeedbackVectorSlotKind::KEYED_LOAD_IC); 542 CHECK_SLOT_KIND(helper, 1, FeedbackVectorSlotKind::KEYED_STORE_IC);
502 } else { 543 CHECK_SLOT_KIND(helper, 2, FeedbackVectorSlotKind::KEYED_LOAD_IC);
503 CHECK_EQ(2, feedback_vector->ICSlots()); 544 } else {
504 CHECK_SLOT_KIND(feedback_vector, 0, FeedbackVectorSlotKind::LOAD_IC); 545 CHECK_EQ(2, helper.slot_count());
505 CHECK_SLOT_KIND(feedback_vector, 1, FeedbackVectorSlotKind::KEYED_LOAD_IC); 546 CHECK_SLOT_KIND(helper, 0, FeedbackVectorSlotKind::LOAD_IC);
547 CHECK_SLOT_KIND(helper, 1, FeedbackVectorSlotKind::KEYED_LOAD_IC);
548 }
506 } 549 }
507 550
508 CompileRun( 551 {
509 "function testcompound(x) {" 552 CompileRun(
510 " x.old = x.young = x.in_between = a;" 553 "function testcompound(x) {"
511 " return x.old + x.young;" 554 " x.old = x.young = x.in_between = a;"
512 "}" 555 " return x.old + x.young;"
513 "testcompound({ old: 3, young: 3, in_between: 3 });"); 556 "}"
557 "testcompound({ old: 3, young: 3, in_between: 3 });");
514 558
515 f = GetFunction("testcompound"); 559 Handle<JSFunction> f = GetFunction("testcompound");
516 560
517 // There should be 3 LOAD_ICs, for load of a and load of x.old and x.young. 561 // There should be 3 LOAD_ICs, for load of a and load of x.old and x.young.
518 feedback_vector = handle(f->shared()->feedback_vector(), isolate); 562 Handle<TypeFeedbackVector> feedback_vector(f->shared()->feedback_vector());
519 if (FLAG_vector_stores) { 563 FeedbackVectorHelper helper(feedback_vector);
520 CHECK_EQ(6, feedback_vector->ICSlots()); 564 if (FLAG_vector_stores) {
521 CHECK_SLOT_KIND(feedback_vector, 0, FeedbackVectorSlotKind::LOAD_IC); 565 CHECK_EQ(6, helper.slot_count());
522 CHECK_SLOT_KIND(feedback_vector, 1, FeedbackVectorSlotKind::STORE_IC); 566 CHECK_SLOT_KIND(helper, 0, FeedbackVectorSlotKind::LOAD_IC);
523 CHECK_SLOT_KIND(feedback_vector, 2, FeedbackVectorSlotKind::STORE_IC); 567 CHECK_SLOT_KIND(helper, 1, FeedbackVectorSlotKind::STORE_IC);
524 CHECK_SLOT_KIND(feedback_vector, 3, FeedbackVectorSlotKind::STORE_IC); 568 CHECK_SLOT_KIND(helper, 2, FeedbackVectorSlotKind::STORE_IC);
525 CHECK_SLOT_KIND(feedback_vector, 4, FeedbackVectorSlotKind::LOAD_IC); 569 CHECK_SLOT_KIND(helper, 3, FeedbackVectorSlotKind::STORE_IC);
526 CHECK_SLOT_KIND(feedback_vector, 5, FeedbackVectorSlotKind::LOAD_IC); 570 CHECK_SLOT_KIND(helper, 4, FeedbackVectorSlotKind::LOAD_IC);
527 } else { 571 CHECK_SLOT_KIND(helper, 5, FeedbackVectorSlotKind::LOAD_IC);
528 CHECK_EQ(3, feedback_vector->ICSlots()); 572 } else {
529 CHECK_SLOT_KIND(feedback_vector, 0, FeedbackVectorSlotKind::LOAD_IC); 573 CHECK_EQ(3, helper.slot_count());
530 CHECK_SLOT_KIND(feedback_vector, 1, FeedbackVectorSlotKind::LOAD_IC); 574 CHECK_SLOT_KIND(helper, 0, FeedbackVectorSlotKind::LOAD_IC);
531 CHECK_SLOT_KIND(feedback_vector, 2, FeedbackVectorSlotKind::LOAD_IC); 575 CHECK_SLOT_KIND(helper, 1, FeedbackVectorSlotKind::LOAD_IC);
576 CHECK_SLOT_KIND(helper, 2, FeedbackVectorSlotKind::LOAD_IC);
577 }
532 } 578 }
533 } 579 }
534 580
535 581
536 TEST(VectorStoreICBasic) { 582 TEST(VectorStoreICBasic) {
537 if (i::FLAG_always_opt) return; 583 if (i::FLAG_always_opt) return;
538 if (!i::FLAG_vector_stores) return; 584 if (!i::FLAG_vector_stores) return;
539 585
540 CcTest::InitializeVM(); 586 CcTest::InitializeVM();
541 LocalContext context; 587 LocalContext context;
542 v8::HandleScope scope(context->GetIsolate()); 588 v8::HandleScope scope(context->GetIsolate());
543 Isolate* isolate = CcTest::i_isolate();
544 589
545 CompileRun( 590 CompileRun(
546 "function f(a) {" 591 "function f(a) {"
547 " a.foo = 5;" 592 " a.foo = 5;"
548 "}" 593 "}"
549 "var a = { foo: 3 };" 594 "var a = { foo: 3 };"
550 "f(a);" 595 "f(a);"
551 "f(a);" 596 "f(a);"
552 "f(a);"); 597 "f(a);");
553 Handle<JSFunction> f = GetFunction("f"); 598 Handle<JSFunction> f = GetFunction("f");
554 // There should be one IC slot. 599 // There should be one IC slot.
555 Handle<TypeFeedbackVector> feedback_vector = 600 Handle<TypeFeedbackVector> feedback_vector(f->shared()->feedback_vector());
556 Handle<TypeFeedbackVector>(f->shared()->feedback_vector(), isolate); 601 FeedbackVectorHelper helper(feedback_vector);
557 CHECK_EQ(1, feedback_vector->ICSlots()); 602 CHECK_EQ(1, helper.slot_count());
558 FeedbackVectorICSlot slot(0); 603 FeedbackVectorSlot slot(0);
559 StoreICNexus nexus(feedback_vector, slot); 604 StoreICNexus nexus(feedback_vector, slot);
560 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback()); 605 CHECK_EQ(MONOMORPHIC, nexus.StateFromFeedback());
561 } 606 }
562 607
563 } // namespace 608 } // namespace
OLDNEW
« no previous file with comments | « test/cctest/test-feedback-vector.h ('k') | test/cctest/test-heap.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698