OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #ifndef VM_INTERMEDIATE_LANGUAGE_H_ | 5 #ifndef VM_INTERMEDIATE_LANGUAGE_H_ |
6 #define VM_INTERMEDIATE_LANGUAGE_H_ | 6 #define VM_INTERMEDIATE_LANGUAGE_H_ |
7 | 7 |
8 #include "vm/allocation.h" | 8 #include "vm/allocation.h" |
9 #include "vm/ast.h" | 9 #include "vm/ast.h" |
10 #include "vm/growable_array.h" | 10 #include "vm/growable_array.h" |
(...skipping 517 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
528 : deopt_id_(Isolate::Current()->GetNextDeoptId()), | 528 : deopt_id_(Isolate::Current()->GetNextDeoptId()), |
529 lifetime_position_(-1), | 529 lifetime_position_(-1), |
530 previous_(NULL), | 530 previous_(NULL), |
531 next_(NULL), | 531 next_(NULL), |
532 env_(NULL), | 532 env_(NULL), |
533 expr_id_(-1) { } | 533 expr_id_(-1) { } |
534 | 534 |
535 virtual Tag tag() const = 0; | 535 virtual Tag tag() const = 0; |
536 | 536 |
537 intptr_t deopt_id() const { | 537 intptr_t deopt_id() const { |
538 ASSERT(CanDeoptimize()); | 538 ASSERT(CanDeoptimize() || CanBeDeoptimizationTarget()); |
539 return deopt_id_; | 539 return deopt_id_; |
540 } | 540 } |
541 | 541 |
542 bool IsBlockEntry() { return (AsBlockEntry() != NULL); } | 542 bool IsBlockEntry() { return (AsBlockEntry() != NULL); } |
543 virtual BlockEntryInstr* AsBlockEntry() { return NULL; } | 543 virtual BlockEntryInstr* AsBlockEntry() { return NULL; } |
544 | 544 |
545 bool IsDefinition() { return (AsDefinition() != NULL); } | 545 bool IsDefinition() { return (AsDefinition() != NULL); } |
546 virtual Definition* AsDefinition() { return NULL; } | 546 virtual Definition* AsDefinition() { return NULL; } |
547 | 547 |
548 bool IsControl() { return (AsControl() != NULL); } | 548 bool IsControl() { return (AsControl() != NULL); } |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
721 bool Equals(Instruction* other) const; | 721 bool Equals(Instruction* other) const; |
722 | 722 |
723 // Compare attributes of a instructions (except input operands and tag). | 723 // Compare attributes of a instructions (except input operands and tag). |
724 // All instructions that participate in CSE have to override this function. | 724 // All instructions that participate in CSE have to override this function. |
725 // This function can assume that the argument has the same type as this. | 725 // This function can assume that the argument has the same type as this. |
726 virtual bool AttributesEqual(Instruction* other) const { | 726 virtual bool AttributesEqual(Instruction* other) const { |
727 UNREACHABLE(); | 727 UNREACHABLE(); |
728 return false; | 728 return false; |
729 } | 729 } |
730 | 730 |
| 731 virtual void InheritDeoptTarget(Instruction* other); |
| 732 |
| 733 bool NeedsEnvironment() const { |
| 734 return CanDeoptimize() || CanBeDeoptimizationTarget(); |
| 735 } |
| 736 |
| 737 virtual bool CanBeDeoptimizationTarget() const { |
| 738 return false; |
| 739 } |
| 740 |
| 741 void InheritDeoptTargetAfter(Instruction* other); |
| 742 |
731 protected: | 743 protected: |
732 // Fetch deopt id without checking if this computation can deoptimize. | 744 // Fetch deopt id without checking if this computation can deoptimize. |
733 intptr_t GetDeoptId() const { | 745 intptr_t GetDeoptId() const { |
734 return deopt_id_; | 746 return deopt_id_; |
735 } | 747 } |
736 | 748 |
737 private: | 749 private: |
738 friend class Definition; // Needed for InsertBefore, InsertAfter. | 750 friend class Definition; // Needed for InsertBefore, InsertAfter. |
739 | 751 |
740 // Classes that set deopt_id_. | 752 // Classes that set deopt_id_. |
(...skipping 12 matching lines...) Expand all Loading... |
753 friend class CheckArrayBoundInstr; | 765 friend class CheckArrayBoundInstr; |
754 friend class CheckEitherNonSmiInstr; | 766 friend class CheckEitherNonSmiInstr; |
755 friend class LICM; | 767 friend class LICM; |
756 friend class DoubleToSmiInstr; | 768 friend class DoubleToSmiInstr; |
757 friend class DoubleToDoubleInstr; | 769 friend class DoubleToDoubleInstr; |
758 friend class InvokeMathCFunctionInstr; | 770 friend class InvokeMathCFunctionInstr; |
759 friend class FlowGraphOptimizer; | 771 friend class FlowGraphOptimizer; |
760 friend class LoadIndexedInstr; | 772 friend class LoadIndexedInstr; |
761 friend class StoreIndexedInstr; | 773 friend class StoreIndexedInstr; |
762 friend class StoreInstanceFieldInstr; | 774 friend class StoreInstanceFieldInstr; |
| 775 friend class ControlInstruction; |
| 776 friend class ComparisonInstr; |
| 777 friend class TargetEntryInstr; |
| 778 friend class JoinEntryInstr; |
763 | 779 |
764 virtual void RawSetInputAt(intptr_t i, Value* value) = 0; | 780 virtual void RawSetInputAt(intptr_t i, Value* value) = 0; |
765 | 781 |
766 intptr_t deopt_id_; | 782 intptr_t deopt_id_; |
767 intptr_t lifetime_position_; // Position used by register allocator. | 783 intptr_t lifetime_position_; // Position used by register allocator. |
768 Instruction* previous_; | 784 Instruction* previous_; |
769 Instruction* next_; | 785 Instruction* next_; |
770 Environment* env_; | 786 Environment* env_; |
771 intptr_t expr_id_; | 787 intptr_t expr_id_; |
772 | 788 |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
974 intptr_t fixed_parameter_count); | 990 intptr_t fixed_parameter_count); |
975 | 991 |
976 virtual intptr_t InputCount() const { return 0; } | 992 virtual intptr_t InputCount() const { return 0; } |
977 virtual Value* InputAt(intptr_t i) const { | 993 virtual Value* InputAt(intptr_t i) const { |
978 UNREACHABLE(); | 994 UNREACHABLE(); |
979 return NULL; | 995 return NULL; |
980 } | 996 } |
981 | 997 |
982 virtual intptr_t ArgumentCount() const { return 0; } | 998 virtual intptr_t ArgumentCount() const { return 0; } |
983 | 999 |
| 1000 virtual bool CanBeDeoptimizationTarget() const { |
| 1001 // BlockEntry environment is copied to Goto and Branch instructions |
| 1002 // when we insert new blocks targeting this block. |
| 1003 return true; |
| 1004 } |
| 1005 |
984 virtual bool CanDeoptimize() const { return false; } | 1006 virtual bool CanDeoptimize() const { return false; } |
985 | 1007 |
986 virtual bool HasSideEffect() const { return false; } | 1008 virtual bool HasSideEffect() const { return false; } |
987 | 1009 |
988 intptr_t try_index() const { return try_index_; } | 1010 intptr_t try_index() const { return try_index_; } |
989 | 1011 |
990 BitVector* loop_info() const { return loop_info_; } | 1012 BitVector* loop_info() const { return loop_info_; } |
991 void set_loop_info(BitVector* loop_info) { | 1013 void set_loop_info(BitVector* loop_info) { |
992 loop_info_ = loop_info; | 1014 loop_info_ = loop_info; |
993 } | 1015 } |
(...skipping 652 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1646 SetInputAt(0, value); | 1668 SetInputAt(0, value); |
1647 } | 1669 } |
1648 | 1670 |
1649 DECLARE_INSTRUCTION(Return) | 1671 DECLARE_INSTRUCTION(Return) |
1650 | 1672 |
1651 virtual intptr_t ArgumentCount() const { return 0; } | 1673 virtual intptr_t ArgumentCount() const { return 0; } |
1652 | 1674 |
1653 intptr_t token_pos() const { return token_pos_; } | 1675 intptr_t token_pos() const { return token_pos_; } |
1654 Value* value() const { return inputs_[0]; } | 1676 Value* value() const { return inputs_[0]; } |
1655 | 1677 |
| 1678 virtual bool CanBeDeoptimizationTarget() const { |
| 1679 // Return instruction might turn into a Goto instruction after inlining. |
| 1680 // Every Goto must have an environment. |
| 1681 return true; |
| 1682 } |
| 1683 |
1656 virtual bool CanDeoptimize() const { return false; } | 1684 virtual bool CanDeoptimize() const { return false; } |
1657 | 1685 |
1658 virtual bool HasSideEffect() const { return false; } | 1686 virtual bool HasSideEffect() const { return false; } |
1659 | 1687 |
1660 private: | 1688 private: |
1661 const intptr_t token_pos_; | 1689 const intptr_t token_pos_; |
1662 | 1690 |
1663 DISALLOW_COPY_AND_ASSIGN(ReturnInstr); | 1691 DISALLOW_COPY_AND_ASSIGN(ReturnInstr); |
1664 }; | 1692 }; |
1665 | 1693 |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1714 | 1742 |
1715 DECLARE_INSTRUCTION(Goto) | 1743 DECLARE_INSTRUCTION(Goto) |
1716 | 1744 |
1717 virtual intptr_t ArgumentCount() const { return 0; } | 1745 virtual intptr_t ArgumentCount() const { return 0; } |
1718 | 1746 |
1719 JoinEntryInstr* successor() const { return successor_; } | 1747 JoinEntryInstr* successor() const { return successor_; } |
1720 void set_successor(JoinEntryInstr* successor) { successor_ = successor; } | 1748 void set_successor(JoinEntryInstr* successor) { successor_ = successor; } |
1721 virtual intptr_t SuccessorCount() const; | 1749 virtual intptr_t SuccessorCount() const; |
1722 virtual BlockEntryInstr* SuccessorAt(intptr_t index) const; | 1750 virtual BlockEntryInstr* SuccessorAt(intptr_t index) const; |
1723 | 1751 |
| 1752 virtual bool CanBeDeoptimizationTarget() const { |
| 1753 // Goto instruction can be used as a deoptimization target when LICM |
| 1754 // hoists instructions out of the loop. |
| 1755 return true; |
| 1756 } |
| 1757 |
1724 virtual bool CanDeoptimize() const { return false; } | 1758 virtual bool CanDeoptimize() const { return false; } |
1725 | 1759 |
1726 virtual bool HasSideEffect() const { return false; } | 1760 virtual bool HasSideEffect() const { return false; } |
1727 | 1761 |
1728 ParallelMoveInstr* parallel_move() const { | 1762 ParallelMoveInstr* parallel_move() const { |
1729 return parallel_move_; | 1763 return parallel_move_; |
1730 } | 1764 } |
1731 | 1765 |
1732 bool HasParallelMove() const { | 1766 bool HasParallelMove() const { |
1733 return parallel_move_ != NULL; | 1767 return parallel_move_ != NULL; |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1782 class BranchInstr : public ControlInstruction { | 1816 class BranchInstr : public ControlInstruction { |
1783 public: | 1817 public: |
1784 explicit BranchInstr(ComparisonInstr* comparison, bool is_checked = false); | 1818 explicit BranchInstr(ComparisonInstr* comparison, bool is_checked = false); |
1785 | 1819 |
1786 DECLARE_INSTRUCTION(Branch) | 1820 DECLARE_INSTRUCTION(Branch) |
1787 | 1821 |
1788 virtual intptr_t ArgumentCount() const; | 1822 virtual intptr_t ArgumentCount() const; |
1789 intptr_t InputCount() const; | 1823 intptr_t InputCount() const; |
1790 Value* InputAt(intptr_t i) const; | 1824 Value* InputAt(intptr_t i) const; |
1791 virtual bool CanDeoptimize() const; | 1825 virtual bool CanDeoptimize() const; |
| 1826 virtual bool CanBeDeoptimizationTarget() const; |
1792 | 1827 |
1793 virtual bool HasSideEffect() const; | 1828 virtual bool HasSideEffect() const; |
1794 | 1829 |
1795 ComparisonInstr* comparison() const { return comparison_; } | 1830 ComparisonInstr* comparison() const { return comparison_; } |
1796 void SetComparison(ComparisonInstr* comp); | 1831 void SetComparison(ComparisonInstr* comp); |
1797 | 1832 |
1798 bool is_checked() const { return is_checked_; } | 1833 bool is_checked() const { return is_checked_; } |
1799 | 1834 |
1800 virtual LocationSummary* locs(); | 1835 virtual LocationSummary* locs(); |
1801 virtual intptr_t DeoptimizationTarget() const; | 1836 virtual intptr_t DeoptimizationTarget() const; |
(...skipping 16 matching lines...) Expand all Loading... |
1818 // successor. | 1853 // successor. |
1819 void set_constrained_type(ConstrainedCompileType* type) { | 1854 void set_constrained_type(ConstrainedCompileType* type) { |
1820 constrained_type_ = type; | 1855 constrained_type_ = type; |
1821 } | 1856 } |
1822 | 1857 |
1823 // Return compile type constrained by the comparison of this branch. | 1858 // Return compile type constrained by the comparison of this branch. |
1824 ConstrainedCompileType* constrained_type() const { | 1859 ConstrainedCompileType* constrained_type() const { |
1825 return constrained_type_; | 1860 return constrained_type_; |
1826 } | 1861 } |
1827 | 1862 |
| 1863 virtual void InheritDeoptTarget(Instruction* other); |
| 1864 |
1828 private: | 1865 private: |
1829 virtual void RawSetInputAt(intptr_t i, Value* value); | 1866 virtual void RawSetInputAt(intptr_t i, Value* value); |
1830 | 1867 |
1831 ComparisonInstr* comparison_; | 1868 ComparisonInstr* comparison_; |
1832 const bool is_checked_; | 1869 const bool is_checked_; |
1833 | 1870 |
1834 ConstrainedCompileType* constrained_type_; | 1871 ConstrainedCompileType* constrained_type_; |
1835 | 1872 |
1836 DISALLOW_COPY_AND_ASSIGN(BranchInstr); | 1873 DISALLOW_COPY_AND_ASSIGN(BranchInstr); |
1837 }; | 1874 }; |
(...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2415 Value* left() const { return inputs_[0]; } | 2452 Value* left() const { return inputs_[0]; } |
2416 Value* right() const { return inputs_[1]; } | 2453 Value* right() const { return inputs_[1]; } |
2417 | 2454 |
2418 virtual ComparisonInstr* AsComparison() { return this; } | 2455 virtual ComparisonInstr* AsComparison() { return this; } |
2419 | 2456 |
2420 Token::Kind kind() const { return kind_; } | 2457 Token::Kind kind() const { return kind_; } |
2421 | 2458 |
2422 virtual void EmitBranchCode(FlowGraphCompiler* compiler, | 2459 virtual void EmitBranchCode(FlowGraphCompiler* compiler, |
2423 BranchInstr* branch) = 0; | 2460 BranchInstr* branch) = 0; |
2424 | 2461 |
| 2462 void SetDeoptId(intptr_t deopt_id) { |
| 2463 deopt_id_ = deopt_id; |
| 2464 } |
| 2465 |
2425 protected: | 2466 protected: |
2426 Token::Kind kind_; | 2467 Token::Kind kind_; |
2427 }; | 2468 }; |
2428 | 2469 |
2429 | 2470 |
2430 // Inlined functions from class BranchInstr that forward to their comparison. | 2471 // Inlined functions from class BranchInstr that forward to their comparison. |
2431 inline intptr_t BranchInstr::ArgumentCount() const { | 2472 inline intptr_t BranchInstr::ArgumentCount() const { |
2432 return comparison()->ArgumentCount(); | 2473 return comparison()->ArgumentCount(); |
2433 } | 2474 } |
2434 | 2475 |
2435 | 2476 |
2436 inline intptr_t BranchInstr::InputCount() const { | 2477 inline intptr_t BranchInstr::InputCount() const { |
2437 return comparison()->InputCount(); | 2478 return comparison()->InputCount(); |
2438 } | 2479 } |
2439 | 2480 |
2440 | 2481 |
2441 inline Value* BranchInstr::InputAt(intptr_t i) const { | 2482 inline Value* BranchInstr::InputAt(intptr_t i) const { |
2442 return comparison()->InputAt(i); | 2483 return comparison()->InputAt(i); |
2443 } | 2484 } |
2444 | 2485 |
2445 | 2486 |
2446 inline bool BranchInstr::CanDeoptimize() const { | 2487 inline bool BranchInstr::CanDeoptimize() const { |
2447 // Branches need a deoptimization info in checked mode if they | 2488 // Branches need a deoptimization info in checked mode if they |
2448 // can throw a type check error. | 2489 // can throw a type check error. |
2449 return comparison()->CanDeoptimize() || is_checked(); | 2490 return comparison()->CanDeoptimize() || is_checked(); |
2450 } | 2491 } |
2451 | 2492 |
2452 | 2493 |
| 2494 inline bool BranchInstr::CanBeDeoptimizationTarget() const { |
| 2495 return comparison()->CanBeDeoptimizationTarget(); |
| 2496 } |
| 2497 |
| 2498 |
2453 inline bool BranchInstr::HasSideEffect() const { | 2499 inline bool BranchInstr::HasSideEffect() const { |
2454 return comparison()->HasSideEffect(); | 2500 return comparison()->HasSideEffect(); |
2455 } | 2501 } |
2456 | 2502 |
2457 | 2503 |
2458 inline LocationSummary* BranchInstr::locs() { | 2504 inline LocationSummary* BranchInstr::locs() { |
2459 if (comparison()->locs_ == NULL) { | 2505 if (comparison()->locs_ == NULL) { |
2460 LocationSummary* summary = comparison()->MakeLocationSummary(); | 2506 LocationSummary* summary = comparison()->MakeLocationSummary(); |
2461 // Branches don't produce a result. | 2507 // Branches don't produce a result. |
2462 summary->set_out(Location::NoLocation()); | 2508 summary->set_out(Location::NoLocation()); |
(...skipping 16 matching lines...) Expand all Loading... |
2479 | 2525 |
2480 class StrictCompareInstr : public ComparisonInstr { | 2526 class StrictCompareInstr : public ComparisonInstr { |
2481 public: | 2527 public: |
2482 StrictCompareInstr(Token::Kind kind, Value* left, Value* right); | 2528 StrictCompareInstr(Token::Kind kind, Value* left, Value* right); |
2483 | 2529 |
2484 DECLARE_INSTRUCTION(StrictCompare) | 2530 DECLARE_INSTRUCTION(StrictCompare) |
2485 virtual CompileType ComputeType() const; | 2531 virtual CompileType ComputeType() const; |
2486 | 2532 |
2487 virtual void PrintOperandsTo(BufferFormatter* f) const; | 2533 virtual void PrintOperandsTo(BufferFormatter* f) const; |
2488 | 2534 |
| 2535 virtual bool CanBeDeoptimizationTarget() const { |
| 2536 // StrictCompare can be merged into Branch and thus needs an environment. |
| 2537 return true; |
| 2538 } |
| 2539 |
2489 virtual bool CanDeoptimize() const { return false; } | 2540 virtual bool CanDeoptimize() const { return false; } |
2490 | 2541 |
2491 virtual bool HasSideEffect() const { return false; } | 2542 virtual bool HasSideEffect() const { return false; } |
2492 | 2543 |
2493 virtual bool AttributesEqual(Instruction* other) const; | 2544 virtual bool AttributesEqual(Instruction* other) const; |
2494 virtual bool AffectedBySideEffect() const { return false; } | 2545 virtual bool AffectedBySideEffect() const { return false; } |
2495 | 2546 |
2496 virtual Definition* Canonicalize(FlowGraphOptimizer* optimizer); | 2547 virtual Definition* Canonicalize(FlowGraphOptimizer* optimizer); |
2497 | 2548 |
2498 virtual void EmitBranchCode(FlowGraphCompiler* compiler, | 2549 virtual void EmitBranchCode(FlowGraphCompiler* compiler, |
(...skipping 27 matching lines...) Expand all Loading... |
2526 } | 2577 } |
2527 | 2578 |
2528 DECLARE_INSTRUCTION(EqualityCompare) | 2579 DECLARE_INSTRUCTION(EqualityCompare) |
2529 virtual CompileType ComputeType() const; | 2580 virtual CompileType ComputeType() const; |
2530 virtual bool RecomputeType(); | 2581 virtual bool RecomputeType(); |
2531 | 2582 |
2532 const ICData* ic_data() const { return ic_data_; } | 2583 const ICData* ic_data() const { return ic_data_; } |
2533 bool HasICData() const { | 2584 bool HasICData() const { |
2534 return (ic_data() != NULL) && !ic_data()->IsNull(); | 2585 return (ic_data() != NULL) && !ic_data()->IsNull(); |
2535 } | 2586 } |
| 2587 void set_ic_data(const ICData* value) { ic_data_ = value; } |
2536 | 2588 |
2537 intptr_t token_pos() const { return token_pos_; } | 2589 intptr_t token_pos() const { return token_pos_; } |
2538 | 2590 |
2539 // Receiver class id is computed from collected ICData. | 2591 // Receiver class id is computed from collected ICData. |
2540 void set_receiver_class_id(intptr_t value) { receiver_class_id_ = value; } | 2592 void set_receiver_class_id(intptr_t value) { receiver_class_id_ = value; } |
2541 intptr_t receiver_class_id() const { return receiver_class_id_; } | 2593 intptr_t receiver_class_id() const { return receiver_class_id_; } |
2542 | 2594 |
2543 bool IsInlinedNumericComparison() const { | 2595 bool IsInlinedNumericComparison() const { |
2544 return (receiver_class_id() == kDoubleCid) | 2596 return (receiver_class_id() == kDoubleCid) |
2545 || (receiver_class_id() == kMintCid) | 2597 || (receiver_class_id() == kMintCid) |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2596 } | 2648 } |
2597 | 2649 |
2598 DECLARE_INSTRUCTION(RelationalOp) | 2650 DECLARE_INSTRUCTION(RelationalOp) |
2599 virtual CompileType ComputeType() const; | 2651 virtual CompileType ComputeType() const; |
2600 virtual bool RecomputeType(); | 2652 virtual bool RecomputeType(); |
2601 | 2653 |
2602 const ICData* ic_data() const { return ic_data_; } | 2654 const ICData* ic_data() const { return ic_data_; } |
2603 bool HasICData() const { | 2655 bool HasICData() const { |
2604 return (ic_data() != NULL) && !ic_data()->IsNull(); | 2656 return (ic_data() != NULL) && !ic_data()->IsNull(); |
2605 } | 2657 } |
| 2658 void set_ic_data(const ICData* value) { ic_data_ = value; } |
2606 | 2659 |
2607 intptr_t token_pos() const { return token_pos_; } | 2660 intptr_t token_pos() const { return token_pos_; } |
2608 | 2661 |
2609 // TODO(srdjan): instead of class-id pass an enum that can differentiate | 2662 // TODO(srdjan): instead of class-id pass an enum that can differentiate |
2610 // between boxed and unboxed doubles and integers. | 2663 // between boxed and unboxed doubles and integers. |
2611 void set_operands_class_id(intptr_t value) { | 2664 void set_operands_class_id(intptr_t value) { |
2612 operands_class_id_ = value; | 2665 operands_class_id_ = value; |
2613 } | 2666 } |
2614 | 2667 |
2615 intptr_t operands_class_id() const { return operands_class_id_; } | 2668 intptr_t operands_class_id() const { return operands_class_id_; } |
(...skipping 2061 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4677 ForwardInstructionIterator* current_iterator_; | 4730 ForwardInstructionIterator* current_iterator_; |
4678 | 4731 |
4679 private: | 4732 private: |
4680 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor); | 4733 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor); |
4681 }; | 4734 }; |
4682 | 4735 |
4683 | 4736 |
4684 } // namespace dart | 4737 } // namespace dart |
4685 | 4738 |
4686 #endif // VM_INTERMEDIATE_LANGUAGE_H_ | 4739 #endif // VM_INTERMEDIATE_LANGUAGE_H_ |
OLD | NEW |