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

Side by Side Diff: src/type-feedback-vector-inl.h

Issue 2472653002: [compiler] Sanitize IC counts for vector based ICs. (Closed)
Patch Set: Fix compile. Created 4 years, 1 month 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 | « src/runtime-profiler.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 #ifndef V8_TYPE_FEEDBACK_VECTOR_INL_H_ 5 #ifndef V8_TYPE_FEEDBACK_VECTOR_INL_H_
6 #define V8_TYPE_FEEDBACK_VECTOR_INL_H_ 6 #define V8_TYPE_FEEDBACK_VECTOR_INL_H_
7 7
8 #include "src/globals.h" 8 #include "src/globals.h"
9 #include "src/type-feedback-vector.h" 9 #include "src/type-feedback-vector.h"
10 10
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 default: 152 default:
153 return CompareOperationHint::kAny; 153 return CompareOperationHint::kAny;
154 } 154 }
155 UNREACHABLE(); 155 UNREACHABLE();
156 return CompareOperationHint::kNone; 156 return CompareOperationHint::kNone;
157 } 157 }
158 158
159 void TypeFeedbackVector::ComputeCounts(int* with_type_info, int* generic, 159 void TypeFeedbackVector::ComputeCounts(int* with_type_info, int* generic,
160 int* vector_ic_count, 160 int* vector_ic_count,
161 bool code_is_interpreted) { 161 bool code_is_interpreted) {
162 Object* uninitialized_sentinel =
163 TypeFeedbackVector::RawUninitializedSentinel(GetIsolate());
164 Object* megamorphic_sentinel = 162 Object* megamorphic_sentinel =
165 *TypeFeedbackVector::MegamorphicSentinel(GetIsolate()); 163 *TypeFeedbackVector::MegamorphicSentinel(GetIsolate());
166 int with = 0; 164 int with = 0;
167 int gen = 0; 165 int gen = 0;
168 int total = 0; 166 int total = 0;
169 TypeFeedbackMetadataIterator iter(metadata()); 167 TypeFeedbackMetadataIterator iter(metadata());
170 while (iter.HasNext()) { 168 while (iter.HasNext()) {
171 FeedbackVectorSlot slot = iter.Next(); 169 FeedbackVectorSlot slot = iter.Next();
172 FeedbackVectorSlotKind kind = iter.kind(); 170 FeedbackVectorSlotKind kind = iter.kind();
173 171
174 Object* obj = Get(slot); 172 Object* const obj = Get(slot);
175 if (kind == FeedbackVectorSlotKind::GENERAL) { 173 switch (kind) {
176 continue; 174 case FeedbackVectorSlotKind::CALL_IC:
177 } 175 case FeedbackVectorSlotKind::LOAD_IC:
178 total++; 176 case FeedbackVectorSlotKind::LOAD_GLOBAL_IC:
179 177 case FeedbackVectorSlotKind::KEYED_LOAD_IC:
180 if (obj != uninitialized_sentinel) { 178 case FeedbackVectorSlotKind::STORE_IC:
181 if (kind == FeedbackVectorSlotKind::INTERPRETER_COMPARE_IC || 179 case FeedbackVectorSlotKind::KEYED_STORE_IC: {
182 kind == FeedbackVectorSlotKind::INTERPRETER_BINARYOP_IC) { 180 if (obj->IsWeakCell() || obj->IsFixedArray() || obj->IsString()) {
183 // If we are not running interpreted code, we need to ignore 181 with++;
184 // the special ic slots for binaryop/compare used by the 182 } else if (obj == megamorphic_sentinel) {
185 // interpreter. 183 gen++;
186 // TODO(mvstanton): Remove code_is_interpreted when full code 184 }
187 // is retired from service. 185 total++;
188 if (!code_is_interpreted) continue; 186 break;
189 187 }
190 DCHECK(obj->IsSmi()); 188 case FeedbackVectorSlotKind::INTERPRETER_BINARYOP_IC:
191 int op_feedback = static_cast<int>(Smi::cast(obj)->value()); 189 case FeedbackVectorSlotKind::INTERPRETER_COMPARE_IC: {
192 if (kind == FeedbackVectorSlotKind::INTERPRETER_COMPARE_IC) { 190 // If we are not running interpreted code, we need to ignore the special
193 CompareOperationHint hint = 191 // IC slots for binaryop/compare used by the interpreter.
194 CompareOperationHintFromFeedback(op_feedback); 192 // TODO(mvstanton): Remove code_is_interpreted when full code is retired
195 if (hint == CompareOperationHint::kAny) { 193 // from service.
196 gen++; 194 if (code_is_interpreted) {
197 } else if (hint != CompareOperationHint::kNone) { 195 int const feedback = Smi::cast(obj)->value();
198 with++; 196 if (kind == FeedbackVectorSlotKind::INTERPRETER_COMPARE_IC) {
197 CompareOperationHint hint =
198 CompareOperationHintFromFeedback(feedback);
199 if (hint == CompareOperationHint::kAny) {
200 gen++;
201 } else if (hint != CompareOperationHint::kNone) {
202 with++;
203 }
204 } else {
205 DCHECK_EQ(FeedbackVectorSlotKind::INTERPRETER_BINARYOP_IC, kind);
206 BinaryOperationHint hint =
207 BinaryOperationHintFromFeedback(feedback);
208 if (hint == BinaryOperationHint::kAny) {
209 gen++;
210 } else if (hint != BinaryOperationHint::kNone) {
211 with++;
212 }
199 } 213 }
200 } else { 214 total++;
201 DCHECK(kind == FeedbackVectorSlotKind::INTERPRETER_BINARYOP_IC);
202 BinaryOperationHint hint =
203 BinaryOperationHintFromFeedback(op_feedback);
204 if (hint == BinaryOperationHint::kAny) {
205 gen++;
206 } else if (hint != BinaryOperationHint::kNone) {
207 with++;
208 }
209 } 215 }
210 } else if (obj->IsWeakCell() || obj->IsFixedArray() || obj->IsString()) { 216 break;
211 with++;
212 } else if (obj == megamorphic_sentinel) {
213 gen++;
214 } 217 }
218 case FeedbackVectorSlotKind::GENERAL:
219 break;
220 case FeedbackVectorSlotKind::INVALID:
221 case FeedbackVectorSlotKind::KINDS_NUMBER:
222 UNREACHABLE();
223 break;
215 } 224 }
216 } 225 }
217 226
218 *with_type_info = with; 227 *with_type_info = with;
219 *generic = gen; 228 *generic = gen;
220 *vector_ic_count = total; 229 *vector_ic_count = total;
221 } 230 }
222 231
223 Handle<Symbol> TypeFeedbackVector::UninitializedSentinel(Isolate* isolate) { 232 Handle<Symbol> TypeFeedbackVector::UninitializedSentinel(Isolate* isolate) {
224 return isolate->factory()->uninitialized_symbol(); 233 return isolate->factory()->uninitialized_symbol();
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
279 int index = vector()->GetIndex(slot()) + 1; 288 int index = vector()->GetIndex(slot()) + 1;
280 vector()->set(index, feedback_extra, mode); 289 vector()->set(index, feedback_extra, mode);
281 } 290 }
282 291
283 292
284 Isolate* FeedbackNexus::GetIsolate() const { return vector()->GetIsolate(); } 293 Isolate* FeedbackNexus::GetIsolate() const { return vector()->GetIsolate(); }
285 } // namespace internal 294 } // namespace internal
286 } // namespace v8 295 } // namespace v8
287 296
288 #endif // V8_TYPE_FEEDBACK_VECTOR_INL_H_ 297 #endif // V8_TYPE_FEEDBACK_VECTOR_INL_H_
OLDNEW
« no previous file with comments | « src/runtime-profiler.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698