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

Side by Side Diff: src/hydrogen.cc

Issue 9141016: Improve GVN handling of ElementTransitions. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fix comment nit Created 8 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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
63 predecessors_(2), 63 predecessors_(2),
64 dominator_(NULL), 64 dominator_(NULL),
65 dominated_blocks_(4), 65 dominated_blocks_(4),
66 last_environment_(NULL), 66 last_environment_(NULL),
67 argument_count_(-1), 67 argument_count_(-1),
68 first_instruction_index_(-1), 68 first_instruction_index_(-1),
69 last_instruction_index_(-1), 69 last_instruction_index_(-1),
70 deleted_phis_(4), 70 deleted_phis_(4),
71 parent_loop_header_(NULL), 71 parent_loop_header_(NULL),
72 is_inline_return_target_(false), 72 is_inline_return_target_(false),
73 is_deoptimizing_(false) { } 73 is_deoptimizing_(false),
74 dominates_loop_successors_(false) { }
74 75
75 76
76 void HBasicBlock::AttachLoopInformation() { 77 void HBasicBlock::AttachLoopInformation() {
77 ASSERT(!IsLoopHeader()); 78 ASSERT(!IsLoopHeader());
78 loop_information_ = new(zone()) HLoopInformation(this); 79 loop_information_ = new(zone()) HLoopInformation(this);
79 } 80 }
80 81
81 82
82 void HBasicBlock::DetachLoopInformation() { 83 void HBasicBlock::DetachLoopInformation() {
83 ASSERT(IsLoopHeader()); 84 ASSERT(IsLoopHeader());
(...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after
308 if (dominator_ != first) { 309 if (dominator_ != first) {
309 ASSERT(dominator_->dominated_blocks_.Contains(this)); 310 ASSERT(dominator_->dominated_blocks_.Contains(this));
310 dominator_->dominated_blocks_.RemoveElement(this); 311 dominator_->dominated_blocks_.RemoveElement(this);
311 dominator_ = first; 312 dominator_ = first;
312 first->AddDominatedBlock(this); 313 first->AddDominatedBlock(this);
313 } 314 }
314 } 315 }
315 } 316 }
316 317
317 318
319 void HBasicBlock::AssignLoopSuccessorDominators() {
320 // Mark blocks that dominate all subsequent reachable blocks inside their
321 // loop. Exploit the fact that blocks are sorted in reverse post order. When
322 // the loop is visited in increasing block id order, if the number of
323 // non-loop-exiting successor edges at the dominator_candidate block doesn't
324 // exceed the number of previously encountered predecessor edges, there is no
325 // path from the loop header to any block with higher id that doesn't go
326 // through the dominator_candidate block. In this case, the
327 // dominator_candidate block is guaranteed to dominate all blocks reachable
328 // from it with higher ids.
329 HBasicBlock* last = loop_information()->GetLastBackEdge();
330 int outstanding_successors = 1; // one edge from the pre-header
331 // Header always dominates everything.
332 MarkAsLoopSuccessorDominator();
333 for (int j = block_id(); j <= last->block_id(); ++j) {
334 HBasicBlock* dominator_candidate = graph_->blocks()->at(j);
335 for (HPredecessorIterator it(dominator_candidate); !it.Done();
336 it.Advance()) {
337 HBasicBlock* predecessor = it.Current();
338 // Don't count back edges.
339 if (predecessor->block_id() < dominator_candidate->block_id()) {
340 outstanding_successors--;
341 }
342 }
343
344 // If more successors than predecessors have been seen in the loop up to
345 // now, it's not possible to guarantee that the current block dominates
346 // all of the blocks with higher IDs. In this case, assume conservatively
347 // that those paths through loop that don't go through the current block
348 // contain all of the loop's dependencies. Also be careful to record
349 // dominator information about the current loop that's being processed,
350 // and not nested loops, which will be processed when
351 // AssignLoopSuccessorDominators gets called on their header.
352 ASSERT(outstanding_successors >= 0);
353 HBasicBlock* parent_loop_header = dominator_candidate->parent_loop_header();
354 if (outstanding_successors == 0 &&
355 (parent_loop_header == this && !dominator_candidate->IsLoopHeader())) {
356 dominator_candidate->MarkAsLoopSuccessorDominator();
357 }
358 HControlInstruction* end = dominator_candidate->end();
359 for (HSuccessorIterator it(end); !it.Done(); it.Advance()) {
360 HBasicBlock* successor = it.Current();
361 // Only count successors that remain inside the loop and don't loop back
362 // to a loop header.
363 if (successor->block_id() > dominator_candidate->block_id() &&
364 successor->block_id() <= last->block_id()) {
365 // Backwards edges must land on loop headers.
366 ASSERT(successor->block_id() > dominator_candidate->block_id() ||
367 successor->IsLoopHeader());
368 outstanding_successors++;
369 }
370 }
371 }
372 }
373
374
318 int HBasicBlock::PredecessorIndexOf(HBasicBlock* predecessor) const { 375 int HBasicBlock::PredecessorIndexOf(HBasicBlock* predecessor) const {
319 for (int i = 0; i < predecessors_.length(); ++i) { 376 for (int i = 0; i < predecessors_.length(); ++i) {
320 if (predecessors_[i] == predecessor) return i; 377 if (predecessors_[i] == predecessor) return i;
321 } 378 }
322 UNREACHABLE(); 379 UNREACHABLE();
323 return -1; 380 return -1;
324 } 381 }
325 382
326 383
327 #ifdef DEBUG 384 #ifdef DEBUG
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after
743 ASSERT(block->end()->SecondSuccessor() == NULL || 800 ASSERT(block->end()->SecondSuccessor() == NULL ||
744 order->Contains(block->end()->SecondSuccessor()) || 801 order->Contains(block->end()->SecondSuccessor()) ||
745 block->end()->SecondSuccessor()->IsLoopHeader()); 802 block->end()->SecondSuccessor()->IsLoopHeader());
746 order->Add(block); 803 order->Add(block);
747 } 804 }
748 805
749 806
750 void HGraph::AssignDominators() { 807 void HGraph::AssignDominators() {
751 HPhase phase("Assign dominators", this); 808 HPhase phase("Assign dominators", this);
752 for (int i = 0; i < blocks_.length(); ++i) { 809 for (int i = 0; i < blocks_.length(); ++i) {
753 if (blocks_[i]->IsLoopHeader()) { 810 HBasicBlock* block = blocks_[i];
811 if (block->IsLoopHeader()) {
754 // Only the first predecessor of a loop header is from outside the loop. 812 // Only the first predecessor of a loop header is from outside the loop.
755 // All others are back edges, and thus cannot dominate the loop header. 813 // All others are back edges, and thus cannot dominate the loop header.
756 blocks_[i]->AssignCommonDominator(blocks_[i]->predecessors()->first()); 814 block->AssignCommonDominator(block->predecessors()->first());
815 block->AssignLoopSuccessorDominators();
757 } else { 816 } else {
758 for (int j = blocks_[i]->predecessors()->length() - 1; j >= 0; --j) { 817 for (int j = blocks_[i]->predecessors()->length() - 1; j >= 0; --j) {
759 blocks_[i]->AssignCommonDominator(blocks_[i]->predecessors()->at(j)); 818 blocks_[i]->AssignCommonDominator(blocks_[i]->predecessors()->at(j));
760 } 819 }
761 } 820 }
762 } 821 }
763 } 822 }
764 823
765 // Mark all blocks that are dominated by an unconditional soft deoptimize to 824 // Mark all blocks that are dominated by an unconditional soft deoptimize to
766 // prevent code motion across those blocks. 825 // prevent code motion across those blocks.
(...skipping 597 matching lines...) Expand 10 before | Expand all | Expand 10 after
1364 1423
1365 private: 1424 private:
1366 GVNFlagSet CollectSideEffectsOnPathsToDominatedBlock( 1425 GVNFlagSet CollectSideEffectsOnPathsToDominatedBlock(
1367 HBasicBlock* dominator, 1426 HBasicBlock* dominator,
1368 HBasicBlock* dominated); 1427 HBasicBlock* dominated);
1369 void AnalyzeBlock(HBasicBlock* block, HValueMap* map); 1428 void AnalyzeBlock(HBasicBlock* block, HValueMap* map);
1370 void ComputeBlockSideEffects(); 1429 void ComputeBlockSideEffects();
1371 void LoopInvariantCodeMotion(); 1430 void LoopInvariantCodeMotion();
1372 void ProcessLoopBlock(HBasicBlock* block, 1431 void ProcessLoopBlock(HBasicBlock* block,
1373 HBasicBlock* before_loop, 1432 HBasicBlock* before_loop,
1374 GVNFlagSet loop_kills); 1433 GVNFlagSet loop_kills,
1434 GVNFlagSet* accumulated_first_time_depends);
1375 bool AllowCodeMotion(); 1435 bool AllowCodeMotion();
1376 bool ShouldMove(HInstruction* instr, HBasicBlock* loop_header); 1436 bool ShouldMove(HInstruction* instr, HBasicBlock* loop_header);
1377 1437
1378 HGraph* graph() { return graph_; } 1438 HGraph* graph() { return graph_; }
1379 CompilationInfo* info() { return info_; } 1439 CompilationInfo* info() { return info_; }
1380 Zone* zone() { return graph_->zone(); } 1440 Zone* zone() { return graph_->zone(); }
1381 1441
1382 HGraph* graph_; 1442 HGraph* graph_;
1383 CompilationInfo* info_; 1443 CompilationInfo* info_;
1384 bool removed_side_effects_; 1444 bool removed_side_effects_;
1385 1445
1386 // A map of block IDs to their side effects. 1446 // A map of block IDs to their side effects.
1387 ZoneList<GVNFlagSet> block_side_effects_; 1447 ZoneList<GVNFlagSet> block_side_effects_;
1388 1448
1389 // A map of loop header block IDs to their loop's side effects. 1449 // A map of loop header block IDs to their loop's side effects.
1390 ZoneList<GVNFlagSet> loop_side_effects_; 1450 ZoneList<GVNFlagSet> loop_side_effects_;
1391 1451
1392 // Used when collecting side effects on paths from dominator to 1452 // Used when collecting side effects on paths from dominator to
1393 // dominated. 1453 // dominated.
1394 SparseSet visited_on_paths_; 1454 SparseSet visited_on_paths_;
1395 }; 1455 };
1396 1456
1397 1457
1398 bool HGlobalValueNumberer::Analyze() { 1458 bool HGlobalValueNumberer::Analyze() {
1459 removed_side_effects_ = false;
1399 ComputeBlockSideEffects(); 1460 ComputeBlockSideEffects();
1400 if (FLAG_loop_invariant_code_motion) { 1461 if (FLAG_loop_invariant_code_motion) {
1401 LoopInvariantCodeMotion(); 1462 LoopInvariantCodeMotion();
1402 } 1463 }
1403 HValueMap* map = new(zone()) HValueMap(); 1464 HValueMap* map = new(zone()) HValueMap();
1404 AnalyzeBlock(graph_->entry_block(), map); 1465 AnalyzeBlock(graph_->entry_block(), map);
1405 return removed_side_effects_; 1466 return removed_side_effects_;
1406 } 1467 }
1407 1468
1408 1469
1409 void HGlobalValueNumberer::ComputeBlockSideEffects() { 1470 void HGlobalValueNumberer::ComputeBlockSideEffects() {
1471 // The Analyze phase of GVN can be called multiple times. Clear loop side
1472 // effects before computing them to erase the contents from previous Analyze
1473 // passes.
1474 for (int i = 0; i < loop_side_effects_.length(); ++i) {
1475 loop_side_effects_[i].RemoveAll();
1476 }
1410 for (int i = graph_->blocks()->length() - 1; i >= 0; --i) { 1477 for (int i = graph_->blocks()->length() - 1; i >= 0; --i) {
1411 // Compute side effects for the block. 1478 // Compute side effects for the block.
1412 HBasicBlock* block = graph_->blocks()->at(i); 1479 HBasicBlock* block = graph_->blocks()->at(i);
1413 HInstruction* instr = block->first(); 1480 HInstruction* instr = block->first();
1414 int id = block->block_id(); 1481 int id = block->block_id();
1415 GVNFlagSet side_effects; 1482 GVNFlagSet side_effects;
1416 while (instr != NULL) { 1483 while (instr != NULL) {
1417 side_effects.Add(instr->ChangesFlags()); 1484 side_effects.Add(instr->ChangesFlags());
1418 instr = instr->next(); 1485 instr = instr->next();
1419 } 1486 }
(...skipping 17 matching lines...) Expand all
1437 1504
1438 void HGlobalValueNumberer::LoopInvariantCodeMotion() { 1505 void HGlobalValueNumberer::LoopInvariantCodeMotion() {
1439 for (int i = graph_->blocks()->length() - 1; i >= 0; --i) { 1506 for (int i = graph_->blocks()->length() - 1; i >= 0; --i) {
1440 HBasicBlock* block = graph_->blocks()->at(i); 1507 HBasicBlock* block = graph_->blocks()->at(i);
1441 if (block->IsLoopHeader()) { 1508 if (block->IsLoopHeader()) {
1442 GVNFlagSet side_effects = loop_side_effects_[block->block_id()]; 1509 GVNFlagSet side_effects = loop_side_effects_[block->block_id()];
1443 TraceGVN("Try loop invariant motion for block B%d effects=0x%x\n", 1510 TraceGVN("Try loop invariant motion for block B%d effects=0x%x\n",
1444 block->block_id(), 1511 block->block_id(),
1445 side_effects.ToIntegral()); 1512 side_effects.ToIntegral());
1446 1513
1514 GVNFlagSet accumulated_first_time_depends;
1447 HBasicBlock* last = block->loop_information()->GetLastBackEdge(); 1515 HBasicBlock* last = block->loop_information()->GetLastBackEdge();
1448 for (int j = block->block_id(); j <= last->block_id(); ++j) { 1516 for (int j = block->block_id(); j <= last->block_id(); ++j) {
1449 ProcessLoopBlock(graph_->blocks()->at(j), block, side_effects); 1517 ProcessLoopBlock(graph_->blocks()->at(j), block, side_effects,
1518 &accumulated_first_time_depends);
1450 } 1519 }
1451 } 1520 }
1452 } 1521 }
1453 } 1522 }
1454 1523
1455 1524
1456 void HGlobalValueNumberer::ProcessLoopBlock(HBasicBlock* block, 1525 void HGlobalValueNumberer::ProcessLoopBlock(
1457 HBasicBlock* loop_header, 1526 HBasicBlock* block,
1458 GVNFlagSet loop_kills) { 1527 HBasicBlock* loop_header,
1528 GVNFlagSet loop_kills,
1529 GVNFlagSet* accumulated_first_time_depends) {
1459 HBasicBlock* pre_header = loop_header->predecessors()->at(0); 1530 HBasicBlock* pre_header = loop_header->predecessors()->at(0);
1460 GVNFlagSet depends_flags = HValue::ConvertChangesToDependsFlags(loop_kills); 1531 GVNFlagSet depends_flags = HValue::ConvertChangesToDependsFlags(loop_kills);
1461 TraceGVN("Loop invariant motion for B%d depends_flags=0x%x\n", 1532 TraceGVN("Loop invariant motion for B%d depends_flags=0x%x\n",
1462 block->block_id(), 1533 block->block_id(),
1463 depends_flags.ToIntegral()); 1534 depends_flags.ToIntegral());
1464 HInstruction* instr = block->first(); 1535 HInstruction* instr = block->first();
1465 while (instr != NULL) { 1536 while (instr != NULL) {
1466 HInstruction* next = instr->next(); 1537 HInstruction* next = instr->next();
1467 if (instr->CheckFlag(HValue::kUseGVN) && 1538 bool hoisted = false;
1468 !instr->gvn_flags().ContainsAnyOf(depends_flags)) { 1539 if (instr->CheckFlag(HValue::kUseGVN)) {
1469 TraceGVN("Checking instruction %d (%s)\n", 1540 TraceGVN("Checking instruction %d (%s) instruction GVN flags 0x%X, "
1541 "loop kills 0x%X\n",
1470 instr->id(), 1542 instr->id(),
1471 instr->Mnemonic()); 1543 instr->Mnemonic(),
1472 bool inputs_loop_invariant = true; 1544 instr->gvn_flags().ToIntegral(),
1473 for (int i = 0; i < instr->OperandCount(); ++i) { 1545 depends_flags.ToIntegral());
1474 if (instr->OperandAt(i)->IsDefinedAfter(pre_header)) { 1546 bool can_hoist = !instr->gvn_flags().ContainsAnyOf(depends_flags);
1475 inputs_loop_invariant = false; 1547 if (!can_hoist && instr->IsTransitionElementsKind()) {
1548 // It's only possible to hoist one time side effects if there are no
1549 // dependencies on their changes from the loop header to the current
1550 // instruction.
1551 GVNFlagSet converted_changes =
1552 HValue::ConvertChangesToDependsFlags(instr->ChangesFlags());
1553 TraceGVN("Checking dependencies on one-time instruction %d (%s) "
1554 "converted changes 0x%X, accumulated depends 0x%X\n",
1555 instr->id(),
1556 instr->Mnemonic(),
1557 converted_changes.ToIntegral(),
1558 accumulated_first_time_depends->ToIntegral());
1559 // It's possible to hoist one-time side effects from the current loop
1560 // loop only if they dominate all of the successor blocks in the same
1561 // loop and there are not any instructions that have Changes/DependsOn
1562 // that intervene between it and the beginning of the loop header.
1563 bool in_nested_loop = block != loop_header &&
1564 ((block->parent_loop_header() != loop_header) ||
1565 block->IsLoopHeader());
1566 can_hoist = !in_nested_loop &&
1567 block->IsLoopSuccessorDominator() &&
1568 !accumulated_first_time_depends->ContainsAnyOf(converted_changes);
1569 }
1570
1571 if (can_hoist) {
1572 bool inputs_loop_invariant = true;
1573 for (int i = 0; i < instr->OperandCount(); ++i) {
1574 if (instr->OperandAt(i)->IsDefinedAfter(pre_header)) {
1575 inputs_loop_invariant = false;
1576 }
1577 }
1578
1579 if (inputs_loop_invariant && ShouldMove(instr, loop_header)) {
1580 TraceGVN("Hoisting loop invariant instruction %d\n", instr->id());
1581 // Move the instruction out of the loop.
1582 instr->Unlink();
1583 instr->InsertBefore(pre_header->end());
1584 if (instr->HasSideEffects()) removed_side_effects_ = true;
1585 hoisted = true;
1476 } 1586 }
1477 } 1587 }
1478 1588 }
1479 if (inputs_loop_invariant && ShouldMove(instr, loop_header)) { 1589 if (!hoisted) {
1480 TraceGVN("Found loop invariant instruction %d\n", instr->id()); 1590 // If an instruction is not hoisted, we have to account for its side
1481 // Move the instruction out of the loop. 1591 // effects when hoisting later HTransitionElementsKind instructions.
1482 instr->Unlink(); 1592 accumulated_first_time_depends->Add(instr->DependsOnFlags());
1483 instr->InsertBefore(pre_header->end()); 1593 GVNFlagSet converted_changes =
1484 } 1594 HValue::ConvertChangesToDependsFlags(instr->SideEffectFlags());
1595 accumulated_first_time_depends->Add(converted_changes);
1485 } 1596 }
1486 instr = next; 1597 instr = next;
1487 } 1598 }
1488 } 1599 }
1489 1600
1490 1601
1491 bool HGlobalValueNumberer::AllowCodeMotion() { 1602 bool HGlobalValueNumberer::AllowCodeMotion() {
1492 return info()->shared_info()->opt_count() + 1 < Compiler::kDefaultMaxOptCount; 1603 return info()->shared_info()->opt_count() + 1 < Compiler::kDefaultMaxOptCount;
1493 } 1604 }
1494 1605
(...skipping 888 matching lines...) Expand 10 before | Expand all | Expand 10 after
2383 2494
2384 // Perform common subexpression elimination and loop-invariant code motion. 2495 // Perform common subexpression elimination and loop-invariant code motion.
2385 if (FLAG_use_gvn) { 2496 if (FLAG_use_gvn) {
2386 HPhase phase("Global value numbering", graph()); 2497 HPhase phase("Global value numbering", graph());
2387 HGlobalValueNumberer gvn(graph(), info()); 2498 HGlobalValueNumberer gvn(graph(), info());
2388 bool removed_side_effects = gvn.Analyze(); 2499 bool removed_side_effects = gvn.Analyze();
2389 // Trigger a second analysis pass to further eliminate duplicate values that 2500 // Trigger a second analysis pass to further eliminate duplicate values that
2390 // could only be discovered by removing side-effect-generating instructions 2501 // could only be discovered by removing side-effect-generating instructions
2391 // during the first pass. 2502 // during the first pass.
2392 if (FLAG_smi_only_arrays && removed_side_effects) { 2503 if (FLAG_smi_only_arrays && removed_side_effects) {
2393 gvn.Analyze(); 2504 removed_side_effects = gvn.Analyze();
2505 ASSERT(!removed_side_effects);
2394 } 2506 }
2395 } 2507 }
2396 2508
2397 if (FLAG_use_range) { 2509 if (FLAG_use_range) {
2398 HRangeAnalysis rangeAnalysis(graph()); 2510 HRangeAnalysis rangeAnalysis(graph());
2399 rangeAnalysis.Analyze(); 2511 rangeAnalysis.Analyze();
2400 } 2512 }
2401 graph()->ComputeMinusZeroChecks(); 2513 graph()->ComputeMinusZeroChecks();
2402 2514
2403 // Eliminate redundant stack checks on backwards branches. 2515 // Eliminate redundant stack checks on backwards branches.
(...skipping 4849 matching lines...) Expand 10 before | Expand all | Expand 10 after
7253 } else { 7365 } else {
7254 PrintIndent(); 7366 PrintIndent();
7255 trace_.Add("successors"); 7367 trace_.Add("successors");
7256 for (HSuccessorIterator it(current->end()); !it.Done(); it.Advance()) { 7368 for (HSuccessorIterator it(current->end()); !it.Done(); it.Advance()) {
7257 trace_.Add(" \"B%d\"", it.Current()->block_id()); 7369 trace_.Add(" \"B%d\"", it.Current()->block_id());
7258 } 7370 }
7259 trace_.Add("\n"); 7371 trace_.Add("\n");
7260 } 7372 }
7261 7373
7262 PrintEmptyProperty("xhandlers"); 7374 PrintEmptyProperty("xhandlers");
7263 PrintEmptyProperty("flags"); 7375 const char* flags = current->IsLoopSuccessorDominator()
7376 ? "dom-loop-succ"
7377 : "";
7378 PrintStringProperty("flags", flags);
7264 7379
7265 if (current->dominator() != NULL) { 7380 if (current->dominator() != NULL) {
7266 PrintBlockProperty("dominator", current->dominator()->block_id()); 7381 PrintBlockProperty("dominator", current->dominator()->block_id());
7267 } 7382 }
7268 7383
7269 PrintIntProperty("loop_depth", current->LoopNestingDepth()); 7384 PrintIntProperty("loop_depth", current->LoopNestingDepth());
7270 7385
7271 if (chunk != NULL) { 7386 if (chunk != NULL) {
7272 int first_index = current->first_instruction_index(); 7387 int first_index = current->first_instruction_index();
7273 int last_index = current->last_instruction_index(); 7388 int last_index = current->last_instruction_index();
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
7513 } 7628 }
7514 } 7629 }
7515 7630
7516 #ifdef DEBUG 7631 #ifdef DEBUG
7517 if (graph_ != NULL) graph_->Verify(false); // No full verify. 7632 if (graph_ != NULL) graph_->Verify(false); // No full verify.
7518 if (allocator_ != NULL) allocator_->Verify(); 7633 if (allocator_ != NULL) allocator_->Verify();
7519 #endif 7634 #endif
7520 } 7635 }
7521 7636
7522 } } // namespace v8::internal 7637 } } // 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