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

Side by Side Diff: runtime/vm/intermediate_language.h

Issue 12457034: Ensure that all goto instructions have deoptimization target. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Delete UNREACHABLE Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/flow_graph_optimizer.cc ('k') | runtime/vm/intermediate_language.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (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
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
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
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
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
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
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
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
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
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
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
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
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
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
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_
OLDNEW
« no previous file with comments | « runtime/vm/flow_graph_optimizer.cc ('k') | runtime/vm/intermediate_language.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698