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

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

Issue 10875058: Require ResultCid specification in every computation, that way we can differentiate between computa… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 4 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) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
182 virtual bool AttributesEqual(Computation* other) const { return true; } 182 virtual bool AttributesEqual(Computation* other) const { return true; }
183 183
184 // Returns true if the instruction may have side effects. 184 // Returns true if the instruction may have side effects.
185 // TODO(fschneider): Make this abstract and implement for all computations 185 // TODO(fschneider): Make this abstract and implement for all computations
186 // instead of returning the safe default (true). 186 // instead of returning the safe default (true).
187 virtual bool HasSideEffect() const { return true; } 187 virtual bool HasSideEffect() const { return true; }
188 188
189 // Compile time type of the computation, which typically depends on the 189 // Compile time type of the computation, which typically depends on the
190 // compile time types (and possibly propagated types) of its inputs. 190 // compile time types (and possibly propagated types) of its inputs.
191 virtual RawAbstractType* CompileType() const = 0; 191 virtual RawAbstractType* CompileType() const = 0;
192 virtual intptr_t ResultCid() const { return kDynamicCid; } 192 virtual intptr_t ResultCid() const = 0;
193 193
194 // Mutate assigned_vars to add the local variable index for all 194 // Mutate assigned_vars to add the local variable index for all
195 // frame-allocated locals assigned to by the computation. 195 // frame-allocated locals assigned to by the computation.
196 virtual void RecordAssignedVars(BitVector* assigned_vars, 196 virtual void RecordAssignedVars(BitVector* assigned_vars,
197 intptr_t fixed_parameter_count); 197 intptr_t fixed_parameter_count);
198 198
199 virtual const char* DebugName() const = 0; 199 virtual const char* DebugName() const = 0;
200 200
201 // Printing support. These functions are sometimes overridden for custom 201 // Printing support. These functions are sometimes overridden for custom
202 // formatting. Otherwise, it prints in the format "opcode(op1, op2, op3)". 202 // formatting. Otherwise, it prints in the format "opcode(op1, op2, op3)".
(...skipping 346 matching lines...) Expand 10 before | Expand all | Expand 10 after
549 return is_eliminated_; 549 return is_eliminated_;
550 } 550 }
551 void eliminate() { 551 void eliminate() {
552 ASSERT(!is_eliminated_); 552 ASSERT(!is_eliminated_);
553 is_eliminated_ = true; 553 is_eliminated_ = true;
554 } 554 }
555 555
556 virtual void PrintOperandsTo(BufferFormatter* f) const; 556 virtual void PrintOperandsTo(BufferFormatter* f) const;
557 557
558 virtual bool CanDeoptimize() const { return false; } 558 virtual bool CanDeoptimize() const { return false; }
559 virtual intptr_t ResultCid() const { return kDynamicCid; }
559 560
560 private: 561 private:
561 const intptr_t token_pos_; 562 const intptr_t token_pos_;
562 const intptr_t try_index_; 563 const intptr_t try_index_;
563 const AbstractType& dst_type_; 564 const AbstractType& dst_type_;
564 const String& dst_name_; 565 const String& dst_name_;
565 bool is_eliminated_; 566 bool is_eliminated_;
566 567
567 DISALLOW_COPY_AND_ASSIGN(AssertAssignableComp); 568 DISALLOW_COPY_AND_ASSIGN(AssertAssignableComp);
568 }; 569 };
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
610 611
611 // Denotes the current context, normally held in a register. This is 612 // Denotes the current context, normally held in a register. This is
612 // a computation, not a value, because it's mutable. 613 // a computation, not a value, because it's mutable.
613 class CurrentContextComp : public TemplateComputation<0> { 614 class CurrentContextComp : public TemplateComputation<0> {
614 public: 615 public:
615 CurrentContextComp() { } 616 CurrentContextComp() { }
616 617
617 DECLARE_COMPUTATION(CurrentContext) 618 DECLARE_COMPUTATION(CurrentContext)
618 619
619 virtual bool CanDeoptimize() const { return false; } 620 virtual bool CanDeoptimize() const { return false; }
621 virtual intptr_t ResultCid() const { return kDynamicCid; }
620 622
621 private: 623 private:
622 DISALLOW_COPY_AND_ASSIGN(CurrentContextComp); 624 DISALLOW_COPY_AND_ASSIGN(CurrentContextComp);
623 }; 625 };
624 626
625 627
626 class StoreContextComp : public TemplateComputation<1> { 628 class StoreContextComp : public TemplateComputation<1> {
627 public: 629 public:
628 explicit StoreContextComp(Value* value) { 630 explicit StoreContextComp(Value* value) {
629 ASSERT(value != NULL); 631 ASSERT(value != NULL);
630 inputs_[0] = value; 632 inputs_[0] = value;
631 } 633 }
632 634
633 DECLARE_COMPUTATION(StoreContext); 635 DECLARE_COMPUTATION(StoreContext);
634 636
635 Value* value() const { return inputs_[0]; } 637 Value* value() const { return inputs_[0]; }
636 638
637 virtual bool CanDeoptimize() const { return false; } 639 virtual bool CanDeoptimize() const { return false; }
640 virtual intptr_t ResultCid() const { return kIllegalCid; }
638 641
639 private: 642 private:
640 DISALLOW_COPY_AND_ASSIGN(StoreContextComp); 643 DISALLOW_COPY_AND_ASSIGN(StoreContextComp);
641 }; 644 };
642 645
643 646
644 class ClosureCallComp : public TemplateComputation<0> { 647 class ClosureCallComp : public TemplateComputation<0> {
645 public: 648 public:
646 ClosureCallComp(ClosureCallNode* node, 649 ClosureCallComp(ClosureCallNode* node,
647 intptr_t try_index, 650 intptr_t try_index,
648 ZoneGrowableArray<PushArgumentInstr*>* arguments) 651 ZoneGrowableArray<PushArgumentInstr*>* arguments)
649 : ast_node_(*node), 652 : ast_node_(*node),
650 try_index_(try_index), 653 try_index_(try_index),
651 arguments_(arguments) { } 654 arguments_(arguments) { }
652 655
653 DECLARE_CALL_COMPUTATION(ClosureCall) 656 DECLARE_CALL_COMPUTATION(ClosureCall)
654 657
655 const Array& argument_names() const { return ast_node_.arguments()->names(); } 658 const Array& argument_names() const { return ast_node_.arguments()->names(); }
656 intptr_t token_pos() const { return ast_node_.token_pos(); } 659 intptr_t token_pos() const { return ast_node_.token_pos(); }
657 intptr_t try_index() const { return try_index_; } 660 intptr_t try_index() const { return try_index_; }
658 661
659 virtual intptr_t ArgumentCount() const { return arguments_->length(); } 662 virtual intptr_t ArgumentCount() const { return arguments_->length(); }
660 PushArgumentInstr* ArgumentAt(intptr_t index) const { 663 PushArgumentInstr* ArgumentAt(intptr_t index) const {
661 return (*arguments_)[index]; 664 return (*arguments_)[index];
662 } 665 }
663 666
664 virtual void PrintOperandsTo(BufferFormatter* f) const; 667 virtual void PrintOperandsTo(BufferFormatter* f) const;
665 668
666 virtual bool CanDeoptimize() const { return false; } 669 virtual bool CanDeoptimize() const { return false; }
670 virtual intptr_t ResultCid() const { return kDynamicCid; }
667 671
668 private: 672 private:
669 const ClosureCallNode& ast_node_; 673 const ClosureCallNode& ast_node_;
670 const intptr_t try_index_; 674 const intptr_t try_index_;
671 ZoneGrowableArray<PushArgumentInstr*>* arguments_; 675 ZoneGrowableArray<PushArgumentInstr*>* arguments_;
672 676
673 DISALLOW_COPY_AND_ASSIGN(ClosureCallComp); 677 DISALLOW_COPY_AND_ASSIGN(ClosureCallComp);
674 }; 678 };
675 679
676 680
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
710 virtual intptr_t ArgumentCount() const { return arguments_->length(); } 714 virtual intptr_t ArgumentCount() const { return arguments_->length(); }
711 PushArgumentInstr* ArgumentAt(intptr_t index) const { 715 PushArgumentInstr* ArgumentAt(intptr_t index) const {
712 return (*arguments_)[index]; 716 return (*arguments_)[index];
713 } 717 }
714 const Array& argument_names() const { return argument_names_; } 718 const Array& argument_names() const { return argument_names_; }
715 intptr_t checked_argument_count() const { return checked_argument_count_; } 719 intptr_t checked_argument_count() const { return checked_argument_count_; }
716 720
717 virtual void PrintOperandsTo(BufferFormatter* f) const; 721 virtual void PrintOperandsTo(BufferFormatter* f) const;
718 722
719 virtual bool CanDeoptimize() const { return false; } 723 virtual bool CanDeoptimize() const { return false; }
724 virtual intptr_t ResultCid() const { return kDynamicCid; }
720 725
721 private: 726 private:
722 const intptr_t token_pos_; 727 const intptr_t token_pos_;
723 const intptr_t try_index_; 728 const intptr_t try_index_;
724 const String& function_name_; 729 const String& function_name_;
725 const Token::Kind token_kind_; // Binary op, unary op, kGET or kILLEGAL. 730 const Token::Kind token_kind_; // Binary op, unary op, kGET or kILLEGAL.
726 ZoneGrowableArray<PushArgumentInstr*>* const arguments_; 731 ZoneGrowableArray<PushArgumentInstr*>* const arguments_;
727 const Array& argument_names_; 732 const Array& argument_names_;
728 const intptr_t checked_argument_count_; 733 const intptr_t checked_argument_count_;
729 734
(...skipping 13 matching lines...) Expand all
743 748
744 void PrintTo(BufferFormatter* f) const; 749 void PrintTo(BufferFormatter* f) const;
745 750
746 virtual intptr_t ArgumentCount() const { 751 virtual intptr_t ArgumentCount() const {
747 return instance_call()->ArgumentCount(); 752 return instance_call()->ArgumentCount();
748 } 753 }
749 754
750 DECLARE_CALL_COMPUTATION(PolymorphicInstanceCall) 755 DECLARE_CALL_COMPUTATION(PolymorphicInstanceCall)
751 756
752 virtual bool CanDeoptimize() const { return true; } 757 virtual bool CanDeoptimize() const { return true; }
758 virtual intptr_t ResultCid() const { return kDynamicCid; }
753 759
754 private: 760 private:
755 InstanceCallComp* instance_call_; 761 InstanceCallComp* instance_call_;
756 const bool with_checks_; 762 const bool with_checks_;
757 763
758 DISALLOW_COPY_AND_ASSIGN(PolymorphicInstanceCallComp); 764 DISALLOW_COPY_AND_ASSIGN(PolymorphicInstanceCallComp);
759 }; 765 };
760 766
761 767
762 class ComparisonComp : public TemplateComputation<2> { 768 class ComparisonComp : public TemplateComputation<2> {
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
909 PushArgumentInstr* ArgumentAt(intptr_t index) const { 915 PushArgumentInstr* ArgumentAt(intptr_t index) const {
910 return (*arguments_)[index]; 916 return (*arguments_)[index];
911 } 917 }
912 918
913 MethodRecognizer::Kind recognized() const { return recognized_; } 919 MethodRecognizer::Kind recognized() const { return recognized_; }
914 void set_recognized(MethodRecognizer::Kind kind) { recognized_ = kind; } 920 void set_recognized(MethodRecognizer::Kind kind) { recognized_ = kind; }
915 921
916 virtual void PrintOperandsTo(BufferFormatter* f) const; 922 virtual void PrintOperandsTo(BufferFormatter* f) const;
917 923
918 virtual bool CanDeoptimize() const { return false; } 924 virtual bool CanDeoptimize() const { return false; }
925 virtual intptr_t ResultCid() const { return kDynamicCid; }
919 926
920 private: 927 private:
921 const intptr_t token_pos_; 928 const intptr_t token_pos_;
922 const intptr_t try_index_; 929 const intptr_t try_index_;
923 const Function& function_; 930 const Function& function_;
924 const Array& argument_names_; 931 const Array& argument_names_;
925 ZoneGrowableArray<PushArgumentInstr*>* arguments_; 932 ZoneGrowableArray<PushArgumentInstr*>* arguments_;
926 MethodRecognizer::Kind recognized_; 933 MethodRecognizer::Kind recognized_;
927 934
928 DISALLOW_COPY_AND_ASSIGN(StaticCallComp); 935 DISALLOW_COPY_AND_ASSIGN(StaticCallComp);
929 }; 936 };
930 937
931 938
932 class LoadLocalComp : public TemplateComputation<0> { 939 class LoadLocalComp : public TemplateComputation<0> {
933 public: 940 public:
934 LoadLocalComp(const LocalVariable& local, intptr_t context_level) 941 LoadLocalComp(const LocalVariable& local, intptr_t context_level)
935 : local_(local), 942 : local_(local),
936 context_level_(context_level) { } 943 context_level_(context_level) { }
937 944
938 DECLARE_COMPUTATION(LoadLocal) 945 DECLARE_COMPUTATION(LoadLocal)
939 946
940 const LocalVariable& local() const { return local_; } 947 const LocalVariable& local() const { return local_; }
941 intptr_t context_level() const { return context_level_; } 948 intptr_t context_level() const { return context_level_; }
942 949
943 virtual void PrintOperandsTo(BufferFormatter* f) const; 950 virtual void PrintOperandsTo(BufferFormatter* f) const;
944 951
945 virtual bool CanDeoptimize() const { return false; } 952 virtual bool CanDeoptimize() const { return false; }
953 virtual intptr_t ResultCid() const { return kDynamicCid; }
946 954
947 private: 955 private:
948 const LocalVariable& local_; 956 const LocalVariable& local_;
949 const intptr_t context_level_; 957 const intptr_t context_level_;
950 958
951 DISALLOW_COPY_AND_ASSIGN(LoadLocalComp); 959 DISALLOW_COPY_AND_ASSIGN(LoadLocalComp);
952 }; 960 };
953 961
954 962
955 class StoreLocalComp : public TemplateComputation<1> { 963 class StoreLocalComp : public TemplateComputation<1> {
(...skipping 12 matching lines...) Expand all
968 const LocalVariable& local() const { return local_; } 976 const LocalVariable& local() const { return local_; }
969 Value* value() const { return inputs_[0]; } 977 Value* value() const { return inputs_[0]; }
970 intptr_t context_level() const { return context_level_; } 978 intptr_t context_level() const { return context_level_; }
971 979
972 virtual void RecordAssignedVars(BitVector* assigned_vars, 980 virtual void RecordAssignedVars(BitVector* assigned_vars,
973 intptr_t fixed_parameter_count); 981 intptr_t fixed_parameter_count);
974 982
975 virtual void PrintOperandsTo(BufferFormatter* f) const; 983 virtual void PrintOperandsTo(BufferFormatter* f) const;
976 984
977 virtual bool CanDeoptimize() const { return false; } 985 virtual bool CanDeoptimize() const { return false; }
986 virtual intptr_t ResultCid() const { return kDynamicCid; }
978 987
979 private: 988 private:
980 const LocalVariable& local_; 989 const LocalVariable& local_;
981 const intptr_t context_level_; 990 const intptr_t context_level_;
982 991
983 DISALLOW_COPY_AND_ASSIGN(StoreLocalComp); 992 DISALLOW_COPY_AND_ASSIGN(StoreLocalComp);
984 }; 993 };
985 994
986 995
987 class NativeCallComp : public TemplateComputation<0> { 996 class NativeCallComp : public TemplateComputation<0> {
(...skipping 20 matching lines...) Expand all
1008 return ast_node_.has_optional_parameters(); 1017 return ast_node_.has_optional_parameters();
1009 } 1018 }
1010 1019
1011 bool is_native_instance_closure() const { 1020 bool is_native_instance_closure() const {
1012 return ast_node_.is_native_instance_closure(); 1021 return ast_node_.is_native_instance_closure();
1013 } 1022 }
1014 1023
1015 virtual void PrintOperandsTo(BufferFormatter* f) const; 1024 virtual void PrintOperandsTo(BufferFormatter* f) const;
1016 1025
1017 virtual bool CanDeoptimize() const { return false; } 1026 virtual bool CanDeoptimize() const { return false; }
1027 virtual intptr_t ResultCid() const { return kDynamicCid; }
1018 1028
1019 private: 1029 private:
1020 const NativeBodyNode& ast_node_; 1030 const NativeBodyNode& ast_node_;
1021 const intptr_t try_index_; 1031 const intptr_t try_index_;
1022 1032
1023 DISALLOW_COPY_AND_ASSIGN(NativeCallComp); 1033 DISALLOW_COPY_AND_ASSIGN(NativeCallComp);
1024 }; 1034 };
1025 1035
1026 1036
1027 class LoadInstanceFieldComp : public TemplateComputation<1> { 1037 class LoadInstanceFieldComp : public TemplateComputation<1> {
1028 public: 1038 public:
1029 // Set 'original' to NULL if LoadInstanceFieldComp cannot deoptimize. 1039 // Set 'original' to NULL if LoadInstanceFieldComp cannot deoptimize.
1030 LoadInstanceFieldComp(const Field& field, 1040 LoadInstanceFieldComp(const Field& field,
1031 Value* instance, 1041 Value* instance,
1032 InstanceCallComp* original) 1042 InstanceCallComp* original)
1033 : field_(field), original_(original) { 1043 : field_(field), original_(original) {
1034 ASSERT(instance != NULL); 1044 ASSERT(instance != NULL);
1035 inputs_[0] = instance; 1045 inputs_[0] = instance;
1036 } 1046 }
1037 1047
1038 DECLARE_COMPUTATION(LoadInstanceField) 1048 DECLARE_COMPUTATION(LoadInstanceField)
1039 1049
1040 const Field& field() const { return field_; } 1050 const Field& field() const { return field_; }
1041 Value* instance() const { return inputs_[0]; } 1051 Value* instance() const { return inputs_[0]; }
1042 const InstanceCallComp* original() const { return original_; } 1052 const InstanceCallComp* original() const { return original_; }
1043 1053
1044 virtual void PrintOperandsTo(BufferFormatter* f) const; 1054 virtual void PrintOperandsTo(BufferFormatter* f) const;
1045 1055
1046 virtual bool CanDeoptimize() const { return original_ != NULL; } 1056 virtual bool CanDeoptimize() const { return original_ != NULL; }
1057 virtual intptr_t ResultCid() const { return kDynamicCid; }
1047 1058
1048 private: 1059 private:
1049 const Field& field_; 1060 const Field& field_;
1050 const InstanceCallComp* original_; // For optimizations. 1061 const InstanceCallComp* original_; // For optimizations.
1051 1062
1052 DISALLOW_COPY_AND_ASSIGN(LoadInstanceFieldComp); 1063 DISALLOW_COPY_AND_ASSIGN(LoadInstanceFieldComp);
1053 }; 1064 };
1054 1065
1055 1066
1056 class StoreInstanceFieldComp : public TemplateComputation<2> { 1067 class StoreInstanceFieldComp : public TemplateComputation<2> {
(...skipping 15 matching lines...) Expand all
1072 const Field& field() const { return field_; } 1083 const Field& field() const { return field_; }
1073 1084
1074 Value* instance() const { return inputs_[0]; } 1085 Value* instance() const { return inputs_[0]; }
1075 Value* value() const { return inputs_[1]; } 1086 Value* value() const { return inputs_[1]; }
1076 1087
1077 const InstanceCallComp* original() const { return original_; } 1088 const InstanceCallComp* original() const { return original_; }
1078 1089
1079 virtual void PrintOperandsTo(BufferFormatter* f) const; 1090 virtual void PrintOperandsTo(BufferFormatter* f) const;
1080 1091
1081 virtual bool CanDeoptimize() const { return original_ != NULL; } 1092 virtual bool CanDeoptimize() const { return original_ != NULL; }
1093 virtual intptr_t ResultCid() const { return kDynamicCid; }
1082 1094
1083 private: 1095 private:
1084 const Field& field_; 1096 const Field& field_;
1085 const InstanceCallComp* original_; // For optimizations. 1097 const InstanceCallComp* original_; // For optimizations.
1086 1098
1087 DISALLOW_COPY_AND_ASSIGN(StoreInstanceFieldComp); 1099 DISALLOW_COPY_AND_ASSIGN(StoreInstanceFieldComp);
1088 }; 1100 };
1089 1101
1090 1102
1091 class LoadStaticFieldComp : public TemplateComputation<0> { 1103 class LoadStaticFieldComp : public TemplateComputation<0> {
1092 public: 1104 public:
1093 explicit LoadStaticFieldComp(const Field& field) : field_(field) {} 1105 explicit LoadStaticFieldComp(const Field& field) : field_(field) {}
1094 1106
1095 DECLARE_COMPUTATION(LoadStaticField); 1107 DECLARE_COMPUTATION(LoadStaticField);
1096 1108
1097 const Field& field() const { return field_; } 1109 const Field& field() const { return field_; }
1098 1110
1099 virtual void PrintOperandsTo(BufferFormatter* f) const; 1111 virtual void PrintOperandsTo(BufferFormatter* f) const;
1100 1112
1101 virtual bool CanDeoptimize() const { return false; } 1113 virtual bool CanDeoptimize() const { return false; }
1114 virtual intptr_t ResultCid() const { return kDynamicCid; }
1102 1115
1103 private: 1116 private:
1104 const Field& field_; 1117 const Field& field_;
1105 1118
1106 DISALLOW_COPY_AND_ASSIGN(LoadStaticFieldComp); 1119 DISALLOW_COPY_AND_ASSIGN(LoadStaticFieldComp);
1107 }; 1120 };
1108 1121
1109 1122
1110 class StoreStaticFieldComp : public TemplateComputation<1> { 1123 class StoreStaticFieldComp : public TemplateComputation<1> {
1111 public: 1124 public:
1112 StoreStaticFieldComp(const Field& field, Value* value) 1125 StoreStaticFieldComp(const Field& field, Value* value)
1113 : field_(field) { 1126 : field_(field) {
1114 ASSERT(field.IsZoneHandle()); 1127 ASSERT(field.IsZoneHandle());
1115 ASSERT(value != NULL); 1128 ASSERT(value != NULL);
1116 inputs_[0] = value; 1129 inputs_[0] = value;
1117 } 1130 }
1118 1131
1119 DECLARE_COMPUTATION(StoreStaticField); 1132 DECLARE_COMPUTATION(StoreStaticField);
1120 1133
1121 const Field& field() const { return field_; } 1134 const Field& field() const { return field_; }
1122 Value* value() const { return inputs_[0]; } 1135 Value* value() const { return inputs_[0]; }
1123 1136
1124 virtual void PrintOperandsTo(BufferFormatter* f) const; 1137 virtual void PrintOperandsTo(BufferFormatter* f) const;
1125 1138
1126 virtual bool CanDeoptimize() const { return false; } 1139 virtual bool CanDeoptimize() const { return false; }
1140 virtual intptr_t ResultCid() const { return kDynamicCid; }
1127 1141
1128 private: 1142 private:
1129 const Field& field_; 1143 const Field& field_;
1130 1144
1131 DISALLOW_COPY_AND_ASSIGN(StoreStaticFieldComp); 1145 DISALLOW_COPY_AND_ASSIGN(StoreStaticFieldComp);
1132 }; 1146 };
1133 1147
1134 1148
1135 class LoadIndexedComp : public TemplateComputation<2> { 1149 class LoadIndexedComp : public TemplateComputation<2> {
1136 public: 1150 public:
(...skipping 12 matching lines...) Expand all
1149 DECLARE_COMPUTATION(LoadIndexed) 1163 DECLARE_COMPUTATION(LoadIndexed)
1150 1164
1151 Value* array() const { return inputs_[0]; } 1165 Value* array() const { return inputs_[0]; }
1152 Value* index() const { return inputs_[1]; } 1166 Value* index() const { return inputs_[1]; }
1153 1167
1154 intptr_t receiver_type() const { return receiver_type_; } 1168 intptr_t receiver_type() const { return receiver_type_; }
1155 1169
1156 InstanceCallComp* original() const { return original_; } 1170 InstanceCallComp* original() const { return original_; }
1157 1171
1158 virtual bool CanDeoptimize() const { return true; } 1172 virtual bool CanDeoptimize() const { return true; }
1173 virtual intptr_t ResultCid() const { return kDynamicCid; }
1159 1174
1160 private: 1175 private:
1161 intptr_t receiver_type_; 1176 intptr_t receiver_type_;
1162 InstanceCallComp* original_; 1177 InstanceCallComp* original_;
1163 1178
1164 DISALLOW_COPY_AND_ASSIGN(LoadIndexedComp); 1179 DISALLOW_COPY_AND_ASSIGN(LoadIndexedComp);
1165 }; 1180 };
1166 1181
1167 1182
1168 class StoreIndexedComp : public TemplateComputation<3> { 1183 class StoreIndexedComp : public TemplateComputation<3> {
(...skipping 17 matching lines...) Expand all
1186 1201
1187 Value* array() const { return inputs_[0]; } 1202 Value* array() const { return inputs_[0]; }
1188 Value* index() const { return inputs_[1]; } 1203 Value* index() const { return inputs_[1]; }
1189 Value* value() const { return inputs_[2]; } 1204 Value* value() const { return inputs_[2]; }
1190 1205
1191 InstanceCallComp* original() const { return original_; } 1206 InstanceCallComp* original() const { return original_; }
1192 1207
1193 intptr_t receiver_type() const { return receiver_type_; } 1208 intptr_t receiver_type() const { return receiver_type_; }
1194 1209
1195 virtual bool CanDeoptimize() const { return true; } 1210 virtual bool CanDeoptimize() const { return true; }
1211 virtual intptr_t ResultCid() const { return kDynamicCid; }
1196 1212
1197 private: 1213 private:
1198 intptr_t receiver_type_; 1214 intptr_t receiver_type_;
1199 InstanceCallComp* original_; 1215 InstanceCallComp* original_;
1200 1216
1201 DISALLOW_COPY_AND_ASSIGN(StoreIndexedComp); 1217 DISALLOW_COPY_AND_ASSIGN(StoreIndexedComp);
1202 }; 1218 };
1203 1219
1204 1220
1205 // Note overrideable, built-in: value? false : true. 1221 // Note overrideable, built-in: value? false : true.
1206 class BooleanNegateComp : public TemplateComputation<1> { 1222 class BooleanNegateComp : public TemplateComputation<1> {
1207 public: 1223 public:
1208 explicit BooleanNegateComp(Value* value) { 1224 explicit BooleanNegateComp(Value* value) {
1209 ASSERT(value != NULL); 1225 ASSERT(value != NULL);
1210 inputs_[0] = value; 1226 inputs_[0] = value;
1211 } 1227 }
1212 1228
1213 DECLARE_COMPUTATION(BooleanNegate) 1229 DECLARE_COMPUTATION(BooleanNegate)
1214 1230
1215 Value* value() const { return inputs_[0]; } 1231 Value* value() const { return inputs_[0]; }
1216 1232
1217 virtual bool CanDeoptimize() const { return false; } 1233 virtual bool CanDeoptimize() const { return false; }
1234 virtual intptr_t ResultCid() const { return kBoolCid; }
1218 1235
1219 private: 1236 private:
1220 DISALLOW_COPY_AND_ASSIGN(BooleanNegateComp); 1237 DISALLOW_COPY_AND_ASSIGN(BooleanNegateComp);
1221 }; 1238 };
1222 1239
1223 1240
1224 class InstanceOfComp : public TemplateComputation<3> { 1241 class InstanceOfComp : public TemplateComputation<3> {
1225 public: 1242 public:
1226 InstanceOfComp(intptr_t token_pos, 1243 InstanceOfComp(intptr_t token_pos,
1227 intptr_t try_index, 1244 intptr_t try_index,
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1289 return (*arguments_)[index]; 1306 return (*arguments_)[index];
1290 } 1307 }
1291 1308
1292 const Function& constructor() const { return ast_node_.constructor(); } 1309 const Function& constructor() const { return ast_node_.constructor(); }
1293 intptr_t token_pos() const { return ast_node_.token_pos(); } 1310 intptr_t token_pos() const { return ast_node_.token_pos(); }
1294 intptr_t try_index() const { return try_index_; } 1311 intptr_t try_index() const { return try_index_; }
1295 1312
1296 virtual void PrintOperandsTo(BufferFormatter* f) const; 1313 virtual void PrintOperandsTo(BufferFormatter* f) const;
1297 1314
1298 virtual bool CanDeoptimize() const { return false; } 1315 virtual bool CanDeoptimize() const { return false; }
1316 virtual intptr_t ResultCid() const { return kDynamicCid; }
1299 1317
1300 private: 1318 private:
1301 const ConstructorCallNode& ast_node_; 1319 const ConstructorCallNode& ast_node_;
1302 const intptr_t try_index_; 1320 const intptr_t try_index_;
1303 ZoneGrowableArray<PushArgumentInstr*>* const arguments_; 1321 ZoneGrowableArray<PushArgumentInstr*>* const arguments_;
1304 1322
1305 DISALLOW_COPY_AND_ASSIGN(AllocateObjectComp); 1323 DISALLOW_COPY_AND_ASSIGN(AllocateObjectComp);
1306 }; 1324 };
1307 1325
1308 1326
(...skipping 12 matching lines...) Expand all
1321 1339
1322 DECLARE_COMPUTATION(AllocateObjectWithBoundsCheck) 1340 DECLARE_COMPUTATION(AllocateObjectWithBoundsCheck)
1323 1341
1324 const Function& constructor() const { return ast_node_.constructor(); } 1342 const Function& constructor() const { return ast_node_.constructor(); }
1325 intptr_t token_pos() const { return ast_node_.token_pos(); } 1343 intptr_t token_pos() const { return ast_node_.token_pos(); }
1326 intptr_t try_index() const { return try_index_; } 1344 intptr_t try_index() const { return try_index_; }
1327 1345
1328 virtual void PrintOperandsTo(BufferFormatter* f) const; 1346 virtual void PrintOperandsTo(BufferFormatter* f) const;
1329 1347
1330 virtual bool CanDeoptimize() const { return false; } 1348 virtual bool CanDeoptimize() const { return false; }
1349 virtual intptr_t ResultCid() const { return kDynamicCid; }
1331 1350
1332 private: 1351 private:
1333 const ConstructorCallNode& ast_node_; 1352 const ConstructorCallNode& ast_node_;
1334 const intptr_t try_index_; 1353 const intptr_t try_index_;
1335 1354
1336 DISALLOW_COPY_AND_ASSIGN(AllocateObjectWithBoundsCheckComp); 1355 DISALLOW_COPY_AND_ASSIGN(AllocateObjectWithBoundsCheckComp);
1337 }; 1356 };
1338 1357
1339 1358
1340 class CreateArrayComp : public TemplateComputation<1> { 1359 class CreateArrayComp : public TemplateComputation<1> {
(...skipping 25 matching lines...) Expand all
1366 1385
1367 intptr_t token_pos() const { return token_pos_; } 1386 intptr_t token_pos() const { return token_pos_; }
1368 intptr_t try_index() const { return try_index_; } 1387 intptr_t try_index() const { return try_index_; }
1369 PushArgumentInstr* ArgumentAt(intptr_t i) const { return (*arguments_)[i]; } 1388 PushArgumentInstr* ArgumentAt(intptr_t i) const { return (*arguments_)[i]; }
1370 const AbstractType& type() const { return type_; } 1389 const AbstractType& type() const { return type_; }
1371 Value* element_type() const { return inputs_[0]; } 1390 Value* element_type() const { return inputs_[0]; }
1372 1391
1373 virtual void PrintOperandsTo(BufferFormatter* f) const; 1392 virtual void PrintOperandsTo(BufferFormatter* f) const;
1374 1393
1375 virtual bool CanDeoptimize() const { return false; } 1394 virtual bool CanDeoptimize() const { return false; }
1395 virtual intptr_t ResultCid() const { return kDynamicCid; }
1376 1396
1377 private: 1397 private:
1378 const intptr_t token_pos_; 1398 const intptr_t token_pos_;
1379 const intptr_t try_index_; 1399 const intptr_t try_index_;
1380 ZoneGrowableArray<PushArgumentInstr*>* const arguments_; 1400 ZoneGrowableArray<PushArgumentInstr*>* const arguments_;
1381 const AbstractType& type_; 1401 const AbstractType& type_;
1382 1402
1383 DISALLOW_COPY_AND_ASSIGN(CreateArrayComp); 1403 DISALLOW_COPY_AND_ASSIGN(CreateArrayComp);
1384 }; 1404 };
1385 1405
(...skipping 14 matching lines...) Expand all
1400 const Function& function() const { return ast_node_.function(); } 1420 const Function& function() const { return ast_node_.function(); }
1401 1421
1402 virtual intptr_t ArgumentCount() const { return arguments_->length(); } 1422 virtual intptr_t ArgumentCount() const { return arguments_->length(); }
1403 PushArgumentInstr* ArgumentAt(intptr_t index) const { 1423 PushArgumentInstr* ArgumentAt(intptr_t index) const {
1404 return (*arguments_)[index]; 1424 return (*arguments_)[index];
1405 } 1425 }
1406 1426
1407 virtual void PrintOperandsTo(BufferFormatter* f) const; 1427 virtual void PrintOperandsTo(BufferFormatter* f) const;
1408 1428
1409 virtual bool CanDeoptimize() const { return false; } 1429 virtual bool CanDeoptimize() const { return false; }
1430 virtual intptr_t ResultCid() const { return kDynamicCid; }
1410 1431
1411 private: 1432 private:
1412 const ClosureNode& ast_node_; 1433 const ClosureNode& ast_node_;
1413 const intptr_t try_index_; 1434 const intptr_t try_index_;
1414 ZoneGrowableArray<PushArgumentInstr*>* arguments_; 1435 ZoneGrowableArray<PushArgumentInstr*>* arguments_;
1415 1436
1416 DISALLOW_COPY_AND_ASSIGN(CreateClosureComp); 1437 DISALLOW_COPY_AND_ASSIGN(CreateClosureComp);
1417 }; 1438 };
1418 1439
1419 1440
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
1473 DECLARE_COMPUTATION(StoreVMField) 1494 DECLARE_COMPUTATION(StoreVMField)
1474 1495
1475 Value* value() const { return inputs_[0]; } 1496 Value* value() const { return inputs_[0]; }
1476 Value* dest() const { return inputs_[1]; } 1497 Value* dest() const { return inputs_[1]; }
1477 intptr_t offset_in_bytes() const { return offset_in_bytes_; } 1498 intptr_t offset_in_bytes() const { return offset_in_bytes_; }
1478 const AbstractType& type() const { return type_; } 1499 const AbstractType& type() const { return type_; }
1479 1500
1480 virtual void PrintOperandsTo(BufferFormatter* f) const; 1501 virtual void PrintOperandsTo(BufferFormatter* f) const;
1481 1502
1482 virtual bool CanDeoptimize() const { return false; } 1503 virtual bool CanDeoptimize() const { return false; }
1504 virtual intptr_t ResultCid() const { return kDynamicCid; }
1483 1505
1484 private: 1506 private:
1485 const intptr_t offset_in_bytes_; 1507 const intptr_t offset_in_bytes_;
1486 const AbstractType& type_; 1508 const AbstractType& type_;
1487 1509
1488 DISALLOW_COPY_AND_ASSIGN(StoreVMFieldComp); 1510 DISALLOW_COPY_AND_ASSIGN(StoreVMFieldComp);
1489 }; 1511 };
1490 1512
1491 1513
1492 class InstantiateTypeArgumentsComp : public TemplateComputation<1> { 1514 class InstantiateTypeArgumentsComp : public TemplateComputation<1> {
(...skipping 15 matching lines...) Expand all
1508 Value* instantiator() const { return inputs_[0]; } 1530 Value* instantiator() const { return inputs_[0]; }
1509 const AbstractTypeArguments& type_arguments() const { 1531 const AbstractTypeArguments& type_arguments() const {
1510 return type_arguments_; 1532 return type_arguments_;
1511 } 1533 }
1512 intptr_t token_pos() const { return token_pos_; } 1534 intptr_t token_pos() const { return token_pos_; }
1513 intptr_t try_index() const { return try_index_; } 1535 intptr_t try_index() const { return try_index_; }
1514 1536
1515 virtual void PrintOperandsTo(BufferFormatter* f) const; 1537 virtual void PrintOperandsTo(BufferFormatter* f) const;
1516 1538
1517 virtual bool CanDeoptimize() const { return false; } 1539 virtual bool CanDeoptimize() const { return false; }
1540 virtual intptr_t ResultCid() const { return kDynamicCid; }
1518 1541
1519 private: 1542 private:
1520 const intptr_t token_pos_; 1543 const intptr_t token_pos_;
1521 const intptr_t try_index_; 1544 const intptr_t try_index_;
1522 const AbstractTypeArguments& type_arguments_; 1545 const AbstractTypeArguments& type_arguments_;
1523 1546
1524 DISALLOW_COPY_AND_ASSIGN(InstantiateTypeArgumentsComp); 1547 DISALLOW_COPY_AND_ASSIGN(InstantiateTypeArgumentsComp);
1525 }; 1548 };
1526 1549
1527 1550
(...skipping 16 matching lines...) Expand all
1544 Value* instantiator() const { return inputs_[0]; } 1567 Value* instantiator() const { return inputs_[0]; }
1545 const AbstractTypeArguments& type_arguments() const { 1568 const AbstractTypeArguments& type_arguments() const {
1546 return type_arguments_; 1569 return type_arguments_;
1547 } 1570 }
1548 intptr_t token_pos() const { return token_pos_; } 1571 intptr_t token_pos() const { return token_pos_; }
1549 intptr_t try_index() const { return try_index_; } 1572 intptr_t try_index() const { return try_index_; }
1550 1573
1551 virtual void PrintOperandsTo(BufferFormatter* f) const; 1574 virtual void PrintOperandsTo(BufferFormatter* f) const;
1552 1575
1553 virtual bool CanDeoptimize() const { return false; } 1576 virtual bool CanDeoptimize() const { return false; }
1577 virtual intptr_t ResultCid() const { return kDynamicCid; }
1554 1578
1555 private: 1579 private:
1556 const intptr_t token_pos_; 1580 const intptr_t token_pos_;
1557 const intptr_t try_index_; 1581 const intptr_t try_index_;
1558 const AbstractTypeArguments& type_arguments_; 1582 const AbstractTypeArguments& type_arguments_;
1559 1583
1560 DISALLOW_COPY_AND_ASSIGN(ExtractConstructorTypeArgumentsComp); 1584 DISALLOW_COPY_AND_ASSIGN(ExtractConstructorTypeArgumentsComp);
1561 }; 1585 };
1562 1586
1563 1587
1564 class ExtractConstructorInstantiatorComp : public TemplateComputation<1> { 1588 class ExtractConstructorInstantiatorComp : public TemplateComputation<1> {
1565 public: 1589 public:
1566 ExtractConstructorInstantiatorComp(ConstructorCallNode* ast_node, 1590 ExtractConstructorInstantiatorComp(ConstructorCallNode* ast_node,
1567 Value* instantiator) 1591 Value* instantiator)
1568 : ast_node_(*ast_node) { 1592 : ast_node_(*ast_node) {
1569 ASSERT(instantiator != NULL); 1593 ASSERT(instantiator != NULL);
1570 inputs_[0] = instantiator; 1594 inputs_[0] = instantiator;
1571 } 1595 }
1572 1596
1573 DECLARE_COMPUTATION(ExtractConstructorInstantiator) 1597 DECLARE_COMPUTATION(ExtractConstructorInstantiator)
1574 1598
1575 Value* instantiator() const { return inputs_[0]; } 1599 Value* instantiator() const { return inputs_[0]; }
1576 const AbstractTypeArguments& type_arguments() const { 1600 const AbstractTypeArguments& type_arguments() const {
1577 return ast_node_.type_arguments(); 1601 return ast_node_.type_arguments();
1578 } 1602 }
1579 const Function& constructor() const { return ast_node_.constructor(); } 1603 const Function& constructor() const { return ast_node_.constructor(); }
1580 intptr_t token_pos() const { return ast_node_.token_pos(); } 1604 intptr_t token_pos() const { return ast_node_.token_pos(); }
1581 1605
1582 virtual bool CanDeoptimize() const { return false; } 1606 virtual bool CanDeoptimize() const { return false; }
1607 virtual intptr_t ResultCid() const { return kDynamicCid; }
1583 1608
1584 private: 1609 private:
1585 const ConstructorCallNode& ast_node_; 1610 const ConstructorCallNode& ast_node_;
1586 1611
1587 DISALLOW_COPY_AND_ASSIGN(ExtractConstructorInstantiatorComp); 1612 DISALLOW_COPY_AND_ASSIGN(ExtractConstructorInstantiatorComp);
1588 }; 1613 };
1589 1614
1590 1615
1591 class AllocateContextComp : public TemplateComputation<0> { 1616 class AllocateContextComp : public TemplateComputation<0> {
1592 public: 1617 public:
1593 AllocateContextComp(intptr_t token_pos, 1618 AllocateContextComp(intptr_t token_pos,
1594 intptr_t try_index, 1619 intptr_t try_index,
1595 intptr_t num_context_variables) 1620 intptr_t num_context_variables)
1596 : token_pos_(token_pos), 1621 : token_pos_(token_pos),
1597 try_index_(try_index), 1622 try_index_(try_index),
1598 num_context_variables_(num_context_variables) {} 1623 num_context_variables_(num_context_variables) {}
1599 1624
1600 DECLARE_COMPUTATION(AllocateContext); 1625 DECLARE_COMPUTATION(AllocateContext);
1601 1626
1602 intptr_t token_pos() const { return token_pos_; } 1627 intptr_t token_pos() const { return token_pos_; }
1603 intptr_t try_index() const { return try_index_; } 1628 intptr_t try_index() const { return try_index_; }
1604 intptr_t num_context_variables() const { return num_context_variables_; } 1629 intptr_t num_context_variables() const { return num_context_variables_; }
1605 1630
1606 virtual void PrintOperandsTo(BufferFormatter* f) const; 1631 virtual void PrintOperandsTo(BufferFormatter* f) const;
1607 1632
1608 virtual bool CanDeoptimize() const { return false; } 1633 virtual bool CanDeoptimize() const { return false; }
1634 virtual intptr_t ResultCid() const { return kDynamicCid; }
1609 1635
1610 private: 1636 private:
1611 const intptr_t token_pos_; 1637 const intptr_t token_pos_;
1612 const intptr_t try_index_; 1638 const intptr_t try_index_;
1613 const intptr_t num_context_variables_; 1639 const intptr_t num_context_variables_;
1614 1640
1615 DISALLOW_COPY_AND_ASSIGN(AllocateContextComp); 1641 DISALLOW_COPY_AND_ASSIGN(AllocateContextComp);
1616 }; 1642 };
1617 1643
1618 1644
1619 class ChainContextComp : public TemplateComputation<1> { 1645 class ChainContextComp : public TemplateComputation<1> {
1620 public: 1646 public:
1621 explicit ChainContextComp(Value* context_value) { 1647 explicit ChainContextComp(Value* context_value) {
1622 ASSERT(context_value != NULL); 1648 ASSERT(context_value != NULL);
1623 inputs_[0] = context_value; 1649 inputs_[0] = context_value;
1624 } 1650 }
1625 1651
1626 DECLARE_COMPUTATION(ChainContext) 1652 DECLARE_COMPUTATION(ChainContext)
1627 1653
1628 Value* context_value() const { return inputs_[0]; } 1654 Value* context_value() const { return inputs_[0]; }
1629 1655
1630 virtual bool CanDeoptimize() const { return false; } 1656 virtual bool CanDeoptimize() const { return false; }
1657 virtual intptr_t ResultCid() const { return kIllegalCid; }
1631 1658
1632 private: 1659 private:
1633 DISALLOW_COPY_AND_ASSIGN(ChainContextComp); 1660 DISALLOW_COPY_AND_ASSIGN(ChainContextComp);
1634 }; 1661 };
1635 1662
1636 1663
1637 class CloneContextComp : public TemplateComputation<1> { 1664 class CloneContextComp : public TemplateComputation<1> {
1638 public: 1665 public:
1639 CloneContextComp(intptr_t token_pos, 1666 CloneContextComp(intptr_t token_pos,
1640 intptr_t try_index, 1667 intptr_t try_index,
1641 Value* context_value) 1668 Value* context_value)
1642 : token_pos_(token_pos), 1669 : token_pos_(token_pos),
1643 try_index_(try_index) { 1670 try_index_(try_index) {
1644 ASSERT(context_value != NULL); 1671 ASSERT(context_value != NULL);
1645 inputs_[0] = context_value; 1672 inputs_[0] = context_value;
1646 } 1673 }
1647 1674
1648 intptr_t token_pos() const { return token_pos_; } 1675 intptr_t token_pos() const { return token_pos_; }
1649 intptr_t try_index() const { return try_index_; } 1676 intptr_t try_index() const { return try_index_; }
1650 Value* context_value() const { return inputs_[0]; } 1677 Value* context_value() const { return inputs_[0]; }
1651 1678
1652 DECLARE_COMPUTATION(CloneContext) 1679 DECLARE_COMPUTATION(CloneContext)
1653 1680
1654 virtual bool CanDeoptimize() const { return false; } 1681 virtual bool CanDeoptimize() const { return false; }
1682 virtual intptr_t ResultCid() const { return kIllegalCid; }
1655 1683
1656 private: 1684 private:
1657 const intptr_t token_pos_; 1685 const intptr_t token_pos_;
1658 const intptr_t try_index_; 1686 const intptr_t try_index_;
1659 1687
1660 DISALLOW_COPY_AND_ASSIGN(CloneContextComp); 1688 DISALLOW_COPY_AND_ASSIGN(CloneContextComp);
1661 }; 1689 };
1662 1690
1663 1691
1664 class CatchEntryComp : public TemplateComputation<0> { 1692 class CatchEntryComp : public TemplateComputation<0> {
1665 public: 1693 public:
1666 CatchEntryComp(const LocalVariable& exception_var, 1694 CatchEntryComp(const LocalVariable& exception_var,
1667 const LocalVariable& stacktrace_var) 1695 const LocalVariable& stacktrace_var)
1668 : exception_var_(exception_var), stacktrace_var_(stacktrace_var) {} 1696 : exception_var_(exception_var), stacktrace_var_(stacktrace_var) {}
1669 1697
1670 const LocalVariable& exception_var() const { return exception_var_; } 1698 const LocalVariable& exception_var() const { return exception_var_; }
1671 const LocalVariable& stacktrace_var() const { return stacktrace_var_; } 1699 const LocalVariable& stacktrace_var() const { return stacktrace_var_; }
1672 1700
1673 DECLARE_COMPUTATION(CatchEntry) 1701 DECLARE_COMPUTATION(CatchEntry)
1674 1702
1675 virtual void PrintOperandsTo(BufferFormatter* f) const; 1703 virtual void PrintOperandsTo(BufferFormatter* f) const;
1676 1704
1677 virtual bool CanDeoptimize() const { return false; } 1705 virtual bool CanDeoptimize() const { return false; }
1706 virtual intptr_t ResultCid() const { return kIllegalCid; }
1678 1707
1679 private: 1708 private:
1680 const LocalVariable& exception_var_; 1709 const LocalVariable& exception_var_;
1681 const LocalVariable& stacktrace_var_; 1710 const LocalVariable& stacktrace_var_;
1682 1711
1683 DISALLOW_COPY_AND_ASSIGN(CatchEntryComp); 1712 DISALLOW_COPY_AND_ASSIGN(CatchEntryComp);
1684 }; 1713 };
1685 1714
1686 1715
1687 class CheckEitherNonSmiComp : public TemplateComputation<2> { 1716 class CheckEitherNonSmiComp : public TemplateComputation<2> {
1688 public: 1717 public:
1689 CheckEitherNonSmiComp(Value* left, 1718 CheckEitherNonSmiComp(Value* left,
1690 Value* right, 1719 Value* right,
1691 InstanceCallComp* instance_call) 1720 InstanceCallComp* instance_call)
1692 : instance_call_(instance_call) { 1721 : instance_call_(instance_call) {
1693 ASSERT(left != NULL); 1722 ASSERT(left != NULL);
1694 ASSERT(right != NULL); 1723 ASSERT(right != NULL);
1695 inputs_[0] = left; 1724 inputs_[0] = left;
1696 inputs_[1] = right; 1725 inputs_[1] = right;
1697 } 1726 }
1698 1727
1699 DECLARE_COMPUTATION(CheckEitherNonSmi) 1728 DECLARE_COMPUTATION(CheckEitherNonSmi)
1700 1729
1701 virtual bool CanDeoptimize() const { return true; } 1730 virtual bool CanDeoptimize() const { return true; }
1731 virtual intptr_t ResultCid() const { return kIllegalCid; }
1702 1732
1703 virtual bool HasSideEffect() const { return false; } 1733 virtual bool HasSideEffect() const { return false; }
1704 1734
1705 Value* left() const { return inputs_[0]; } 1735 Value* left() const { return inputs_[0]; }
1706 1736
1707 Value* right() const { return inputs_[1]; } 1737 Value* right() const { return inputs_[1]; }
1708 1738
1709 virtual Definition* TryReplace(BindInstr* instr) const; 1739 virtual Definition* TryReplace(BindInstr* instr) const;
1710 1740
1711 private: 1741 private:
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1746 ASSERT(value != NULL); 1776 ASSERT(value != NULL);
1747 inputs_[0] = value; 1777 inputs_[0] = value;
1748 } 1778 }
1749 1779
1750 Value* value() const { return inputs_[0]; } 1780 Value* value() const { return inputs_[0]; }
1751 InstanceCallComp* instance_call() const { return instance_call_; } 1781 InstanceCallComp* instance_call() const { return instance_call_; }
1752 1782
1753 virtual bool CanDeoptimize() const { 1783 virtual bool CanDeoptimize() const {
1754 return value()->ResultCid() != kDoubleCid; 1784 return value()->ResultCid() != kDoubleCid;
1755 } 1785 }
1786 // The output is not an instance.
1787 virtual intptr_t ResultCid() const { return kDynamicCid; }
1756 1788
1757 virtual Representation representation() const { 1789 virtual Representation representation() const {
1758 return kUnboxedDouble; 1790 return kUnboxedDouble;
1759 } 1791 }
1760 1792
1761 DECLARE_COMPUTATION(UnboxDouble) 1793 DECLARE_COMPUTATION(UnboxDouble)
1762 1794
1763 private: 1795 private:
1764 InstanceCallComp* instance_call_; 1796 InstanceCallComp* instance_call_;
1765 1797
(...skipping 14 matching lines...) Expand all
1780 } 1812 }
1781 1813
1782 Value* left() const { return inputs_[0]; } 1814 Value* left() const { return inputs_[0]; }
1783 Value* right() const { return inputs_[1]; } 1815 Value* right() const { return inputs_[1]; }
1784 1816
1785 Token::Kind op_kind() const { return op_kind_; } 1817 Token::Kind op_kind() const { return op_kind_; }
1786 1818
1787 virtual void PrintOperandsTo(BufferFormatter* f) const; 1819 virtual void PrintOperandsTo(BufferFormatter* f) const;
1788 1820
1789 virtual bool CanDeoptimize() const { return false; } 1821 virtual bool CanDeoptimize() const { return false; }
1822 // The output is not an instance.
1823 virtual intptr_t ResultCid() const { return kDynamicCid; }
1790 1824
1791 virtual Representation representation() const { 1825 virtual Representation representation() const {
1792 return kUnboxedDouble; 1826 return kUnboxedDouble;
1793 } 1827 }
1794 1828
1795 DECLARE_COMPUTATION(UnboxedDoubleBinaryOp) 1829 DECLARE_COMPUTATION(UnboxedDoubleBinaryOp)
1796 1830
1797 private: 1831 private:
1798 const Token::Kind op_kind_; 1832 const Token::Kind op_kind_;
1799 1833
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
1940 inputs_[0] = value; 1974 inputs_[0] = value;
1941 } 1975 }
1942 1976
1943 Value* value() const { return inputs_[0]; } 1977 Value* value() const { return inputs_[0]; }
1944 1978
1945 InstanceCallComp* instance_call() const { return instance_call_; } 1979 InstanceCallComp* instance_call() const { return instance_call_; }
1946 1980
1947 DECLARE_COMPUTATION(NumberNegate) 1981 DECLARE_COMPUTATION(NumberNegate)
1948 1982
1949 virtual bool CanDeoptimize() const { return true; } 1983 virtual bool CanDeoptimize() const { return true; }
1984 virtual intptr_t ResultCid() const { return kDoubleCid; }
1950 1985
1951 private: 1986 private:
1952 InstanceCallComp* instance_call_; 1987 InstanceCallComp* instance_call_;
1953 1988
1954 DISALLOW_COPY_AND_ASSIGN(NumberNegateComp); 1989 DISALLOW_COPY_AND_ASSIGN(NumberNegateComp);
1955 }; 1990 };
1956 1991
1957 1992
1958 class CheckStackOverflowComp : public TemplateComputation<0> { 1993 class CheckStackOverflowComp : public TemplateComputation<0> {
1959 public: 1994 public:
1960 CheckStackOverflowComp(intptr_t token_pos, intptr_t try_index) 1995 CheckStackOverflowComp(intptr_t token_pos, intptr_t try_index)
1961 : token_pos_(token_pos), 1996 : token_pos_(token_pos),
1962 try_index_(try_index) {} 1997 try_index_(try_index) {}
1963 1998
1964 intptr_t token_pos() const { return token_pos_; } 1999 intptr_t token_pos() const { return token_pos_; }
1965 intptr_t try_index() const { return try_index_; } 2000 intptr_t try_index() const { return try_index_; }
1966 2001
1967 DECLARE_COMPUTATION(CheckStackOverflow) 2002 DECLARE_COMPUTATION(CheckStackOverflow)
1968 2003
1969 virtual bool CanDeoptimize() const { return false; } 2004 virtual bool CanDeoptimize() const { return false; }
2005 virtual intptr_t ResultCid() const { return kIllegalCid; }
1970 2006
1971 private: 2007 private:
1972 const intptr_t token_pos_; 2008 const intptr_t token_pos_;
1973 const intptr_t try_index_; 2009 const intptr_t try_index_;
1974 2010
1975 DISALLOW_COPY_AND_ASSIGN(CheckStackOverflowComp); 2011 DISALLOW_COPY_AND_ASSIGN(CheckStackOverflowComp);
1976 }; 2012 };
1977 2013
1978 2014
1979 class DoubleToDoubleComp : public TemplateComputation<1> { 2015 class DoubleToDoubleComp : public TemplateComputation<1> {
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
2025 public: 2061 public:
2026 CheckClassComp(Value* value, InstanceCallComp* original) 2062 CheckClassComp(Value* value, InstanceCallComp* original)
2027 : original_(original) { 2063 : original_(original) {
2028 ASSERT(value != NULL); 2064 ASSERT(value != NULL);
2029 inputs_[0] = value; 2065 inputs_[0] = value;
2030 } 2066 }
2031 2067
2032 DECLARE_COMPUTATION(CheckClass) 2068 DECLARE_COMPUTATION(CheckClass)
2033 2069
2034 virtual bool CanDeoptimize() const { return true; } 2070 virtual bool CanDeoptimize() const { return true; }
2071 virtual intptr_t ResultCid() const { return kIllegalCid; }
2035 2072
2036 virtual bool AttributesEqual(Computation* other) const; 2073 virtual bool AttributesEqual(Computation* other) const;
2037 2074
2038 virtual bool HasSideEffect() const { return false; } 2075 virtual bool HasSideEffect() const { return false; }
2039 2076
2040 Value* value() const { return inputs_[0]; } 2077 Value* value() const { return inputs_[0]; }
2041 2078
2042 intptr_t deopt_id() const { return original_->deopt_id(); } 2079 intptr_t deopt_id() const { return original_->deopt_id(); }
2043 intptr_t try_index() const { return original_->try_index(); } 2080 intptr_t try_index() const { return original_->try_index(); }
2044 2081
(...skipping 10 matching lines...) Expand all
2055 public: 2092 public:
2056 CheckSmiComp(Value* value, InstanceCallComp* original) 2093 CheckSmiComp(Value* value, InstanceCallComp* original)
2057 : original_(original) { 2094 : original_(original) {
2058 ASSERT(value != NULL); 2095 ASSERT(value != NULL);
2059 inputs_[0] = value; 2096 inputs_[0] = value;
2060 } 2097 }
2061 2098
2062 DECLARE_COMPUTATION(CheckSmi) 2099 DECLARE_COMPUTATION(CheckSmi)
2063 2100
2064 virtual bool CanDeoptimize() const { return true; } 2101 virtual bool CanDeoptimize() const { return true; }
2102 virtual intptr_t ResultCid() const { return kIllegalCid; }
2065 2103
2066 virtual bool AttributesEqual(Computation* other) const { return true; } 2104 virtual bool AttributesEqual(Computation* other) const { return true; }
2067 2105
2068 virtual bool HasSideEffect() const { return false; } 2106 virtual bool HasSideEffect() const { return false; }
2069 2107
2070 virtual Definition* TryReplace(BindInstr* instr) const; 2108 virtual Definition* TryReplace(BindInstr* instr) const;
2071 2109
2072 Value* value() const { return inputs_[0]; } 2110 Value* value() const { return inputs_[0]; }
2073 2111
2074 intptr_t deopt_id() const { return original_->deopt_id(); } 2112 intptr_t deopt_id() const { return original_->deopt_id(); }
(...skipping 1210 matching lines...) Expand 10 before | Expand all | Expand 10 after
3285 ForwardInstructionIterator* current_iterator_; 3323 ForwardInstructionIterator* current_iterator_;
3286 3324
3287 private: 3325 private:
3288 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor); 3326 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor);
3289 }; 3327 };
3290 3328
3291 3329
3292 } // namespace dart 3330 } // namespace dart
3293 3331
3294 #endif // VM_INTERMEDIATE_LANGUAGE_H_ 3332 #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