| 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; |
| 779 friend class InstanceOfInstr; |
| 763 | 780 |
| 764 virtual void RawSetInputAt(intptr_t i, Value* value) = 0; | 781 virtual void RawSetInputAt(intptr_t i, Value* value) = 0; |
| 765 | 782 |
| 766 intptr_t deopt_id_; | 783 intptr_t deopt_id_; |
| 767 intptr_t lifetime_position_; // Position used by register allocator. | 784 intptr_t lifetime_position_; // Position used by register allocator. |
| 768 Instruction* previous_; | 785 Instruction* previous_; |
| 769 Instruction* next_; | 786 Instruction* next_; |
| 770 Environment* env_; | 787 Environment* env_; |
| 771 intptr_t expr_id_; | 788 intptr_t expr_id_; |
| 772 | 789 |
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 974 intptr_t fixed_parameter_count); | 991 intptr_t fixed_parameter_count); |
| 975 | 992 |
| 976 virtual intptr_t InputCount() const { return 0; } | 993 virtual intptr_t InputCount() const { return 0; } |
| 977 virtual Value* InputAt(intptr_t i) const { | 994 virtual Value* InputAt(intptr_t i) const { |
| 978 UNREACHABLE(); | 995 UNREACHABLE(); |
| 979 return NULL; | 996 return NULL; |
| 980 } | 997 } |
| 981 | 998 |
| 982 virtual intptr_t ArgumentCount() const { return 0; } | 999 virtual intptr_t ArgumentCount() const { return 0; } |
| 983 | 1000 |
| 1001 virtual bool CanBeDeoptimizationTarget() const { |
| 1002 // BlockEntry environment is copied to Goto and Branch instructions |
| 1003 // when we insert new blocks targeting this block. |
| 1004 return true; |
| 1005 } |
| 1006 |
| 984 virtual bool CanDeoptimize() const { return false; } | 1007 virtual bool CanDeoptimize() const { return false; } |
| 985 | 1008 |
| 986 virtual bool HasSideEffect() const { return false; } | 1009 virtual bool HasSideEffect() const { return false; } |
| 987 | 1010 |
| 988 intptr_t try_index() const { return try_index_; } | 1011 intptr_t try_index() const { return try_index_; } |
| 989 | 1012 |
| 990 BitVector* loop_info() const { return loop_info_; } | 1013 BitVector* loop_info() const { return loop_info_; } |
| 991 void set_loop_info(BitVector* loop_info) { | 1014 void set_loop_info(BitVector* loop_info) { |
| 992 loop_info_ = loop_info; | 1015 loop_info_ = loop_info; |
| 993 } | 1016 } |
| (...skipping 652 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1646 SetInputAt(0, value); | 1669 SetInputAt(0, value); |
| 1647 } | 1670 } |
| 1648 | 1671 |
| 1649 DECLARE_INSTRUCTION(Return) | 1672 DECLARE_INSTRUCTION(Return) |
| 1650 | 1673 |
| 1651 virtual intptr_t ArgumentCount() const { return 0; } | 1674 virtual intptr_t ArgumentCount() const { return 0; } |
| 1652 | 1675 |
| 1653 intptr_t token_pos() const { return token_pos_; } | 1676 intptr_t token_pos() const { return token_pos_; } |
| 1654 Value* value() const { return inputs_[0]; } | 1677 Value* value() const { return inputs_[0]; } |
| 1655 | 1678 |
| 1679 virtual bool CanBeDeoptimizationTarget() const { |
| 1680 // Return instruction might turn into a Goto instruction after inlining. |
| 1681 // Every Goto must have an environment. |
| 1682 return true; |
| 1683 } |
| 1684 |
| 1656 virtual bool CanDeoptimize() const { return false; } | 1685 virtual bool CanDeoptimize() const { return false; } |
| 1657 | 1686 |
| 1658 virtual bool HasSideEffect() const { return false; } | 1687 virtual bool HasSideEffect() const { return false; } |
| 1659 | 1688 |
| 1660 private: | 1689 private: |
| 1661 const intptr_t token_pos_; | 1690 const intptr_t token_pos_; |
| 1662 | 1691 |
| 1663 DISALLOW_COPY_AND_ASSIGN(ReturnInstr); | 1692 DISALLOW_COPY_AND_ASSIGN(ReturnInstr); |
| 1664 }; | 1693 }; |
| 1665 | 1694 |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1714 | 1743 |
| 1715 DECLARE_INSTRUCTION(Goto) | 1744 DECLARE_INSTRUCTION(Goto) |
| 1716 | 1745 |
| 1717 virtual intptr_t ArgumentCount() const { return 0; } | 1746 virtual intptr_t ArgumentCount() const { return 0; } |
| 1718 | 1747 |
| 1719 JoinEntryInstr* successor() const { return successor_; } | 1748 JoinEntryInstr* successor() const { return successor_; } |
| 1720 void set_successor(JoinEntryInstr* successor) { successor_ = successor; } | 1749 void set_successor(JoinEntryInstr* successor) { successor_ = successor; } |
| 1721 virtual intptr_t SuccessorCount() const; | 1750 virtual intptr_t SuccessorCount() const; |
| 1722 virtual BlockEntryInstr* SuccessorAt(intptr_t index) const; | 1751 virtual BlockEntryInstr* SuccessorAt(intptr_t index) const; |
| 1723 | 1752 |
| 1753 virtual bool CanBeDeoptimizationTarget() const { |
| 1754 // Goto instruction can be used as a deoptimization target when LICM |
| 1755 // hoists instructions out of the loop. |
| 1756 return true; |
| 1757 } |
| 1758 |
| 1724 virtual bool CanDeoptimize() const { return false; } | 1759 virtual bool CanDeoptimize() const { return false; } |
| 1725 | 1760 |
| 1726 virtual bool HasSideEffect() const { return false; } | 1761 virtual bool HasSideEffect() const { return false; } |
| 1727 | 1762 |
| 1728 ParallelMoveInstr* parallel_move() const { | 1763 ParallelMoveInstr* parallel_move() const { |
| 1729 return parallel_move_; | 1764 return parallel_move_; |
| 1730 } | 1765 } |
| 1731 | 1766 |
| 1732 bool HasParallelMove() const { | 1767 bool HasParallelMove() const { |
| 1733 return parallel_move_ != NULL; | 1768 return parallel_move_ != NULL; |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1782 class BranchInstr : public ControlInstruction { | 1817 class BranchInstr : public ControlInstruction { |
| 1783 public: | 1818 public: |
| 1784 explicit BranchInstr(ComparisonInstr* comparison, bool is_checked = false); | 1819 explicit BranchInstr(ComparisonInstr* comparison, bool is_checked = false); |
| 1785 | 1820 |
| 1786 DECLARE_INSTRUCTION(Branch) | 1821 DECLARE_INSTRUCTION(Branch) |
| 1787 | 1822 |
| 1788 virtual intptr_t ArgumentCount() const; | 1823 virtual intptr_t ArgumentCount() const; |
| 1789 intptr_t InputCount() const; | 1824 intptr_t InputCount() const; |
| 1790 Value* InputAt(intptr_t i) const; | 1825 Value* InputAt(intptr_t i) const; |
| 1791 virtual bool CanDeoptimize() const; | 1826 virtual bool CanDeoptimize() const; |
| 1827 virtual bool CanBeDeoptimizationTarget() const; |
| 1792 | 1828 |
| 1793 virtual bool HasSideEffect() const; | 1829 virtual bool HasSideEffect() const; |
| 1794 | 1830 |
| 1795 ComparisonInstr* comparison() const { return comparison_; } | 1831 ComparisonInstr* comparison() const { return comparison_; } |
| 1796 void SetComparison(ComparisonInstr* comp); | 1832 void SetComparison(ComparisonInstr* comp); |
| 1797 | 1833 |
| 1798 bool is_checked() const { return is_checked_; } | 1834 bool is_checked() const { return is_checked_; } |
| 1799 | 1835 |
| 1800 virtual LocationSummary* locs(); | 1836 virtual LocationSummary* locs(); |
| 1801 virtual intptr_t DeoptimizationTarget() const; | 1837 virtual intptr_t DeoptimizationTarget() const; |
| (...skipping 16 matching lines...) Expand all Loading... |
| 1818 // successor. | 1854 // successor. |
| 1819 void set_constrained_type(ConstrainedCompileType* type) { | 1855 void set_constrained_type(ConstrainedCompileType* type) { |
| 1820 constrained_type_ = type; | 1856 constrained_type_ = type; |
| 1821 } | 1857 } |
| 1822 | 1858 |
| 1823 // Return compile type constrained by the comparison of this branch. | 1859 // Return compile type constrained by the comparison of this branch. |
| 1824 ConstrainedCompileType* constrained_type() const { | 1860 ConstrainedCompileType* constrained_type() const { |
| 1825 return constrained_type_; | 1861 return constrained_type_; |
| 1826 } | 1862 } |
| 1827 | 1863 |
| 1864 virtual void InheritDeoptTarget(Instruction* other); |
| 1865 |
| 1828 private: | 1866 private: |
| 1829 virtual void RawSetInputAt(intptr_t i, Value* value); | 1867 virtual void RawSetInputAt(intptr_t i, Value* value); |
| 1830 | 1868 |
| 1831 ComparisonInstr* comparison_; | 1869 ComparisonInstr* comparison_; |
| 1832 const bool is_checked_; | 1870 const bool is_checked_; |
| 1833 | 1871 |
| 1834 ConstrainedCompileType* constrained_type_; | 1872 ConstrainedCompileType* constrained_type_; |
| 1835 | 1873 |
| 1836 DISALLOW_COPY_AND_ASSIGN(BranchInstr); | 1874 DISALLOW_COPY_AND_ASSIGN(BranchInstr); |
| 1837 }; | 1875 }; |
| (...skipping 577 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2415 Value* left() const { return inputs_[0]; } | 2453 Value* left() const { return inputs_[0]; } |
| 2416 Value* right() const { return inputs_[1]; } | 2454 Value* right() const { return inputs_[1]; } |
| 2417 | 2455 |
| 2418 virtual ComparisonInstr* AsComparison() { return this; } | 2456 virtual ComparisonInstr* AsComparison() { return this; } |
| 2419 | 2457 |
| 2420 Token::Kind kind() const { return kind_; } | 2458 Token::Kind kind() const { return kind_; } |
| 2421 | 2459 |
| 2422 virtual void EmitBranchCode(FlowGraphCompiler* compiler, | 2460 virtual void EmitBranchCode(FlowGraphCompiler* compiler, |
| 2423 BranchInstr* branch) = 0; | 2461 BranchInstr* branch) = 0; |
| 2424 | 2462 |
| 2463 void SetDeoptId(intptr_t deopt_id) { |
| 2464 deopt_id_ = deopt_id; |
| 2465 } |
| 2466 |
| 2425 protected: | 2467 protected: |
| 2426 Token::Kind kind_; | 2468 Token::Kind kind_; |
| 2427 }; | 2469 }; |
| 2428 | 2470 |
| 2429 | 2471 |
| 2430 // Inlined functions from class BranchInstr that forward to their comparison. | 2472 // Inlined functions from class BranchInstr that forward to their comparison. |
| 2431 inline intptr_t BranchInstr::ArgumentCount() const { | 2473 inline intptr_t BranchInstr::ArgumentCount() const { |
| 2432 return comparison()->ArgumentCount(); | 2474 return comparison()->ArgumentCount(); |
| 2433 } | 2475 } |
| 2434 | 2476 |
| 2435 | 2477 |
| 2436 inline intptr_t BranchInstr::InputCount() const { | 2478 inline intptr_t BranchInstr::InputCount() const { |
| 2437 return comparison()->InputCount(); | 2479 return comparison()->InputCount(); |
| 2438 } | 2480 } |
| 2439 | 2481 |
| 2440 | 2482 |
| 2441 inline Value* BranchInstr::InputAt(intptr_t i) const { | 2483 inline Value* BranchInstr::InputAt(intptr_t i) const { |
| 2442 return comparison()->InputAt(i); | 2484 return comparison()->InputAt(i); |
| 2443 } | 2485 } |
| 2444 | 2486 |
| 2445 | 2487 |
| 2446 inline bool BranchInstr::CanDeoptimize() const { | 2488 inline bool BranchInstr::CanDeoptimize() const { |
| 2447 // Branches need a deoptimization info in checked mode if they | 2489 // Branches need a deoptimization info in checked mode if they |
| 2448 // can throw a type check error. | 2490 // can throw a type check error. |
| 2449 return comparison()->CanDeoptimize() || is_checked(); | 2491 return comparison()->CanDeoptimize() || is_checked(); |
| 2450 } | 2492 } |
| 2451 | 2493 |
| 2452 | 2494 |
| 2495 inline bool BranchInstr::CanBeDeoptimizationTarget() const { |
| 2496 return comparison()->CanBeDeoptimizationTarget(); |
| 2497 } |
| 2498 |
| 2499 |
| 2453 inline bool BranchInstr::HasSideEffect() const { | 2500 inline bool BranchInstr::HasSideEffect() const { |
| 2454 return comparison()->HasSideEffect(); | 2501 return comparison()->HasSideEffect(); |
| 2455 } | 2502 } |
| 2456 | 2503 |
| 2457 | 2504 |
| 2458 inline LocationSummary* BranchInstr::locs() { | 2505 inline LocationSummary* BranchInstr::locs() { |
| 2459 if (comparison()->locs_ == NULL) { | 2506 if (comparison()->locs_ == NULL) { |
| 2460 LocationSummary* summary = comparison()->MakeLocationSummary(); | 2507 LocationSummary* summary = comparison()->MakeLocationSummary(); |
| 2461 // Branches don't produce a result. | 2508 // Branches don't produce a result. |
| 2462 summary->set_out(Location::NoLocation()); | 2509 summary->set_out(Location::NoLocation()); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 2479 | 2526 |
| 2480 class StrictCompareInstr : public ComparisonInstr { | 2527 class StrictCompareInstr : public ComparisonInstr { |
| 2481 public: | 2528 public: |
| 2482 StrictCompareInstr(Token::Kind kind, Value* left, Value* right); | 2529 StrictCompareInstr(Token::Kind kind, Value* left, Value* right); |
| 2483 | 2530 |
| 2484 DECLARE_INSTRUCTION(StrictCompare) | 2531 DECLARE_INSTRUCTION(StrictCompare) |
| 2485 virtual CompileType ComputeType() const; | 2532 virtual CompileType ComputeType() const; |
| 2486 | 2533 |
| 2487 virtual void PrintOperandsTo(BufferFormatter* f) const; | 2534 virtual void PrintOperandsTo(BufferFormatter* f) const; |
| 2488 | 2535 |
| 2536 virtual bool CanBeDeoptimizationTarget() const { |
| 2537 // StrictCompare can be merged into Branch and thus needs an environment. |
| 2538 return true; |
| 2539 } |
| 2540 |
| 2489 virtual bool CanDeoptimize() const { return false; } | 2541 virtual bool CanDeoptimize() const { return false; } |
| 2490 | 2542 |
| 2491 virtual bool HasSideEffect() const { return false; } | 2543 virtual bool HasSideEffect() const { return false; } |
| 2492 | 2544 |
| 2493 virtual bool AttributesEqual(Instruction* other) const; | 2545 virtual bool AttributesEqual(Instruction* other) const; |
| 2494 virtual bool AffectedBySideEffect() const { return false; } | 2546 virtual bool AffectedBySideEffect() const { return false; } |
| 2495 | 2547 |
| 2496 virtual Definition* Canonicalize(FlowGraphOptimizer* optimizer); | 2548 virtual Definition* Canonicalize(FlowGraphOptimizer* optimizer); |
| 2497 | 2549 |
| 2498 virtual void EmitBranchCode(FlowGraphCompiler* compiler, | 2550 virtual void EmitBranchCode(FlowGraphCompiler* compiler, |
| (...skipping 27 matching lines...) Expand all Loading... |
| 2526 } | 2578 } |
| 2527 | 2579 |
| 2528 DECLARE_INSTRUCTION(EqualityCompare) | 2580 DECLARE_INSTRUCTION(EqualityCompare) |
| 2529 virtual CompileType ComputeType() const; | 2581 virtual CompileType ComputeType() const; |
| 2530 virtual bool RecomputeType(); | 2582 virtual bool RecomputeType(); |
| 2531 | 2583 |
| 2532 const ICData* ic_data() const { return ic_data_; } | 2584 const ICData* ic_data() const { return ic_data_; } |
| 2533 bool HasICData() const { | 2585 bool HasICData() const { |
| 2534 return (ic_data() != NULL) && !ic_data()->IsNull(); | 2586 return (ic_data() != NULL) && !ic_data()->IsNull(); |
| 2535 } | 2587 } |
| 2588 void set_ic_data(const ICData* value) { ic_data_ = value; } |
| 2536 | 2589 |
| 2537 intptr_t token_pos() const { return token_pos_; } | 2590 intptr_t token_pos() const { return token_pos_; } |
| 2538 | 2591 |
| 2539 // Receiver class id is computed from collected ICData. | 2592 // Receiver class id is computed from collected ICData. |
| 2540 void set_receiver_class_id(intptr_t value) { receiver_class_id_ = value; } | 2593 void set_receiver_class_id(intptr_t value) { receiver_class_id_ = value; } |
| 2541 intptr_t receiver_class_id() const { return receiver_class_id_; } | 2594 intptr_t receiver_class_id() const { return receiver_class_id_; } |
| 2542 | 2595 |
| 2543 bool IsInlinedNumericComparison() const { | 2596 bool IsInlinedNumericComparison() const { |
| 2544 return (receiver_class_id() == kDoubleCid) | 2597 return (receiver_class_id() == kDoubleCid) |
| 2545 || (receiver_class_id() == kMintCid) | 2598 || (receiver_class_id() == kMintCid) |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2596 } | 2649 } |
| 2597 | 2650 |
| 2598 DECLARE_INSTRUCTION(RelationalOp) | 2651 DECLARE_INSTRUCTION(RelationalOp) |
| 2599 virtual CompileType ComputeType() const; | 2652 virtual CompileType ComputeType() const; |
| 2600 virtual bool RecomputeType(); | 2653 virtual bool RecomputeType(); |
| 2601 | 2654 |
| 2602 const ICData* ic_data() const { return ic_data_; } | 2655 const ICData* ic_data() const { return ic_data_; } |
| 2603 bool HasICData() const { | 2656 bool HasICData() const { |
| 2604 return (ic_data() != NULL) && !ic_data()->IsNull(); | 2657 return (ic_data() != NULL) && !ic_data()->IsNull(); |
| 2605 } | 2658 } |
| 2659 void set_ic_data(const ICData* value) { ic_data_ = value; } |
| 2606 | 2660 |
| 2607 intptr_t token_pos() const { return token_pos_; } | 2661 intptr_t token_pos() const { return token_pos_; } |
| 2608 | 2662 |
| 2609 // TODO(srdjan): instead of class-id pass an enum that can differentiate | 2663 // TODO(srdjan): instead of class-id pass an enum that can differentiate |
| 2610 // between boxed and unboxed doubles and integers. | 2664 // between boxed and unboxed doubles and integers. |
| 2611 void set_operands_class_id(intptr_t value) { | 2665 void set_operands_class_id(intptr_t value) { |
| 2612 operands_class_id_ = value; | 2666 operands_class_id_ = value; |
| 2613 } | 2667 } |
| 2614 | 2668 |
| 2615 intptr_t operands_class_id() const { return operands_class_id_; } | 2669 intptr_t operands_class_id() const { return operands_class_id_; } |
| (...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3103 }; | 3157 }; |
| 3104 | 3158 |
| 3105 | 3159 |
| 3106 class InstanceOfInstr : public TemplateDefinition<3> { | 3160 class InstanceOfInstr : public TemplateDefinition<3> { |
| 3107 public: | 3161 public: |
| 3108 InstanceOfInstr(intptr_t token_pos, | 3162 InstanceOfInstr(intptr_t token_pos, |
| 3109 Value* value, | 3163 Value* value, |
| 3110 Value* instantiator, | 3164 Value* instantiator, |
| 3111 Value* instantiator_type_arguments, | 3165 Value* instantiator_type_arguments, |
| 3112 const AbstractType& type, | 3166 const AbstractType& type, |
| 3113 bool negate_result) | 3167 bool negate_result, |
| 3168 intptr_t deopt_id) |
| 3114 : token_pos_(token_pos), | 3169 : token_pos_(token_pos), |
| 3115 type_(type), | 3170 type_(type), |
| 3116 negate_result_(negate_result) { | 3171 negate_result_(negate_result) { |
| 3117 ASSERT(!type.IsNull()); | 3172 ASSERT(!type.IsNull()); |
| 3118 SetInputAt(0, value); | 3173 SetInputAt(0, value); |
| 3119 SetInputAt(1, instantiator); | 3174 SetInputAt(1, instantiator); |
| 3120 SetInputAt(2, instantiator_type_arguments); | 3175 SetInputAt(2, instantiator_type_arguments); |
| 3176 deopt_id_ = deopt_id; |
| 3121 } | 3177 } |
| 3122 | 3178 |
| 3123 DECLARE_INSTRUCTION(InstanceOf) | 3179 DECLARE_INSTRUCTION(InstanceOf) |
| 3124 virtual CompileType ComputeType() const; | 3180 virtual CompileType ComputeType() const; |
| 3125 | 3181 |
| 3126 Value* value() const { return inputs_[0]; } | 3182 Value* value() const { return inputs_[0]; } |
| 3127 Value* instantiator() const { return inputs_[1]; } | 3183 Value* instantiator() const { return inputs_[1]; } |
| 3128 Value* instantiator_type_arguments() const { return inputs_[2]; } | 3184 Value* instantiator_type_arguments() const { return inputs_[2]; } |
| 3129 | 3185 |
| 3130 bool negate_result() const { return negate_result_; } | 3186 bool negate_result() const { return negate_result_; } |
| (...skipping 1546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4677 ForwardInstructionIterator* current_iterator_; | 4733 ForwardInstructionIterator* current_iterator_; |
| 4678 | 4734 |
| 4679 private: | 4735 private: |
| 4680 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor); | 4736 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor); |
| 4681 }; | 4737 }; |
| 4682 | 4738 |
| 4683 | 4739 |
| 4684 } // namespace dart | 4740 } // namespace dart |
| 4685 | 4741 |
| 4686 #endif // VM_INTERMEDIATE_LANGUAGE_H_ | 4742 #endif // VM_INTERMEDIATE_LANGUAGE_H_ |
| OLD | NEW |