| 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 |