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

Side by Side Diff: src/hydrogen.cc

Issue 133803002: Turn off global pretenuring when allocation site pretenuring is in use. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 11 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | 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 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 2225 matching lines...) Expand 10 before | Expand all | Expand 10 after
2236 } 2236 }
2237 2237
2238 HConstant* elements_size_value = Add<HConstant>(elements_size); 2238 HConstant* elements_size_value = Add<HConstant>(elements_size);
2239 HValue* mul = AddUncasted<HMul>(capacity, elements_size_value); 2239 HValue* mul = AddUncasted<HMul>(capacity, elements_size_value);
2240 mul->ClearFlag(HValue::kCanOverflow); 2240 mul->ClearFlag(HValue::kCanOverflow);
2241 2241
2242 HConstant* header_size = Add<HConstant>(FixedArray::kHeaderSize); 2242 HConstant* header_size = Add<HConstant>(FixedArray::kHeaderSize);
2243 HValue* total_size = AddUncasted<HAdd>(mul, header_size); 2243 HValue* total_size = AddUncasted<HAdd>(mul, header_size);
2244 total_size->ClearFlag(HValue::kCanOverflow); 2244 total_size->ClearFlag(HValue::kCanOverflow);
2245 2245
2246 return Add<HAllocate>(total_size, HType::JSArray(), 2246 PretenureFlag pretenure_flag = !FLAG_allocation_site_pretenuring ?
2247 isolate()->heap()->GetPretenureMode(), instance_type); 2247 isolate()->heap()->GetPretenureMode() : NOT_TENURED;
2248
2249 return Add<HAllocate>(total_size, HType::JSArray(), pretenure_flag,
2250 instance_type);
2248 } 2251 }
2249 2252
2250 2253
2251 void HGraphBuilder::BuildInitializeElementsHeader(HValue* elements, 2254 void HGraphBuilder::BuildInitializeElementsHeader(HValue* elements,
2252 ElementsKind kind, 2255 ElementsKind kind,
2253 HValue* capacity) { 2256 HValue* capacity) {
2254 Factory* factory = isolate()->factory(); 2257 Factory* factory = isolate()->factory();
2255 Handle<Map> map = IsFastDoubleElementsKind(kind) 2258 Handle<Map> map = IsFastDoubleElementsKind(kind)
2256 ? factory->fixed_double_array_map() 2259 ? factory->fixed_double_array_map()
2257 : factory->fixed_array_map(); 2260 : factory->fixed_array_map();
(...skipping 2993 matching lines...) Expand 10 before | Expand all | Expand 10 after
5251 bool transition_to_field = lookup->IsTransitionToField(*map); 5254 bool transition_to_field = lookup->IsTransitionToField(*map);
5252 5255
5253 HStoreNamedField *instr; 5256 HStoreNamedField *instr;
5254 if (FLAG_track_double_fields && field_access.representation().IsDouble()) { 5257 if (FLAG_track_double_fields && field_access.representation().IsDouble()) {
5255 HObjectAccess heap_number_access = 5258 HObjectAccess heap_number_access =
5256 field_access.WithRepresentation(Representation::Tagged()); 5259 field_access.WithRepresentation(Representation::Tagged());
5257 if (transition_to_field) { 5260 if (transition_to_field) {
5258 // The store requires a mutable HeapNumber to be allocated. 5261 // The store requires a mutable HeapNumber to be allocated.
5259 NoObservableSideEffectsScope no_side_effects(this); 5262 NoObservableSideEffectsScope no_side_effects(this);
5260 HInstruction* heap_number_size = Add<HConstant>(HeapNumber::kSize); 5263 HInstruction* heap_number_size = Add<HConstant>(HeapNumber::kSize);
5264
5265 PretenureFlag pretenure_flag = !FLAG_allocation_site_pretenuring ?
5266 isolate()->heap()->GetPretenureMode() : NOT_TENURED;
5267
5261 HInstruction* heap_number = Add<HAllocate>(heap_number_size, 5268 HInstruction* heap_number = Add<HAllocate>(heap_number_size,
5262 HType::HeapNumber(), isolate()->heap()->GetPretenureMode(), 5269 HType::HeapNumber(),
5270 pretenure_flag,
5263 HEAP_NUMBER_TYPE); 5271 HEAP_NUMBER_TYPE);
5264 AddStoreMapConstant(heap_number, isolate()->factory()->heap_number_map()); 5272 AddStoreMapConstant(heap_number, isolate()->factory()->heap_number_map());
5265 Add<HStoreNamedField>(heap_number, HObjectAccess::ForHeapNumberValue(), 5273 Add<HStoreNamedField>(heap_number, HObjectAccess::ForHeapNumberValue(),
5266 value); 5274 value);
5267 instr = New<HStoreNamedField>(checked_object->ActualValue(), 5275 instr = New<HStoreNamedField>(checked_object->ActualValue(),
5268 heap_number_access, 5276 heap_number_access,
5269 heap_number); 5277 heap_number);
5270 } else { 5278 } else {
5271 // Already holds a HeapNumber; load the box and write its value field. 5279 // Already holds a HeapNumber; load the box and write its value field.
5272 HInstruction* heap_number = Add<HLoadNamedField>(checked_object, 5280 HInstruction* heap_number = Add<HLoadNamedField>(checked_object,
(...skipping 2893 matching lines...) Expand 10 before | Expand all | Expand 10 after
8166 8174
8167 // Calculate instance size from initial map of constructor. 8175 // Calculate instance size from initial map of constructor.
8168 ASSERT(constructor->has_initial_map()); 8176 ASSERT(constructor->has_initial_map());
8169 Handle<Map> initial_map(constructor->initial_map()); 8177 Handle<Map> initial_map(constructor->initial_map());
8170 int instance_size = initial_map->instance_size(); 8178 int instance_size = initial_map->instance_size();
8171 ASSERT(initial_map->InitialPropertiesLength() == 0); 8179 ASSERT(initial_map->InitialPropertiesLength() == 0);
8172 8180
8173 // Allocate an instance of the implicit receiver object. 8181 // Allocate an instance of the implicit receiver object.
8174 HValue* size_in_bytes = Add<HConstant>(instance_size); 8182 HValue* size_in_bytes = Add<HConstant>(instance_size);
8175 PretenureFlag pretenure_flag = 8183 PretenureFlag pretenure_flag =
8176 (FLAG_pretenuring_call_new && 8184 (FLAG_pretenuring_call_new && !FLAG_allocation_site_pretenuring) ?
8177 isolate()->heap()->GetPretenureMode() == TENURED) 8185 isolate()->heap()->GetPretenureMode() : NOT_TENURED;
8178 ? TENURED : NOT_TENURED;
8179 HAllocate* receiver = 8186 HAllocate* receiver =
8180 Add<HAllocate>(size_in_bytes, HType::JSObject(), pretenure_flag, 8187 Add<HAllocate>(size_in_bytes, HType::JSObject(), pretenure_flag,
8181 JS_OBJECT_TYPE); 8188 JS_OBJECT_TYPE);
8182 receiver->set_known_initial_map(initial_map); 8189 receiver->set_known_initial_map(initial_map);
8183 8190
8184 // Load the initial map from the constructor. 8191 // Load the initial map from the constructor.
8185 HValue* constructor_value = Add<HConstant>(constructor); 8192 HValue* constructor_value = Add<HConstant>(constructor);
8186 HValue* initial_map_value = 8193 HValue* initial_map_value =
8187 Add<HLoadNamedField>(constructor_value, HObjectAccess::ForJSObjectOffset( 8194 Add<HLoadNamedField>(constructor_value, HObjectAccess::ForJSObjectOffset(
8188 JSFunction::kPrototypeOrInitialMapOffset)); 8195 JSFunction::kPrototypeOrInitialMapOffset));
(...skipping 742 matching lines...) Expand 10 before | Expand all | Expand 10 after
8931 HValue* HOptimizedGraphBuilder::BuildBinaryOperation( 8938 HValue* HOptimizedGraphBuilder::BuildBinaryOperation(
8932 BinaryOperation* expr, 8939 BinaryOperation* expr,
8933 HValue* left, 8940 HValue* left,
8934 HValue* right) { 8941 HValue* right) {
8935 Type* left_type = expr->left()->bounds().lower; 8942 Type* left_type = expr->left()->bounds().lower;
8936 Type* right_type = expr->right()->bounds().lower; 8943 Type* right_type = expr->right()->bounds().lower;
8937 Type* result_type = expr->bounds().lower; 8944 Type* result_type = expr->bounds().lower;
8938 Maybe<int> fixed_right_arg = expr->fixed_right_arg(); 8945 Maybe<int> fixed_right_arg = expr->fixed_right_arg();
8939 Handle<AllocationSite> allocation_site = expr->allocation_site(); 8946 Handle<AllocationSite> allocation_site = expr->allocation_site();
8940 8947
8948 PretenureFlag pretenure_flag = !FLAG_allocation_site_pretenuring ?
8949 isolate()->heap()->GetPretenureMode() : NOT_TENURED;
8950
8941 HAllocationMode allocation_mode = 8951 HAllocationMode allocation_mode =
8942 FLAG_allocation_site_pretenuring 8952 FLAG_allocation_site_pretenuring
8943 ? (allocation_site.is_null() 8953 ? (allocation_site.is_null()
8944 ? HAllocationMode(NOT_TENURED) 8954 ? HAllocationMode(NOT_TENURED)
8945 : HAllocationMode(allocation_site)) 8955 : HAllocationMode(allocation_site))
8946 : HAllocationMode(isolate()->heap()->GetPretenureMode()); 8956 : HAllocationMode(pretenure_flag);
8947 8957
8948 HValue* result = HGraphBuilder::BuildBinaryOperation( 8958 HValue* result = HGraphBuilder::BuildBinaryOperation(
8949 expr->op(), left, right, left_type, right_type, result_type, 8959 expr->op(), left, right, left_type, right_type, result_type,
8950 fixed_right_arg, allocation_mode); 8960 fixed_right_arg, allocation_mode);
8951 // Add a simulate after instructions with observable side effects, and 8961 // Add a simulate after instructions with observable side effects, and
8952 // after phis, which are the result of BuildBinaryOperation when we 8962 // after phis, which are the result of BuildBinaryOperation when we
8953 // inlined some complex subgraph. 8963 // inlined some complex subgraph.
8954 if (result->HasObservableSideEffects() || result->IsPhi()) { 8964 if (result->HasObservableSideEffects() || result->IsPhi()) {
8955 Push(result); 8965 Push(result);
8956 Add<HSimulate>(expr->id(), REMOVABLE_SIMULATE); 8966 Add<HSimulate>(expr->id(), REMOVABLE_SIMULATE);
(...skipping 2126 matching lines...) Expand 10 before | Expand all | Expand 10 after
11083 if (ShouldProduceTraceOutput()) { 11093 if (ShouldProduceTraceOutput()) {
11084 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 11094 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
11085 } 11095 }
11086 11096
11087 #ifdef DEBUG 11097 #ifdef DEBUG
11088 graph_->Verify(false); // No full verify. 11098 graph_->Verify(false); // No full verify.
11089 #endif 11099 #endif
11090 } 11100 }
11091 11101
11092 } } // namespace v8::internal 11102 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | test/cctest/test-heap.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698