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 |