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

Side by Side Diff: src/hydrogen.cc

Issue 143413019: Load elimination fix with a test case. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Review notes applied Created 6 years, 10 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 | « src/hydrogen.h ('k') | src/hydrogen-instructions.h » ('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 1181 matching lines...) Expand 10 before | Expand all | Expand 10 after
1192 1192
1193 1193
1194 void HGraphBuilder::AddIncrementCounter(StatsCounter* counter) { 1194 void HGraphBuilder::AddIncrementCounter(StatsCounter* counter) {
1195 if (FLAG_native_code_counters && counter->Enabled()) { 1195 if (FLAG_native_code_counters && counter->Enabled()) {
1196 HValue* reference = Add<HConstant>(ExternalReference(counter)); 1196 HValue* reference = Add<HConstant>(ExternalReference(counter));
1197 HValue* old_value = Add<HLoadNamedField>(reference, 1197 HValue* old_value = Add<HLoadNamedField>(reference,
1198 HObjectAccess::ForCounter()); 1198 HObjectAccess::ForCounter());
1199 HValue* new_value = AddUncasted<HAdd>(old_value, graph()->GetConstant1()); 1199 HValue* new_value = AddUncasted<HAdd>(old_value, graph()->GetConstant1());
1200 new_value->ClearFlag(HValue::kCanOverflow); // Ignore counter overflow 1200 new_value->ClearFlag(HValue::kCanOverflow); // Ignore counter overflow
1201 Add<HStoreNamedField>(reference, HObjectAccess::ForCounter(), 1201 Add<HStoreNamedField>(reference, HObjectAccess::ForCounter(),
1202 new_value); 1202 new_value, STORE_TO_INITIALIZED_ENTRY);
1203 } 1203 }
1204 } 1204 }
1205 1205
1206 1206
1207 void HGraphBuilder::AddSimulate(BailoutId id, 1207 void HGraphBuilder::AddSimulate(BailoutId id,
1208 RemovableSimulate removable) { 1208 RemovableSimulate removable) {
1209 ASSERT(current_block() != NULL); 1209 ASSERT(current_block() != NULL);
1210 ASSERT(!graph()->IsInsideNoSideEffectsScope()); 1210 ASSERT(!graph()->IsInsideNoSideEffectsScope());
1211 current_block()->AddNewSimulate(id, position_, removable); 1211 current_block()->AddNewSimulate(id, position_, removable);
1212 } 1212 }
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
1330 capacity_checker.Else(); 1330 capacity_checker.Else();
1331 1331
1332 environment()->Push(elements); 1332 environment()->Push(elements);
1333 capacity_checker.End(); 1333 capacity_checker.End();
1334 1334
1335 if (is_js_array) { 1335 if (is_js_array) {
1336 HValue* new_length = AddUncasted<HAdd>(key, graph_->GetConstant1()); 1336 HValue* new_length = AddUncasted<HAdd>(key, graph_->GetConstant1());
1337 new_length->ClearFlag(HValue::kCanOverflow); 1337 new_length->ClearFlag(HValue::kCanOverflow);
1338 1338
1339 Add<HStoreNamedField>(object, HObjectAccess::ForArrayLength(kind), 1339 Add<HStoreNamedField>(object, HObjectAccess::ForArrayLength(kind),
1340 new_length); 1340 new_length, INITIALIZING_STORE);
1341 } 1341 }
1342 1342
1343 if (is_store && kind == FAST_SMI_ELEMENTS) { 1343 if (is_store && kind == FAST_SMI_ELEMENTS) {
1344 HValue* checked_elements = environment()->Top(); 1344 HValue* checked_elements = environment()->Top();
1345 1345
1346 // Write zero to ensure that the new element is initialized with some smi. 1346 // Write zero to ensure that the new element is initialized with some smi.
1347 Add<HStoreKeyed>(checked_elements, key, graph()->GetConstant0(), kind); 1347 Add<HStoreKeyed>(checked_elements, key, graph()->GetConstant0(), kind,
1348 INITIALIZING_STORE);
1348 } 1349 }
1349 1350
1350 length_checker.Else(); 1351 length_checker.Else();
1351 Add<HBoundsCheck>(key, length); 1352 Add<HBoundsCheck>(key, length);
1352 1353
1353 environment()->Push(elements); 1354 environment()->Push(elements);
1354 length_checker.End(); 1355 length_checker.End();
1355 1356
1356 return environment()->Pop(); 1357 return environment()->Pop();
1357 } 1358 }
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1414 HInstruction* array_length = is_jsarray 1415 HInstruction* array_length = is_jsarray
1415 ? Add<HLoadNamedField>(object, HObjectAccess::ForArrayLength(from_kind)) 1416 ? Add<HLoadNamedField>(object, HObjectAccess::ForArrayLength(from_kind))
1416 : elements_length; 1417 : elements_length;
1417 1418
1418 BuildGrowElementsCapacity(object, elements, from_kind, to_kind, 1419 BuildGrowElementsCapacity(object, elements, from_kind, to_kind,
1419 array_length, elements_length); 1420 array_length, elements_length);
1420 1421
1421 if_builder.End(); 1422 if_builder.End();
1422 } 1423 }
1423 1424
1424 Add<HStoreNamedField>(object, HObjectAccess::ForMap(), map); 1425 Add<HStoreNamedField>(object, HObjectAccess::ForMap(), map,
1426 INITIALIZING_STORE);
1425 } 1427 }
1426 1428
1427 1429
1428 HValue* HGraphBuilder::BuildUncheckedDictionaryElementLoadHelper( 1430 HValue* HGraphBuilder::BuildUncheckedDictionaryElementLoadHelper(
1429 HValue* elements, 1431 HValue* elements,
1430 HValue* key, 1432 HValue* key,
1431 HValue* hash, 1433 HValue* hash,
1432 HValue* mask, 1434 HValue* mask,
1433 int current_probe) { 1435 int current_probe) {
1434 if (current_probe == kNumberDictionaryProbes) { 1436 if (current_probe == kNumberDictionaryProbes) {
(...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after
1801 if_onebyte.Else(); 1803 if_onebyte.Else();
1802 { 1804 {
1803 // We can safely skip the write barrier for storing the map here. 1805 // We can safely skip the write barrier for storing the map here.
1804 Handle<Map> map = isolate()->factory()->cons_string_map(); 1806 Handle<Map> map = isolate()->factory()->cons_string_map();
1805 AddStoreMapConstantNoWriteBarrier(result, map); 1807 AddStoreMapConstantNoWriteBarrier(result, map);
1806 } 1808 }
1807 if_onebyte.End(); 1809 if_onebyte.End();
1808 1810
1809 // Initialize the cons string fields. 1811 // Initialize the cons string fields.
1810 Add<HStoreNamedField>(result, HObjectAccess::ForStringHashField(), 1812 Add<HStoreNamedField>(result, HObjectAccess::ForStringHashField(),
1811 Add<HConstant>(String::kEmptyHashField)); 1813 Add<HConstant>(String::kEmptyHashField),
1812 Add<HStoreNamedField>(result, HObjectAccess::ForStringLength(), length); 1814 INITIALIZING_STORE);
1813 Add<HStoreNamedField>(result, HObjectAccess::ForConsStringFirst(), left); 1815 Add<HStoreNamedField>(result, HObjectAccess::ForStringLength(), length,
1814 Add<HStoreNamedField>(result, HObjectAccess::ForConsStringSecond(), right); 1816 INITIALIZING_STORE);
1817 Add<HStoreNamedField>(result, HObjectAccess::ForConsStringFirst(), left,
1818 INITIALIZING_STORE);
1819 Add<HStoreNamedField>(result, HObjectAccess::ForConsStringSecond(), right,
1820 INITIALIZING_STORE);
1815 1821
1816 // Count the native string addition. 1822 // Count the native string addition.
1817 AddIncrementCounter(isolate()->counters()->string_add_native()); 1823 AddIncrementCounter(isolate()->counters()->string_add_native());
1818 1824
1819 return result; 1825 return result;
1820 } 1826 }
1821 1827
1822 1828
1823 void HGraphBuilder::BuildCopySeqStringChars(HValue* src, 1829 void HGraphBuilder::BuildCopySeqStringChars(HValue* src,
1824 HValue* src_offset, 1830 HValue* src_offset,
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
1953 // Allocate the string object. HAllocate does not care whether we pass 1959 // Allocate the string object. HAllocate does not care whether we pass
1954 // STRING_TYPE or ASCII_STRING_TYPE here, so we just use STRING_TYPE here. 1960 // STRING_TYPE or ASCII_STRING_TYPE here, so we just use STRING_TYPE here.
1955 HAllocate* result = BuildAllocate( 1961 HAllocate* result = BuildAllocate(
1956 size, HType::String(), STRING_TYPE, allocation_mode); 1962 size, HType::String(), STRING_TYPE, allocation_mode);
1957 1963
1958 // We can safely skip the write barrier for storing map here. 1964 // We can safely skip the write barrier for storing map here.
1959 AddStoreMapNoWriteBarrier(result, map); 1965 AddStoreMapNoWriteBarrier(result, map);
1960 1966
1961 // Initialize the string fields. 1967 // Initialize the string fields.
1962 Add<HStoreNamedField>(result, HObjectAccess::ForStringHashField(), 1968 Add<HStoreNamedField>(result, HObjectAccess::ForStringHashField(),
1963 Add<HConstant>(String::kEmptyHashField)); 1969 Add<HConstant>(String::kEmptyHashField),
1964 Add<HStoreNamedField>(result, HObjectAccess::ForStringLength(), length); 1970 INITIALIZING_STORE);
1971 Add<HStoreNamedField>(result, HObjectAccess::ForStringLength(), length,
1972 INITIALIZING_STORE);
1965 1973
1966 // Copy characters to the result string. 1974 // Copy characters to the result string.
1967 IfBuilder if_twobyte(this); 1975 IfBuilder if_twobyte(this);
1968 if_twobyte.If<HCompareObjectEqAndBranch>(map, string_map); 1976 if_twobyte.If<HCompareObjectEqAndBranch>(map, string_map);
1969 if_twobyte.Then(); 1977 if_twobyte.Then();
1970 { 1978 {
1971 // Copy characters from the left string. 1979 // Copy characters from the left string.
1972 BuildCopySeqStringChars( 1980 BuildCopySeqStringChars(
1973 left, graph()->GetConstant0(), String::TWO_BYTE_ENCODING, 1981 left, graph()->GetConstant0(), String::TWO_BYTE_ENCODING,
1974 result, graph()->GetConstant0(), String::TWO_BYTE_ENCODING, 1982 result, graph()->GetConstant0(), String::TWO_BYTE_ENCODING,
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after
2251 void HGraphBuilder::BuildInitializeElementsHeader(HValue* elements, 2259 void HGraphBuilder::BuildInitializeElementsHeader(HValue* elements,
2252 ElementsKind kind, 2260 ElementsKind kind,
2253 HValue* capacity) { 2261 HValue* capacity) {
2254 Factory* factory = isolate()->factory(); 2262 Factory* factory = isolate()->factory();
2255 Handle<Map> map = IsFastDoubleElementsKind(kind) 2263 Handle<Map> map = IsFastDoubleElementsKind(kind)
2256 ? factory->fixed_double_array_map() 2264 ? factory->fixed_double_array_map()
2257 : factory->fixed_array_map(); 2265 : factory->fixed_array_map();
2258 2266
2259 AddStoreMapConstant(elements, map); 2267 AddStoreMapConstant(elements, map);
2260 Add<HStoreNamedField>(elements, HObjectAccess::ForFixedArrayLength(), 2268 Add<HStoreNamedField>(elements, HObjectAccess::ForFixedArrayLength(),
2261 capacity); 2269 capacity, INITIALIZING_STORE);
2262 } 2270 }
2263 2271
2264 2272
2265 HValue* HGraphBuilder::BuildAllocateElementsAndInitializeElementsHeader( 2273 HValue* HGraphBuilder::BuildAllocateElementsAndInitializeElementsHeader(
2266 ElementsKind kind, 2274 ElementsKind kind,
2267 HValue* capacity) { 2275 HValue* capacity) {
2268 // The HForceRepresentation is to prevent possible deopt on int-smi 2276 // The HForceRepresentation is to prevent possible deopt on int-smi
2269 // conversion after allocation but before the new object fields are set. 2277 // conversion after allocation but before the new object fields are set.
2270 capacity = AddUncasted<HForceRepresentation>(capacity, Representation::Smi()); 2278 capacity = AddUncasted<HForceRepresentation>(capacity, Representation::Smi());
2271 HValue* new_elements = BuildAllocateElements(kind, capacity); 2279 HValue* new_elements = BuildAllocateElements(kind, capacity);
2272 BuildInitializeElementsHeader(new_elements, kind, capacity); 2280 BuildInitializeElementsHeader(new_elements, kind, capacity);
2273 return new_elements; 2281 return new_elements;
2274 } 2282 }
2275 2283
2276 2284
2277 HInnerAllocatedObject* HGraphBuilder::BuildJSArrayHeader(HValue* array, 2285 HInnerAllocatedObject* HGraphBuilder::BuildJSArrayHeader(HValue* array,
2278 HValue* array_map, 2286 HValue* array_map,
2279 AllocationSiteMode mode, 2287 AllocationSiteMode mode,
2280 ElementsKind elements_kind, 2288 ElementsKind elements_kind,
2281 HValue* allocation_site_payload, 2289 HValue* allocation_site_payload,
2282 HValue* length_field) { 2290 HValue* length_field) {
2283 2291
2284 Add<HStoreNamedField>(array, HObjectAccess::ForMap(), array_map); 2292 Add<HStoreNamedField>(array, HObjectAccess::ForMap(), array_map,
2293 INITIALIZING_STORE);
2285 2294
2286 HConstant* empty_fixed_array = 2295 HConstant* empty_fixed_array =
2287 Add<HConstant>(isolate()->factory()->empty_fixed_array()); 2296 Add<HConstant>(isolate()->factory()->empty_fixed_array());
2288 2297
2289 HObjectAccess access = HObjectAccess::ForPropertiesPointer(); 2298 HObjectAccess access = HObjectAccess::ForPropertiesPointer();
2290 Add<HStoreNamedField>(array, access, empty_fixed_array); 2299 Add<HStoreNamedField>(array, access, empty_fixed_array, INITIALIZING_STORE);
2291 Add<HStoreNamedField>(array, HObjectAccess::ForArrayLength(elements_kind), 2300 Add<HStoreNamedField>(array, HObjectAccess::ForArrayLength(elements_kind),
2292 length_field); 2301 length_field, INITIALIZING_STORE);
2293 2302
2294 if (mode == TRACK_ALLOCATION_SITE) { 2303 if (mode == TRACK_ALLOCATION_SITE) {
2295 BuildCreateAllocationMemento( 2304 BuildCreateAllocationMemento(
2296 array, Add<HConstant>(JSArray::kSize), allocation_site_payload); 2305 array, Add<HConstant>(JSArray::kSize), allocation_site_payload);
2297 } 2306 }
2298 2307
2299 int elements_location = JSArray::kSize; 2308 int elements_location = JSArray::kSize;
2300 if (mode == TRACK_ALLOCATION_SITE) { 2309 if (mode == TRACK_ALLOCATION_SITE) {
2301 elements_location += AllocationMemento::kSize; 2310 elements_location += AllocationMemento::kSize;
2302 } 2311 }
2303 2312
2304 HInnerAllocatedObject* elements = Add<HInnerAllocatedObject>( 2313 HInnerAllocatedObject* elements = Add<HInnerAllocatedObject>(
2305 array, Add<HConstant>(elements_location)); 2314 array, Add<HConstant>(elements_location));
2306 Add<HStoreNamedField>(array, HObjectAccess::ForElementsPointer(), elements); 2315 Add<HStoreNamedField>(array, HObjectAccess::ForElementsPointer(), elements,
2316 INITIALIZING_STORE);
2307 return elements; 2317 return elements;
2308 } 2318 }
2309 2319
2310 2320
2311 HInstruction* HGraphBuilder::AddElementAccess( 2321 HInstruction* HGraphBuilder::AddElementAccess(
2312 HValue* elements, 2322 HValue* elements,
2313 HValue* checked_key, 2323 HValue* checked_key,
2314 HValue* val, 2324 HValue* val,
2315 HValue* dependency, 2325 HValue* dependency,
2316 ElementsKind elements_kind, 2326 ElementsKind elements_kind,
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
2387 BuildNewSpaceArrayCheck(new_capacity, new_kind); 2397 BuildNewSpaceArrayCheck(new_capacity, new_kind);
2388 2398
2389 HValue* new_elements = BuildAllocateElementsAndInitializeElementsHeader( 2399 HValue* new_elements = BuildAllocateElementsAndInitializeElementsHeader(
2390 new_kind, new_capacity); 2400 new_kind, new_capacity);
2391 2401
2392 BuildCopyElements(elements, kind, 2402 BuildCopyElements(elements, kind,
2393 new_elements, new_kind, 2403 new_elements, new_kind,
2394 length, new_capacity); 2404 length, new_capacity);
2395 2405
2396 Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(), 2406 Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(),
2397 new_elements); 2407 new_elements, INITIALIZING_STORE);
2398 2408
2399 return new_elements; 2409 return new_elements;
2400 } 2410 }
2401 2411
2402 2412
2403 void HGraphBuilder::BuildFillElementsWithHole(HValue* elements, 2413 void HGraphBuilder::BuildFillElementsWithHole(HValue* elements,
2404 ElementsKind elements_kind, 2414 ElementsKind elements_kind,
2405 HValue* from, 2415 HValue* from,
2406 HValue* to) { 2416 HValue* to) {
2407 // Fast elements kinds need to be initialized in case statements below cause 2417 // Fast elements kinds need to be initialized in case statements below cause
(...skipping 20 matching lines...) Expand all
2428 2438
2429 // Since we're about to store a hole value, the store instruction below must 2439 // Since we're about to store a hole value, the store instruction below must
2430 // assume an elements kind that supports heap object values. 2440 // assume an elements kind that supports heap object values.
2431 if (IsFastSmiOrObjectElementsKind(elements_kind)) { 2441 if (IsFastSmiOrObjectElementsKind(elements_kind)) {
2432 elements_kind = FAST_HOLEY_ELEMENTS; 2442 elements_kind = FAST_HOLEY_ELEMENTS;
2433 } 2443 }
2434 2444
2435 if (initial_capacity >= 0) { 2445 if (initial_capacity >= 0) {
2436 for (int i = 0; i < initial_capacity; i++) { 2446 for (int i = 0; i < initial_capacity; i++) {
2437 HInstruction* key = Add<HConstant>(i); 2447 HInstruction* key = Add<HConstant>(i);
2438 Add<HStoreKeyed>(elements, key, hole, elements_kind); 2448 Add<HStoreKeyed>(elements, key, hole, elements_kind,
2449 PREINITIALIZING_STORE);
2439 } 2450 }
2440 } else { 2451 } else {
2441 LoopBuilder builder(this, context(), LoopBuilder::kPostIncrement); 2452 LoopBuilder builder(this, context(), LoopBuilder::kPostIncrement);
2442 2453
2443 HValue* key = builder.BeginBody(from, to, Token::LT); 2454 HValue* key = builder.BeginBody(from, to, Token::LT);
2444 2455
2445 Add<HStoreKeyed>(elements, key, hole, elements_kind); 2456 Add<HStoreKeyed>(elements, key, hole, elements_kind, PREINITIALIZING_STORE);
2446 2457
2447 builder.EndBody(); 2458 builder.EndBody();
2448 } 2459 }
2449 } 2460 }
2450 2461
2451 2462
2452 void HGraphBuilder::BuildCopyElements(HValue* from_elements, 2463 void HGraphBuilder::BuildCopyElements(HValue* from_elements,
2453 ElementsKind from_elements_kind, 2464 ElementsKind from_elements_kind,
2454 HValue* to_elements, 2465 HValue* to_elements,
2455 ElementsKind to_elements_kind, 2466 ElementsKind to_elements_kind,
(...skipping 25 matching lines...) Expand all
2481 ? FAST_HOLEY_ELEMENTS : to_elements_kind; 2492 ? FAST_HOLEY_ELEMENTS : to_elements_kind;
2482 2493
2483 if (IsHoleyElementsKind(from_elements_kind) && 2494 if (IsHoleyElementsKind(from_elements_kind) &&
2484 from_elements_kind != to_elements_kind) { 2495 from_elements_kind != to_elements_kind) {
2485 IfBuilder if_hole(this); 2496 IfBuilder if_hole(this);
2486 if_hole.If<HCompareHoleAndBranch>(element); 2497 if_hole.If<HCompareHoleAndBranch>(element);
2487 if_hole.Then(); 2498 if_hole.Then();
2488 HConstant* hole_constant = IsFastDoubleElementsKind(to_elements_kind) 2499 HConstant* hole_constant = IsFastDoubleElementsKind(to_elements_kind)
2489 ? Add<HConstant>(FixedDoubleArray::hole_nan_as_double()) 2500 ? Add<HConstant>(FixedDoubleArray::hole_nan_as_double())
2490 : graph()->GetConstantHole(); 2501 : graph()->GetConstantHole();
2491 Add<HStoreKeyed>(to_elements, key, hole_constant, kind); 2502 Add<HStoreKeyed>(to_elements, key, hole_constant, kind,
2503 PREINITIALIZING_STORE);
2492 if_hole.Else(); 2504 if_hole.Else();
2493 HStoreKeyed* store = Add<HStoreKeyed>(to_elements, key, element, kind); 2505 HStoreKeyed* store = Add<HStoreKeyed>(to_elements, key, element, kind,
2506 INITIALIZING_STORE);
2494 store->SetFlag(HValue::kAllowUndefinedAsNaN); 2507 store->SetFlag(HValue::kAllowUndefinedAsNaN);
2495 if_hole.End(); 2508 if_hole.End();
2496 } else { 2509 } else {
2497 HStoreKeyed* store = Add<HStoreKeyed>(to_elements, key, element, kind); 2510 HStoreKeyed* store = Add<HStoreKeyed>(to_elements, key, element, kind,
2511 INITIALIZING_STORE);
2498 store->SetFlag(HValue::kAllowUndefinedAsNaN); 2512 store->SetFlag(HValue::kAllowUndefinedAsNaN);
2499 } 2513 }
2500 2514
2501 builder.EndBody(); 2515 builder.EndBody();
2502 2516
2503 if (!pre_fill_with_holes && length != capacity) { 2517 if (!pre_fill_with_holes && length != capacity) {
2504 // Fill unused capacity with the hole. 2518 // Fill unused capacity with the hole.
2505 BuildFillElementsWithHole(to_elements, to_elements_kind, 2519 BuildFillElementsWithHole(to_elements, to_elements_kind,
2506 key, capacity); 2520 key, capacity);
2507 } 2521 }
(...skipping 17 matching lines...) Expand all
2525 HInstruction* object = Add<HAllocate>(size_in_bytes, 2539 HInstruction* object = Add<HAllocate>(size_in_bytes,
2526 HType::JSObject(), 2540 HType::JSObject(),
2527 NOT_TENURED, 2541 NOT_TENURED,
2528 JS_OBJECT_TYPE); 2542 JS_OBJECT_TYPE);
2529 2543
2530 // Copy the JS array part. 2544 // Copy the JS array part.
2531 for (int i = 0; i < JSArray::kSize; i += kPointerSize) { 2545 for (int i = 0; i < JSArray::kSize; i += kPointerSize) {
2532 if ((i != JSArray::kElementsOffset) || (length == 0)) { 2546 if ((i != JSArray::kElementsOffset) || (length == 0)) {
2533 HObjectAccess access = HObjectAccess::ForJSArrayOffset(i); 2547 HObjectAccess access = HObjectAccess::ForJSArrayOffset(i);
2534 Add<HStoreNamedField>(object, access, 2548 Add<HStoreNamedField>(object, access,
2535 Add<HLoadNamedField>(boilerplate, access)); 2549 Add<HLoadNamedField>(boilerplate, access),
2550 INITIALIZING_STORE);
2536 } 2551 }
2537 } 2552 }
2538 2553
2539 // Create an allocation site info if requested. 2554 // Create an allocation site info if requested.
2540 if (mode == TRACK_ALLOCATION_SITE) { 2555 if (mode == TRACK_ALLOCATION_SITE) {
2541 BuildCreateAllocationMemento( 2556 BuildCreateAllocationMemento(
2542 object, Add<HConstant>(JSArray::kSize), allocation_site); 2557 object, Add<HConstant>(JSArray::kSize), allocation_site);
2543 } 2558 }
2544 2559
2545 if (length > 0) { 2560 if (length > 0) {
2546 HValue* boilerplate_elements = AddLoadElements(boilerplate); 2561 HValue* boilerplate_elements = AddLoadElements(boilerplate);
2547 HValue* object_elements; 2562 HValue* object_elements;
2548 if (IsFastDoubleElementsKind(kind)) { 2563 if (IsFastDoubleElementsKind(kind)) {
2549 HValue* elems_size = Add<HConstant>(FixedDoubleArray::SizeFor(length)); 2564 HValue* elems_size = Add<HConstant>(FixedDoubleArray::SizeFor(length));
2550 object_elements = Add<HAllocate>(elems_size, HType::JSArray(), 2565 object_elements = Add<HAllocate>(elems_size, HType::JSArray(),
2551 NOT_TENURED, FIXED_DOUBLE_ARRAY_TYPE); 2566 NOT_TENURED, FIXED_DOUBLE_ARRAY_TYPE);
2552 } else { 2567 } else {
2553 HValue* elems_size = Add<HConstant>(FixedArray::SizeFor(length)); 2568 HValue* elems_size = Add<HConstant>(FixedArray::SizeFor(length));
2554 object_elements = Add<HAllocate>(elems_size, HType::JSArray(), 2569 object_elements = Add<HAllocate>(elems_size, HType::JSArray(),
2555 NOT_TENURED, FIXED_ARRAY_TYPE); 2570 NOT_TENURED, FIXED_ARRAY_TYPE);
2556 } 2571 }
2557 Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(), 2572 Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(),
2558 object_elements); 2573 object_elements, INITIALIZING_STORE);
2559 2574
2560 // Copy the elements array header. 2575 // Copy the elements array header.
2561 for (int i = 0; i < FixedArrayBase::kHeaderSize; i += kPointerSize) { 2576 for (int i = 0; i < FixedArrayBase::kHeaderSize; i += kPointerSize) {
2562 HObjectAccess access = HObjectAccess::ForFixedArrayHeader(i); 2577 HObjectAccess access = HObjectAccess::ForFixedArrayHeader(i);
2563 Add<HStoreNamedField>(object_elements, access, 2578 Add<HStoreNamedField>(object_elements, access,
2564 Add<HLoadNamedField>(boilerplate_elements, access)); 2579 Add<HLoadNamedField>(boilerplate_elements, access),
2580 INITIALIZING_STORE);
2565 } 2581 }
2566 2582
2567 // Copy the elements array contents. 2583 // Copy the elements array contents.
2568 // TODO(mstarzinger): Teach HGraphBuilder::BuildCopyElements to unfold 2584 // TODO(mstarzinger): Teach HGraphBuilder::BuildCopyElements to unfold
2569 // copying loops with constant length up to a given boundary and use this 2585 // copying loops with constant length up to a given boundary and use this
2570 // helper here instead. 2586 // helper here instead.
2571 for (int i = 0; i < length; i++) { 2587 for (int i = 0; i < length; i++) {
2572 HValue* key_constant = Add<HConstant>(i); 2588 HValue* key_constant = Add<HConstant>(i);
2573 HInstruction* value = Add<HLoadKeyed>(boilerplate_elements, key_constant, 2589 HInstruction* value = Add<HLoadKeyed>(boilerplate_elements, key_constant,
2574 static_cast<HValue*>(NULL), kind); 2590 static_cast<HValue*>(NULL), kind);
2575 Add<HStoreKeyed>(object_elements, key_constant, value, kind); 2591 Add<HStoreKeyed>(object_elements, key_constant, value, kind,
2592 INITIALIZING_STORE);
2576 } 2593 }
2577 } 2594 }
2578 2595
2579 return object; 2596 return object;
2580 } 2597 }
2581 2598
2582 2599
2583 void HGraphBuilder::BuildCompareNil( 2600 void HGraphBuilder::BuildCompareNil(
2584 HValue* value, 2601 HValue* value,
2585 Type* type, 2602 Type* type,
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
2635 void HGraphBuilder::BuildCreateAllocationMemento( 2652 void HGraphBuilder::BuildCreateAllocationMemento(
2636 HValue* previous_object, 2653 HValue* previous_object,
2637 HValue* previous_object_size, 2654 HValue* previous_object_size,
2638 HValue* allocation_site) { 2655 HValue* allocation_site) {
2639 ASSERT(allocation_site != NULL); 2656 ASSERT(allocation_site != NULL);
2640 HInnerAllocatedObject* allocation_memento = Add<HInnerAllocatedObject>( 2657 HInnerAllocatedObject* allocation_memento = Add<HInnerAllocatedObject>(
2641 previous_object, previous_object_size); 2658 previous_object, previous_object_size);
2642 AddStoreMapConstant( 2659 AddStoreMapConstant(
2643 allocation_memento, isolate()->factory()->allocation_memento_map()); 2660 allocation_memento, isolate()->factory()->allocation_memento_map());
2644 Add<HStoreNamedField>( 2661 Add<HStoreNamedField>(
2645 allocation_memento, 2662 allocation_memento, HObjectAccess::ForAllocationMementoSite(),
2646 HObjectAccess::ForAllocationMementoSite(), 2663 allocation_site, INITIALIZING_STORE);
2647 allocation_site);
2648 if (FLAG_allocation_site_pretenuring) { 2664 if (FLAG_allocation_site_pretenuring) {
2649 HValue* memento_create_count = Add<HLoadNamedField>( 2665 HValue* memento_create_count = Add<HLoadNamedField>(
2650 allocation_site, HObjectAccess::ForAllocationSiteOffset( 2666 allocation_site, HObjectAccess::ForAllocationSiteOffset(
2651 AllocationSite::kPretenureCreateCountOffset)); 2667 AllocationSite::kPretenureCreateCountOffset));
2652 memento_create_count = AddUncasted<HAdd>( 2668 memento_create_count = AddUncasted<HAdd>(
2653 memento_create_count, graph()->GetConstant1()); 2669 memento_create_count, graph()->GetConstant1());
2654 // This smi value is reset to zero after every gc, overflow isn't a problem 2670 // This smi value is reset to zero after every gc, overflow isn't a problem
2655 // since the counter is bounded by the new space size. 2671 // since the counter is bounded by the new space size.
2656 memento_create_count->ClearFlag(HValue::kCanOverflow); 2672 memento_create_count->ClearFlag(HValue::kCanOverflow);
2657 HStoreNamedField* store = Add<HStoreNamedField>( 2673 HStoreNamedField* store = Add<HStoreNamedField>(
2658 allocation_site, HObjectAccess::ForAllocationSiteOffset( 2674 allocation_site, HObjectAccess::ForAllocationSiteOffset(
2659 AllocationSite::kPretenureCreateCountOffset), memento_create_count); 2675 AllocationSite::kPretenureCreateCountOffset), memento_create_count,
2676 INITIALIZING_STORE);
2660 // No write barrier needed to store a smi. 2677 // No write barrier needed to store a smi.
2661 store->SkipWriteBarrier(); 2678 store->SkipWriteBarrier();
2662 } 2679 }
2663 } 2680 }
2664 2681
2665 2682
2666 HInstruction* HGraphBuilder::BuildGetNativeContext(HValue* closure) { 2683 HInstruction* HGraphBuilder::BuildGetNativeContext(HValue* closure) {
2667 // Get the global context, then the native context 2684 // Get the global context, then the native context
2668 HInstruction* context = 2685 HInstruction* context =
2669 Add<HLoadNamedField>(closure, HObjectAccess::ForFunctionContextPointer()); 2686 Add<HLoadNamedField>(closure, HObjectAccess::ForFunctionContextPointer());
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
2864 graph()->GetConstant0(), capacity); 2881 graph()->GetConstant0(), capacity);
2865 } 2882 }
2866 2883
2867 return new_object; 2884 return new_object;
2868 } 2885 }
2869 2886
2870 2887
2871 HStoreNamedField* HGraphBuilder::AddStoreMapConstant(HValue *object, 2888 HStoreNamedField* HGraphBuilder::AddStoreMapConstant(HValue *object,
2872 Handle<Map> map) { 2889 Handle<Map> map) {
2873 return Add<HStoreNamedField>(object, HObjectAccess::ForMap(), 2890 return Add<HStoreNamedField>(object, HObjectAccess::ForMap(),
2874 Add<HConstant>(map)); 2891 Add<HConstant>(map), INITIALIZING_STORE);
2875 } 2892 }
2876 2893
2877 2894
2878 HValue* HGraphBuilder::AddLoadJSBuiltin(Builtins::JavaScript builtin) { 2895 HValue* HGraphBuilder::AddLoadJSBuiltin(Builtins::JavaScript builtin) {
2879 HGlobalObject* global_object = Add<HGlobalObject>(); 2896 HGlobalObject* global_object = Add<HGlobalObject>();
2880 HObjectAccess access = HObjectAccess::ForJSObjectOffset( 2897 HObjectAccess access = HObjectAccess::ForJSObjectOffset(
2881 GlobalObject::kBuiltinsOffset); 2898 GlobalObject::kBuiltinsOffset);
2882 HValue* builtins = Add<HLoadNamedField>(global_object, access); 2899 HValue* builtins = Add<HLoadNamedField>(global_object, access);
2883 HObjectAccess function_access = HObjectAccess::ForJSObjectOffset( 2900 HObjectAccess function_access = HObjectAccess::ForJSObjectOffset(
2884 JSBuiltinsObject::OffsetOfFunctionWithId(builtin)); 2901 JSBuiltinsObject::OffsetOfFunctionWithId(builtin));
(...skipping 2295 matching lines...) Expand 10 before | Expand all | Expand 10 after
5180 HValue* key = Add<HConstant>(i); 5197 HValue* key = Add<HConstant>(i);
5181 5198
5182 switch (boilerplate_elements_kind) { 5199 switch (boilerplate_elements_kind) {
5183 case FAST_SMI_ELEMENTS: 5200 case FAST_SMI_ELEMENTS:
5184 case FAST_HOLEY_SMI_ELEMENTS: 5201 case FAST_HOLEY_SMI_ELEMENTS:
5185 case FAST_ELEMENTS: 5202 case FAST_ELEMENTS:
5186 case FAST_HOLEY_ELEMENTS: 5203 case FAST_HOLEY_ELEMENTS:
5187 case FAST_DOUBLE_ELEMENTS: 5204 case FAST_DOUBLE_ELEMENTS:
5188 case FAST_HOLEY_DOUBLE_ELEMENTS: { 5205 case FAST_HOLEY_DOUBLE_ELEMENTS: {
5189 HStoreKeyed* instr = Add<HStoreKeyed>(elements, key, value, 5206 HStoreKeyed* instr = Add<HStoreKeyed>(elements, key, value,
5190 boilerplate_elements_kind); 5207 boilerplate_elements_kind,
5208 INITIALIZING_STORE);
5191 instr->SetUninitialized(uninitialized); 5209 instr->SetUninitialized(uninitialized);
5192 break; 5210 break;
5193 } 5211 }
5194 default: 5212 default:
5195 UNREACHABLE(); 5213 UNREACHABLE();
5196 break; 5214 break;
5197 } 5215 }
5198 5216
5199 Add<HSimulate>(expr->GetIdForElement(i)); 5217 Add<HSimulate>(expr->GetIdForElement(i));
5200 } 5218 }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
5256 field_access.WithRepresentation(Representation::Tagged()); 5274 field_access.WithRepresentation(Representation::Tagged());
5257 if (transition_to_field) { 5275 if (transition_to_field) {
5258 // The store requires a mutable HeapNumber to be allocated. 5276 // The store requires a mutable HeapNumber to be allocated.
5259 NoObservableSideEffectsScope no_side_effects(this); 5277 NoObservableSideEffectsScope no_side_effects(this);
5260 HInstruction* heap_number_size = Add<HConstant>(HeapNumber::kSize); 5278 HInstruction* heap_number_size = Add<HConstant>(HeapNumber::kSize);
5261 HInstruction* heap_number = Add<HAllocate>(heap_number_size, 5279 HInstruction* heap_number = Add<HAllocate>(heap_number_size,
5262 HType::HeapNumber(), isolate()->heap()->GetPretenureMode(), 5280 HType::HeapNumber(), isolate()->heap()->GetPretenureMode(),
5263 HEAP_NUMBER_TYPE); 5281 HEAP_NUMBER_TYPE);
5264 AddStoreMapConstant(heap_number, isolate()->factory()->heap_number_map()); 5282 AddStoreMapConstant(heap_number, isolate()->factory()->heap_number_map());
5265 Add<HStoreNamedField>(heap_number, HObjectAccess::ForHeapNumberValue(), 5283 Add<HStoreNamedField>(heap_number, HObjectAccess::ForHeapNumberValue(),
5266 value); 5284 value, INITIALIZING_STORE);
5267 instr = New<HStoreNamedField>(checked_object->ActualValue(), 5285 instr = New<HStoreNamedField>(checked_object->ActualValue(),
5268 heap_number_access, 5286 heap_number_access,
5269 heap_number); 5287 heap_number, INITIALIZING_STORE);
5270 } else { 5288 } else {
5271 // Already holds a HeapNumber; load the box and write its value field. 5289 // Already holds a HeapNumber; load the box and write its value field.
5272 HInstruction* heap_number = Add<HLoadNamedField>(checked_object, 5290 HInstruction* heap_number = Add<HLoadNamedField>(checked_object,
5273 heap_number_access); 5291 heap_number_access);
5274 heap_number->set_type(HType::HeapNumber()); 5292 heap_number->set_type(HType::HeapNumber());
5275 instr = New<HStoreNamedField>(heap_number, 5293 instr = New<HStoreNamedField>(heap_number,
5276 HObjectAccess::ForHeapNumberValue(), 5294 HObjectAccess::ForHeapNumberValue(),
5277 value); 5295 value, STORE_TO_INITIALIZED_ENTRY);
5278 } 5296 }
5279 } else { 5297 } else {
5280 // This is a normal store. 5298 // This is a normal store.
5281 instr = New<HStoreNamedField>( 5299 instr = New<HStoreNamedField>(
5282 checked_object->ActualValue(), field_access, value, 5300 checked_object->ActualValue(), field_access, value,
5283 transition_to_field ? INITIALIZING_STORE : STORE_TO_INITIALIZED_ENTRY); 5301 transition_to_field ? INITIALIZING_STORE : STORE_TO_INITIALIZED_ENTRY);
5284 } 5302 }
5285 5303
5286 if (transition_to_field) { 5304 if (transition_to_field) {
5287 Handle<Map> transition(lookup->GetTransitionMapFromMap(*map)); 5305 Handle<Map> transition(lookup->GetTransitionMapFromMap(*map));
(...skipping 2359 matching lines...) Expand 10 before | Expand all | Expand 10 after
7647 ? Add<HConstant>(factory->the_hole_value()) 7665 ? Add<HConstant>(factory->the_hole_value())
7648 : Add<HConstant>(nan_double); 7666 : Add<HConstant>(nan_double);
7649 if (IsFastSmiOrObjectElementsKind(elements_kind)) { 7667 if (IsFastSmiOrObjectElementsKind(elements_kind)) {
7650 elements_kind = FAST_HOLEY_ELEMENTS; 7668 elements_kind = FAST_HOLEY_ELEMENTS;
7651 } 7669 }
7652 AddElementAccess( 7670 AddElementAccess(
7653 elements, reduced_length, hole, bounds_check, elements_kind, true); 7671 elements, reduced_length, hole, bounds_check, elements_kind, true);
7654 } 7672 }
7655 Add<HStoreNamedField>( 7673 Add<HStoreNamedField>(
7656 checked_object, HObjectAccess::ForArrayLength(elements_kind), 7674 checked_object, HObjectAccess::ForArrayLength(elements_kind),
7657 reduced_length); 7675 reduced_length, STORE_TO_INITIALIZED_ENTRY);
7658 if (!ast_context()->IsEffect()) Push(result); 7676 if (!ast_context()->IsEffect()) Push(result);
7659 Add<HSimulate>(expr->id(), REMOVABLE_SIMULATE); 7677 Add<HSimulate>(expr->id(), REMOVABLE_SIMULATE);
7660 if (!ast_context()->IsEffect()) Drop(1); 7678 if (!ast_context()->IsEffect()) Drop(1);
7661 ast_context()->ReturnValue(result); 7679 ast_context()->ReturnValue(result);
7662 return true; 7680 return true;
7663 } 7681 }
7664 case kArrayPush: { 7682 case kArrayPush: {
7665 if (!expr->IsMonomorphic() || expr->check_type() != RECEIVER_MAP_CHECK) { 7683 if (!expr->IsMonomorphic() || expr->check_type() != RECEIVER_MAP_CHECK) {
7666 return false; 7684 return false;
7667 } 7685 }
(...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after
8068 // TODO(mvstanton): If all the arguments are constants in smi range, then 8086 // TODO(mvstanton): If all the arguments are constants in smi range, then
8069 // we could set fill_with_hole to false and save a few instructions. 8087 // we could set fill_with_hole to false and save a few instructions.
8070 JSArrayBuilder::FillMode fill_mode = IsFastSmiElementsKind(kind) 8088 JSArrayBuilder::FillMode fill_mode = IsFastSmiElementsKind(kind)
8071 ? JSArrayBuilder::FILL_WITH_HOLE 8089 ? JSArrayBuilder::FILL_WITH_HOLE
8072 : JSArrayBuilder::DONT_FILL_WITH_HOLE; 8090 : JSArrayBuilder::DONT_FILL_WITH_HOLE;
8073 new_object = array_builder.AllocateArray(length, length, fill_mode); 8091 new_object = array_builder.AllocateArray(length, length, fill_mode);
8074 HValue* elements = array_builder.GetElementsLocation(); 8092 HValue* elements = array_builder.GetElementsLocation();
8075 for (int i = 0; i < argument_count; i++) { 8093 for (int i = 0; i < argument_count; i++) {
8076 HValue* value = environment()->ExpressionStackAt(argument_count - i - 1); 8094 HValue* value = environment()->ExpressionStackAt(argument_count - i - 1);
8077 HValue* constant_i = Add<HConstant>(i); 8095 HValue* constant_i = Add<HConstant>(i);
8078 Add<HStoreKeyed>(elements, constant_i, value, kind); 8096 Add<HStoreKeyed>(elements, constant_i, value, kind, INITIALIZING_STORE);
8079 } 8097 }
8080 } 8098 }
8081 8099
8082 Drop(argument_count + 1); // drop constructor and args. 8100 Drop(argument_count + 1); // drop constructor and args.
8083 ast_context()->ReturnValue(new_object); 8101 ast_context()->ReturnValue(new_object);
8084 } 8102 }
8085 8103
8086 8104
8087 // Checks whether allocation using the given constructor can be inlined. 8105 // Checks whether allocation using the given constructor can be inlined.
8088 static bool IsAllocationInlineable(Handle<JSFunction> constructor) { 8106 static bool IsAllocationInlineable(Handle<JSFunction> constructor) {
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
8185 HValue* constructor_value = Add<HConstant>(constructor); 8203 HValue* constructor_value = Add<HConstant>(constructor);
8186 HValue* initial_map_value = 8204 HValue* initial_map_value =
8187 Add<HLoadNamedField>(constructor_value, HObjectAccess::ForJSObjectOffset( 8205 Add<HLoadNamedField>(constructor_value, HObjectAccess::ForJSObjectOffset(
8188 JSFunction::kPrototypeOrInitialMapOffset)); 8206 JSFunction::kPrototypeOrInitialMapOffset));
8189 8207
8190 // Initialize map and fields of the newly allocated object. 8208 // Initialize map and fields of the newly allocated object.
8191 { NoObservableSideEffectsScope no_effects(this); 8209 { NoObservableSideEffectsScope no_effects(this);
8192 ASSERT(initial_map->instance_type() == JS_OBJECT_TYPE); 8210 ASSERT(initial_map->instance_type() == JS_OBJECT_TYPE);
8193 Add<HStoreNamedField>(receiver, 8211 Add<HStoreNamedField>(receiver,
8194 HObjectAccess::ForJSObjectOffset(JSObject::kMapOffset), 8212 HObjectAccess::ForJSObjectOffset(JSObject::kMapOffset),
8195 initial_map_value); 8213 initial_map_value, INITIALIZING_STORE);
8196 HValue* empty_fixed_array = Add<HConstant>(factory->empty_fixed_array()); 8214 HValue* empty_fixed_array = Add<HConstant>(factory->empty_fixed_array());
8197 Add<HStoreNamedField>(receiver, 8215 Add<HStoreNamedField>(receiver,
8198 HObjectAccess::ForJSObjectOffset(JSObject::kPropertiesOffset), 8216 HObjectAccess::ForJSObjectOffset(JSObject::kPropertiesOffset),
8199 empty_fixed_array); 8217 empty_fixed_array, INITIALIZING_STORE);
8200 Add<HStoreNamedField>(receiver, 8218 Add<HStoreNamedField>(receiver,
8201 HObjectAccess::ForJSObjectOffset(JSObject::kElementsOffset), 8219 HObjectAccess::ForJSObjectOffset(JSObject::kElementsOffset),
8202 empty_fixed_array); 8220 empty_fixed_array, INITIALIZING_STORE);
8203 if (initial_map->inobject_properties() != 0) { 8221 if (initial_map->inobject_properties() != 0) {
8204 HConstant* undefined = graph()->GetConstantUndefined(); 8222 HConstant* undefined = graph()->GetConstantUndefined();
8205 for (int i = 0; i < initial_map->inobject_properties(); i++) { 8223 for (int i = 0; i < initial_map->inobject_properties(); i++) {
8206 int property_offset = JSObject::kHeaderSize + i * kPointerSize; 8224 int property_offset = JSObject::kHeaderSize + i * kPointerSize;
8207 Add<HStoreNamedField>(receiver, 8225 Add<HStoreNamedField>(receiver,
8208 HObjectAccess::ForJSObjectOffset(property_offset), 8226 HObjectAccess::ForJSObjectOffset(property_offset),
8209 undefined); 8227 undefined, PREINITIALIZING_STORE);
8210 } 8228 }
8211 } 8229 }
8212 } 8230 }
8213 8231
8214 // Replace the constructor function with a newly allocated receiver using 8232 // Replace the constructor function with a newly allocated receiver using
8215 // the index of the receiver from the top of the expression stack. 8233 // the index of the receiver from the top of the expression stack.
8216 const int receiver_index = argument_count - 1; 8234 const int receiver_index = argument_count - 1;
8217 ASSERT(environment()->ExpressionStackAt(receiver_index) == function); 8235 ASSERT(environment()->ExpressionStackAt(receiver_index) == function);
8218 environment()->SetExpressionStackAt(receiver_index, receiver); 8236 environment()->SetExpressionStackAt(receiver_index, receiver);
8219 8237
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
8284 HValue* obj, 8302 HValue* obj,
8285 HValue* buffer, 8303 HValue* buffer,
8286 HValue* byte_offset, 8304 HValue* byte_offset,
8287 HValue* byte_length) { 8305 HValue* byte_length) {
8288 8306
8289 for (int offset = ViewClass::kSize; 8307 for (int offset = ViewClass::kSize;
8290 offset < ViewClass::kSizeWithInternalFields; 8308 offset < ViewClass::kSizeWithInternalFields;
8291 offset += kPointerSize) { 8309 offset += kPointerSize) {
8292 Add<HStoreNamedField>(obj, 8310 Add<HStoreNamedField>(obj,
8293 HObjectAccess::ForJSObjectOffset(offset), 8311 HObjectAccess::ForJSObjectOffset(offset),
8294 Add<HConstant>(static_cast<int32_t>(0))); 8312 graph()->GetConstant0(), INITIALIZING_STORE);
8295 } 8313 }
8296 8314
8297 Add<HStoreNamedField>( 8315 Add<HStoreNamedField>(
8298 obj, 8316 obj,
8299 HObjectAccess::ForJSArrayBufferViewBuffer(), buffer); 8317 HObjectAccess::ForJSArrayBufferViewBuffer(), buffer, INITIALIZING_STORE);
8300 Add<HStoreNamedField>( 8318 Add<HStoreNamedField>(
8301 obj, 8319 obj,
8302 HObjectAccess::ForJSArrayBufferViewByteOffset(), 8320 HObjectAccess::ForJSArrayBufferViewByteOffset(),
8303 byte_offset); 8321 byte_offset, INITIALIZING_STORE);
8304 Add<HStoreNamedField>( 8322 Add<HStoreNamedField>(
8305 obj, 8323 obj,
8306 HObjectAccess::ForJSArrayBufferViewByteLength(), 8324 HObjectAccess::ForJSArrayBufferViewByteLength(),
8307 byte_length); 8325 byte_length, INITIALIZING_STORE);
8308 8326
8309 HObjectAccess weak_first_view_access = 8327 HObjectAccess weak_first_view_access =
8310 HObjectAccess::ForJSArrayBufferWeakFirstView(); 8328 HObjectAccess::ForJSArrayBufferWeakFirstView();
8311 Add<HStoreNamedField>(obj, 8329 Add<HStoreNamedField>(obj,
8312 HObjectAccess::ForJSArrayBufferViewWeakNext(), 8330 HObjectAccess::ForJSArrayBufferViewWeakNext(),
8313 Add<HLoadNamedField>(buffer, weak_first_view_access)); 8331 Add<HLoadNamedField>(buffer, weak_first_view_access),
8314 Add<HStoreNamedField>(buffer, weak_first_view_access, obj); 8332 INITIALIZING_STORE);
8333 Add<HStoreNamedField>(
8334 buffer, weak_first_view_access, obj, INITIALIZING_STORE);
8315 } 8335 }
8316 8336
8317 8337
8318 void HOptimizedGraphBuilder::VisitDataViewInitialize( 8338 void HOptimizedGraphBuilder::VisitDataViewInitialize(
8319 CallRuntime* expr) { 8339 CallRuntime* expr) {
8320 ZoneList<Expression*>* arguments = expr->arguments(); 8340 ZoneList<Expression*>* arguments = expr->arguments();
8321 8341
8322 NoObservableSideEffectsScope scope(this); 8342 NoObservableSideEffectsScope scope(this);
8323 ASSERT(arguments->length()== 4); 8343 ASSERT(arguments->length()== 4);
8324 CHECK_ALIVE(VisitForValue(arguments->at(0))); 8344 CHECK_ALIVE(VisitForValue(arguments->at(0)));
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
8394 8414
8395 ExternalArrayType array_type = kExternalInt8Array; // Bogus initialization. 8415 ExternalArrayType array_type = kExternalInt8Array; // Bogus initialization.
8396 size_t element_size = 1; // Bogus initialization. 8416 size_t element_size = 1; // Bogus initialization.
8397 Runtime::ArrayIdToTypeAndSize(array_id, &array_type, &element_size); 8417 Runtime::ArrayIdToTypeAndSize(array_id, &array_type, &element_size);
8398 8418
8399 HInstruction* length = AddUncasted<HDiv>(byte_length, 8419 HInstruction* length = AddUncasted<HDiv>(byte_length,
8400 Add<HConstant>(static_cast<int32_t>(element_size))); 8420 Add<HConstant>(static_cast<int32_t>(element_size)));
8401 8421
8402 Add<HStoreNamedField>(obj, 8422 Add<HStoreNamedField>(obj,
8403 HObjectAccess::ForJSTypedArrayLength(), 8423 HObjectAccess::ForJSTypedArrayLength(),
8404 length); 8424 length, INITIALIZING_STORE);
8405 8425
8406 HValue* elements = 8426 HValue* elements =
8407 Add<HAllocate>( 8427 Add<HAllocate>(
8408 Add<HConstant>(ExternalArray::kAlignedSize), 8428 Add<HConstant>(ExternalArray::kAlignedSize),
8409 HType::JSArray(), 8429 HType::JSArray(),
8410 NOT_TENURED, 8430 NOT_TENURED,
8411 static_cast<InstanceType>(FIRST_EXTERNAL_ARRAY_TYPE + array_type)); 8431 static_cast<InstanceType>(FIRST_EXTERNAL_ARRAY_TYPE + array_type));
8412 8432
8413 Handle<Map> external_array_map( 8433 Handle<Map> external_array_map(
8414 isolate()->heap()->MapForExternalArrayType(array_type)); 8434 isolate()->heap()->MapForExternalArrayType(array_type));
8415 Add<HStoreNamedField>(elements, 8435 AddStoreMapConstant(elements, external_array_map);
8416 HObjectAccess::ForMap(),
8417 Add<HConstant>(external_array_map));
8418 8436
8419 HValue* backing_store = Add<HLoadNamedField>( 8437 HValue* backing_store = Add<HLoadNamedField>(
8420 buffer, HObjectAccess::ForJSArrayBufferBackingStore()); 8438 buffer, HObjectAccess::ForJSArrayBufferBackingStore());
8421 8439
8422 HValue* typed_array_start; 8440 HValue* typed_array_start;
8423 if (is_zero_byte_offset) { 8441 if (is_zero_byte_offset) {
8424 typed_array_start = backing_store; 8442 typed_array_start = backing_store;
8425 } else { 8443 } else {
8426 HInstruction* external_pointer = 8444 HInstruction* external_pointer =
8427 AddUncasted<HAdd>(backing_store, byte_offset); 8445 AddUncasted<HAdd>(backing_store, byte_offset);
8428 // Arguments are checked prior to call to TypedArrayInitialize, 8446 // Arguments are checked prior to call to TypedArrayInitialize,
8429 // including byte_offset. 8447 // including byte_offset.
8430 external_pointer->ClearFlag(HValue::kCanOverflow); 8448 external_pointer->ClearFlag(HValue::kCanOverflow);
8431 typed_array_start = external_pointer; 8449 typed_array_start = external_pointer;
8432 } 8450 }
8433 8451
8434 Add<HStoreNamedField>(elements,
8435 HObjectAccess::ForExternalArrayExternalPointer(),
8436 typed_array_start);
8437 Add<HStoreNamedField>(elements,
8438 HObjectAccess::ForFixedArrayLength(),
8439 length);
8440 Add<HStoreNamedField>( 8452 Add<HStoreNamedField>(
8441 obj, HObjectAccess::ForElementsPointer(), elements); 8453 elements, HObjectAccess::ForExternalArrayExternalPointer(),
8454 typed_array_start, INITIALIZING_STORE);
8455 Add<HStoreNamedField>(
8456 elements, HObjectAccess::ForFixedArrayLength(), length,
8457 INITIALIZING_STORE);
8458 Add<HStoreNamedField>(
8459 obj, HObjectAccess::ForElementsPointer(), elements, INITIALIZING_STORE);
8442 } 8460 }
8443 8461
8444 if (!is_zero_byte_offset) { 8462 if (!is_zero_byte_offset) {
8445 byte_offset_smi.Else(); 8463 byte_offset_smi.Else();
8446 { // byte_offset is not Smi. 8464 { // byte_offset is not Smi.
8447 Push(Add<HPushArgument>(obj)); 8465 Push(Add<HPushArgument>(obj));
8448 VisitArgument(arguments->at(kArrayIdArg)); 8466 VisitArgument(arguments->at(kArrayIdArg));
8449 Push(Add<HPushArgument>(buffer)); 8467 Push(Add<HPushArgument>(buffer));
8450 Push(Add<HPushArgument>(byte_offset)); 8468 Push(Add<HPushArgument>(byte_offset));
8451 Push(Add<HPushArgument>(byte_length)); 8469 Push(Add<HPushArgument>(byte_length));
(...skipping 1216 matching lines...) Expand 10 before | Expand all | Expand 10 after
9668 ASSERT(boilerplate_object->properties()->length() == 0); 9686 ASSERT(boilerplate_object->properties()->length() == 0);
9669 9687
9670 Handle<Map> boilerplate_object_map(boilerplate_object->map()); 9688 Handle<Map> boilerplate_object_map(boilerplate_object->map());
9671 AddStoreMapConstant(object, boilerplate_object_map); 9689 AddStoreMapConstant(object, boilerplate_object_map);
9672 9690
9673 Handle<Object> properties_field = 9691 Handle<Object> properties_field =
9674 Handle<Object>(boilerplate_object->properties(), isolate()); 9692 Handle<Object>(boilerplate_object->properties(), isolate());
9675 ASSERT(*properties_field == isolate()->heap()->empty_fixed_array()); 9693 ASSERT(*properties_field == isolate()->heap()->empty_fixed_array());
9676 HInstruction* properties = Add<HConstant>(properties_field); 9694 HInstruction* properties = Add<HConstant>(properties_field);
9677 HObjectAccess access = HObjectAccess::ForPropertiesPointer(); 9695 HObjectAccess access = HObjectAccess::ForPropertiesPointer();
9678 Add<HStoreNamedField>(object, access, properties); 9696 Add<HStoreNamedField>(object, access, properties, INITIALIZING_STORE);
9679 9697
9680 if (boilerplate_object->IsJSArray()) { 9698 if (boilerplate_object->IsJSArray()) {
9681 Handle<JSArray> boilerplate_array = 9699 Handle<JSArray> boilerplate_array =
9682 Handle<JSArray>::cast(boilerplate_object); 9700 Handle<JSArray>::cast(boilerplate_object);
9683 Handle<Object> length_field = 9701 Handle<Object> length_field =
9684 Handle<Object>(boilerplate_array->length(), isolate()); 9702 Handle<Object>(boilerplate_array->length(), isolate());
9685 HInstruction* length = Add<HConstant>(length_field); 9703 HInstruction* length = Add<HConstant>(length_field);
9686 9704
9687 ASSERT(boilerplate_array->length()->IsSmi()); 9705 ASSERT(boilerplate_array->length()->IsSmi());
9688 Add<HStoreNamedField>(object, HObjectAccess::ForArrayLength( 9706 Add<HStoreNamedField>(object, HObjectAccess::ForArrayLength(
9689 boilerplate_array->GetElementsKind()), length); 9707 boilerplate_array->GetElementsKind()), length, INITIALIZING_STORE);
9690 } 9708 }
9691 } 9709 }
9692 9710
9693 9711
9694 void HOptimizedGraphBuilder::BuildInitElementsInObjectHeader( 9712 void HOptimizedGraphBuilder::BuildInitElementsInObjectHeader(
9695 Handle<JSObject> boilerplate_object, 9713 Handle<JSObject> boilerplate_object,
9696 HInstruction* object, 9714 HInstruction* object,
9697 HInstruction* object_elements) { 9715 HInstruction* object_elements) {
9698 ASSERT(boilerplate_object->properties()->length() == 0); 9716 ASSERT(boilerplate_object->properties()->length() == 0);
9699 if (object_elements == NULL) { 9717 if (object_elements == NULL) {
9700 Handle<Object> elements_field = 9718 Handle<Object> elements_field =
9701 Handle<Object>(boilerplate_object->elements(), isolate()); 9719 Handle<Object>(boilerplate_object->elements(), isolate());
9702 object_elements = Add<HConstant>(elements_field); 9720 object_elements = Add<HConstant>(elements_field);
9703 } 9721 }
9704 Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(), 9722 Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(),
9705 object_elements); 9723 object_elements, INITIALIZING_STORE);
9706 } 9724 }
9707 9725
9708 9726
9709 void HOptimizedGraphBuilder::BuildEmitInObjectProperties( 9727 void HOptimizedGraphBuilder::BuildEmitInObjectProperties(
9710 Handle<JSObject> boilerplate_object, 9728 Handle<JSObject> boilerplate_object,
9711 HInstruction* object, 9729 HInstruction* object,
9712 AllocationSiteUsageContext* site_context, 9730 AllocationSiteUsageContext* site_context,
9713 PretenureFlag pretenure_flag) { 9731 PretenureFlag pretenure_flag) {
9714 Handle<DescriptorArray> descriptors( 9732 Handle<DescriptorArray> descriptors(
9715 boilerplate_object->map()->instance_descriptors()); 9733 boilerplate_object->map()->instance_descriptors());
(...skipping 15 matching lines...) Expand all
9731 HObjectAccess access = boilerplate_object->IsJSArray() ? 9749 HObjectAccess access = boilerplate_object->IsJSArray() ?
9732 HObjectAccess::ForJSArrayOffset(property_offset) : 9750 HObjectAccess::ForJSArrayOffset(property_offset) :
9733 HObjectAccess::ForJSObjectOffset(property_offset); 9751 HObjectAccess::ForJSObjectOffset(property_offset);
9734 9752
9735 if (value->IsJSObject()) { 9753 if (value->IsJSObject()) {
9736 Handle<JSObject> value_object = Handle<JSObject>::cast(value); 9754 Handle<JSObject> value_object = Handle<JSObject>::cast(value);
9737 Handle<AllocationSite> current_site = site_context->EnterNewScope(); 9755 Handle<AllocationSite> current_site = site_context->EnterNewScope();
9738 HInstruction* result = 9756 HInstruction* result =
9739 BuildFastLiteral(value_object, site_context); 9757 BuildFastLiteral(value_object, site_context);
9740 site_context->ExitScope(current_site, value_object); 9758 site_context->ExitScope(current_site, value_object);
9741 Add<HStoreNamedField>(object, access, result); 9759 Add<HStoreNamedField>(object, access, result, INITIALIZING_STORE);
9742 } else { 9760 } else {
9743 Representation representation = details.representation(); 9761 Representation representation = details.representation();
9744 HInstruction* value_instruction; 9762 HInstruction* value_instruction;
9745 9763
9746 if (representation.IsDouble()) { 9764 if (representation.IsDouble()) {
9747 // Allocate a HeapNumber box and store the value into it. 9765 // Allocate a HeapNumber box and store the value into it.
9748 HValue* heap_number_constant = Add<HConstant>(HeapNumber::kSize); 9766 HValue* heap_number_constant = Add<HConstant>(HeapNumber::kSize);
9749 // This heap number alloc does not have a corresponding 9767 // This heap number alloc does not have a corresponding
9750 // AllocationSite. That is okay because 9768 // AllocationSite. That is okay because
9751 // 1) it's a child object of another object with a valid allocation site 9769 // 1) it's a child object of another object with a valid allocation site
9752 // 2) we can just use the mode of the parent object for pretenuring 9770 // 2) we can just use the mode of the parent object for pretenuring
9753 HInstruction* double_box = 9771 HInstruction* double_box =
9754 Add<HAllocate>(heap_number_constant, HType::HeapNumber(), 9772 Add<HAllocate>(heap_number_constant, HType::HeapNumber(),
9755 pretenure_flag, HEAP_NUMBER_TYPE); 9773 pretenure_flag, HEAP_NUMBER_TYPE);
9756 AddStoreMapConstant(double_box, 9774 AddStoreMapConstant(double_box,
9757 isolate()->factory()->heap_number_map()); 9775 isolate()->factory()->heap_number_map());
9758 Add<HStoreNamedField>(double_box, HObjectAccess::ForHeapNumberValue(), 9776 Add<HStoreNamedField>(double_box, HObjectAccess::ForHeapNumberValue(),
9759 Add<HConstant>(value)); 9777 Add<HConstant>(value), INITIALIZING_STORE);
9760 value_instruction = double_box; 9778 value_instruction = double_box;
9761 } else if (representation.IsSmi() && value->IsUninitialized()) { 9779 } else if (representation.IsSmi() && value->IsUninitialized()) {
9762 value_instruction = graph()->GetConstant0(); 9780 value_instruction = graph()->GetConstant0();
9763 } else { 9781 } else {
9764 value_instruction = Add<HConstant>(value); 9782 value_instruction = Add<HConstant>(value);
9765 } 9783 }
9766 9784
9767 Add<HStoreNamedField>(object, access, value_instruction); 9785 Add<HStoreNamedField>(object, access, value_instruction,
9786 INITIALIZING_STORE);
9768 } 9787 }
9769 } 9788 }
9770 9789
9771 int inobject_properties = boilerplate_object->map()->inobject_properties(); 9790 int inobject_properties = boilerplate_object->map()->inobject_properties();
9772 HInstruction* value_instruction = 9791 HInstruction* value_instruction =
9773 Add<HConstant>(isolate()->factory()->one_pointer_filler_map()); 9792 Add<HConstant>(isolate()->factory()->one_pointer_filler_map());
9774 for (int i = copied_fields; i < inobject_properties; i++) { 9793 for (int i = copied_fields; i < inobject_properties; i++) {
9775 ASSERT(boilerplate_object->IsJSObject()); 9794 ASSERT(boilerplate_object->IsJSObject());
9776 int property_offset = boilerplate_object->GetInObjectPropertyOffset(i); 9795 int property_offset = boilerplate_object->GetInObjectPropertyOffset(i);
9777 HObjectAccess access = HObjectAccess::ForJSObjectOffset(property_offset); 9796 HObjectAccess access = HObjectAccess::ForJSObjectOffset(property_offset);
9778 Add<HStoreNamedField>(object, access, value_instruction); 9797 Add<HStoreNamedField>(object, access, value_instruction,
9798 PREINITIALIZING_STORE);
9779 } 9799 }
9780 } 9800 }
9781 9801
9782 9802
9783 void HOptimizedGraphBuilder::BuildEmitElements( 9803 void HOptimizedGraphBuilder::BuildEmitElements(
9784 Handle<JSObject> boilerplate_object, 9804 Handle<JSObject> boilerplate_object,
9785 Handle<FixedArrayBase> elements, 9805 Handle<FixedArrayBase> elements,
9786 HValue* object_elements, 9806 HValue* object_elements,
9787 AllocationSiteUsageContext* site_context) { 9807 AllocationSiteUsageContext* site_context) {
9788 ElementsKind kind = boilerplate_object->map()->elements_kind(); 9808 ElementsKind kind = boilerplate_object->map()->elements_kind();
(...skipping 19 matching lines...) Expand all
9808 HValue* object_elements) { 9828 HValue* object_elements) {
9809 HInstruction* boilerplate_elements = Add<HConstant>(elements); 9829 HInstruction* boilerplate_elements = Add<HConstant>(elements);
9810 int elements_length = elements->length(); 9830 int elements_length = elements->length();
9811 for (int i = 0; i < elements_length; i++) { 9831 for (int i = 0; i < elements_length; i++) {
9812 HValue* key_constant = Add<HConstant>(i); 9832 HValue* key_constant = Add<HConstant>(i);
9813 HInstruction* value_instruction = 9833 HInstruction* value_instruction =
9814 Add<HLoadKeyed>(boilerplate_elements, key_constant, 9834 Add<HLoadKeyed>(boilerplate_elements, key_constant,
9815 static_cast<HValue*>(NULL), kind, 9835 static_cast<HValue*>(NULL), kind,
9816 ALLOW_RETURN_HOLE); 9836 ALLOW_RETURN_HOLE);
9817 HInstruction* store = Add<HStoreKeyed>(object_elements, key_constant, 9837 HInstruction* store = Add<HStoreKeyed>(object_elements, key_constant,
9818 value_instruction, kind); 9838 value_instruction, kind,
9839 INITIALIZING_STORE);
9819 store->SetFlag(HValue::kAllowUndefinedAsNaN); 9840 store->SetFlag(HValue::kAllowUndefinedAsNaN);
9820 } 9841 }
9821 } 9842 }
9822 9843
9823 9844
9824 void HOptimizedGraphBuilder::BuildEmitFixedArray( 9845 void HOptimizedGraphBuilder::BuildEmitFixedArray(
9825 Handle<FixedArrayBase> elements, 9846 Handle<FixedArrayBase> elements,
9826 ElementsKind kind, 9847 ElementsKind kind,
9827 HValue* object_elements, 9848 HValue* object_elements,
9828 AllocationSiteUsageContext* site_context) { 9849 AllocationSiteUsageContext* site_context) {
9829 HInstruction* boilerplate_elements = Add<HConstant>(elements); 9850 HInstruction* boilerplate_elements = Add<HConstant>(elements);
9830 int elements_length = elements->length(); 9851 int elements_length = elements->length();
9831 Handle<FixedArray> fast_elements = Handle<FixedArray>::cast(elements); 9852 Handle<FixedArray> fast_elements = Handle<FixedArray>::cast(elements);
9832 for (int i = 0; i < elements_length; i++) { 9853 for (int i = 0; i < elements_length; i++) {
9833 Handle<Object> value(fast_elements->get(i), isolate()); 9854 Handle<Object> value(fast_elements->get(i), isolate());
9834 HValue* key_constant = Add<HConstant>(i); 9855 HValue* key_constant = Add<HConstant>(i);
9835 if (value->IsJSObject()) { 9856 if (value->IsJSObject()) {
9836 Handle<JSObject> value_object = Handle<JSObject>::cast(value); 9857 Handle<JSObject> value_object = Handle<JSObject>::cast(value);
9837 Handle<AllocationSite> current_site = site_context->EnterNewScope(); 9858 Handle<AllocationSite> current_site = site_context->EnterNewScope();
9838 HInstruction* result = 9859 HInstruction* result =
9839 BuildFastLiteral(value_object, site_context); 9860 BuildFastLiteral(value_object, site_context);
9840 site_context->ExitScope(current_site, value_object); 9861 site_context->ExitScope(current_site, value_object);
9841 Add<HStoreKeyed>(object_elements, key_constant, result, kind); 9862 Add<HStoreKeyed>(object_elements, key_constant, result, kind,
9863 INITIALIZING_STORE);
9842 } else { 9864 } else {
9843 HInstruction* value_instruction = 9865 HInstruction* value_instruction =
9844 Add<HLoadKeyed>(boilerplate_elements, key_constant, 9866 Add<HLoadKeyed>(boilerplate_elements, key_constant,
9845 static_cast<HValue*>(NULL), kind, 9867 static_cast<HValue*>(NULL), kind,
9846 ALLOW_RETURN_HOLE); 9868 ALLOW_RETURN_HOLE);
9847 Add<HStoreKeyed>(object_elements, key_constant, value_instruction, kind); 9869 Add<HStoreKeyed>(object_elements, key_constant, value_instruction, kind,
9870 INITIALIZING_STORE);
9848 } 9871 }
9849 } 9872 }
9850 } 9873 }
9851 9874
9852 9875
9853 void HOptimizedGraphBuilder::VisitThisFunction(ThisFunction* expr) { 9876 void HOptimizedGraphBuilder::VisitThisFunction(ThisFunction* expr) {
9854 ASSERT(!HasStackOverflow()); 9877 ASSERT(!HasStackOverflow());
9855 ASSERT(current_block() != NULL); 9878 ASSERT(current_block() != NULL);
9856 ASSERT(current_block()->HasPredecessor()); 9879 ASSERT(current_block()->HasPredecessor());
9857 HInstruction* instr = BuildThisFunction(); 9880 HInstruction* instr = BuildThisFunction();
(...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after
10221 HBasicBlock* if_js_value = graph()->CreateBasicBlock(); 10244 HBasicBlock* if_js_value = graph()->CreateBasicBlock();
10222 HBasicBlock* not_js_value = graph()->CreateBasicBlock(); 10245 HBasicBlock* not_js_value = graph()->CreateBasicBlock();
10223 typecheck->SetSuccessorAt(0, if_js_value); 10246 typecheck->SetSuccessorAt(0, if_js_value);
10224 typecheck->SetSuccessorAt(1, not_js_value); 10247 typecheck->SetSuccessorAt(1, not_js_value);
10225 FinishCurrentBlock(typecheck); 10248 FinishCurrentBlock(typecheck);
10226 Goto(not_js_value, join); 10249 Goto(not_js_value, join);
10227 10250
10228 // Create in-object property store to kValueOffset. 10251 // Create in-object property store to kValueOffset.
10229 set_current_block(if_js_value); 10252 set_current_block(if_js_value);
10230 Add<HStoreNamedField>(object, 10253 Add<HStoreNamedField>(object,
10231 HObjectAccess::ForJSObjectOffset(JSValue::kValueOffset), value); 10254 HObjectAccess::ForJSObjectOffset(JSValue::kValueOffset), value,
10255 INITIALIZING_STORE);
10232 Goto(if_js_value, join); 10256 Goto(if_js_value, join);
10233 join->SetJoinId(call->id()); 10257 join->SetJoinId(call->id());
10234 set_current_block(join); 10258 set_current_block(join);
10235 return ast_context()->ReturnValue(value); 10259 return ast_context()->ReturnValue(value);
10236 } 10260 }
10237 10261
10238 10262
10239 // Fast support for charCodeAt(n). 10263 // Fast support for charCodeAt(n).
10240 void HOptimizedGraphBuilder::GenerateStringCharCodeAt(CallRuntime* call) { 10264 void HOptimizedGraphBuilder::GenerateStringCharCodeAt(CallRuntime* call) {
10241 ASSERT(call->arguments()->length() == 2); 10265 ASSERT(call->arguments()->length() == 2);
(...skipping 841 matching lines...) Expand 10 before | Expand all | Expand 10 after
11083 if (ShouldProduceTraceOutput()) { 11107 if (ShouldProduceTraceOutput()) {
11084 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 11108 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
11085 } 11109 }
11086 11110
11087 #ifdef DEBUG 11111 #ifdef DEBUG
11088 graph_->Verify(false); // No full verify. 11112 graph_->Verify(false); // No full verify.
11089 #endif 11113 #endif
11090 } 11114 }
11091 11115
11092 } } // namespace v8::internal 11116 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/hydrogen.h ('k') | src/hydrogen-instructions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698