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

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

Issue 2859673002: Pass type argument vector to generic functions (if --reify-generic-functions is (Closed)
Patch Set: sync and work in progress Created 3 years, 7 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
« no previous file with comments | « runtime/vm/flow_graph_inliner.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 RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ 5 #ifndef RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_
6 #define RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ 6 #define RUNTIME_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 2690 matching lines...) Expand 10 before | Expand all | Expand 10 after
2701 2701
2702 virtual EffectSet Effects() const { return EffectSet::None(); } 2702 virtual EffectSet Effects() const { return EffectSet::None(); }
2703 virtual EffectSet Dependencies() const { return EffectSet::None(); } 2703 virtual EffectSet Dependencies() const { return EffectSet::None(); }
2704 virtual bool AttributesEqual(Instruction* other) const { return true; } 2704 virtual bool AttributesEqual(Instruction* other) const { return true; }
2705 2705
2706 private: 2706 private:
2707 DISALLOW_COPY_AND_ASSIGN(CurrentContextInstr); 2707 DISALLOW_COPY_AND_ASSIGN(CurrentContextInstr);
2708 }; 2708 };
2709 2709
2710 2710
2711 class ClosureCallInstr : public TemplateDefinition<1, Throws> { 2711 struct ArgumentsInfo {
2712 ArgumentsInfo(intptr_t type_args_len,
2713 intptr_t pushed_argc,
2714 const Array& argument_names)
2715 : type_args_len(type_args_len),
2716 pushed_argc(pushed_argc),
2717 argument_names(argument_names) {}
2718
2719 const Array& ToArgumentsDescriptor(Zone* zone) const {
zra 2017/05/11 04:14:21 Why does this not follow the convention of returni
regis 2017/05/11 09:55:11 No particular reason :-) Changed.
2720 return Array::ZoneHandle(
2721 zone, ArgumentsDescriptor::New(
2722 type_args_len, pushed_argc - (type_args_len > 0 ? 1 : 0),
2723 argument_names));
2724 }
2725
2726 intptr_t type_args_len;
2727 intptr_t pushed_argc;
2728 const Array& argument_names;
2729 };
2730
2731
2732 template <intptr_t kInputCount>
2733 class TemplateDartCall : public TemplateDefinition<kInputCount, Throws> {
2734 public:
2735 TemplateDartCall(intptr_t deopt_id,
2736 intptr_t type_args_len,
2737 const Array& argument_names,
2738 ZoneGrowableArray<PushArgumentInstr*>* arguments,
2739 TokenPosition token_pos)
2740 : TemplateDefinition<kInputCount, Throws>(deopt_id),
2741 type_args_len_(type_args_len),
2742 argument_names_(argument_names),
2743 arguments_(arguments),
2744 token_pos_(token_pos) {
2745 ASSERT(argument_names.IsZoneHandle() || argument_names.InVMHeap());
2746 }
2747
2748 virtual intptr_t FirstParamIndex() const {
2749 return type_args_len() > 0 ? 1 : 0;
2750 }
2751 virtual intptr_t ArgumentCountWithoutTypeArgs() const {
2752 return arguments_->length() - FirstParamIndex();
2753 }
2754 // ArgumentCount() includes the type argument vector if any.
2755 virtual intptr_t ArgumentCount() const { return arguments_->length(); }
2756 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const {
2757 return (*arguments_)[index];
2758 }
2759 virtual intptr_t type_args_len() const { return type_args_len_; }
2760 virtual const Array& argument_names() const { return argument_names_; }
zra 2017/05/11 04:14:21 ditto
regis 2017/05/11 09:55:11 There is no need to unwrap and rewrap the input he
2761 virtual TokenPosition token_pos() const { return token_pos_; }
2762 virtual const Array& GetArgumentsDescriptor(Zone* zone) const {
zra 2017/05/11 04:14:21 ditto
regis 2017/05/11 09:55:11 Done.
2763 return Array::ZoneHandle(
2764 zone,
2765 ArgumentsDescriptor::New(
2766 type_args_len(), ArgumentCountWithoutTypeArgs(), argument_names()));
2767 }
2768
2769 private:
2770 intptr_t type_args_len_;
2771 const Array& argument_names_;
2772 ZoneGrowableArray<PushArgumentInstr*>* arguments_;
2773 TokenPosition token_pos_;
2774
2775 DISALLOW_COPY_AND_ASSIGN(TemplateDartCall);
2776 };
2777
2778
2779 class ClosureCallInstr : public TemplateDartCall<1> {
2712 public: 2780 public:
2713 ClosureCallInstr(Value* function, 2781 ClosureCallInstr(Value* function,
2714 ClosureCallNode* node, 2782 ClosureCallNode* node,
2715 ZoneGrowableArray<PushArgumentInstr*>* arguments) 2783 ZoneGrowableArray<PushArgumentInstr*>* arguments)
2716 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), 2784 : TemplateDartCall(Thread::Current()->GetNextDeoptId(),
2717 argument_names_(node->arguments()->names()), 2785 node->arguments()->type_args_len(),
2718 token_pos_(node->token_pos()), 2786 node->arguments()->names(),
2719 arguments_(arguments) { 2787 arguments,
2788 node->token_pos()) {
2789 ASSERT(!arguments->is_empty());
2720 SetInputAt(0, function); 2790 SetInputAt(0, function);
2721 } 2791 }
2722 2792
2723 ClosureCallInstr(Value* function, 2793 ClosureCallInstr(Value* function,
2724 ZoneGrowableArray<PushArgumentInstr*>* arguments, 2794 ZoneGrowableArray<PushArgumentInstr*>* arguments,
2795 intptr_t type_args_len,
2725 const Array& argument_names, 2796 const Array& argument_names,
2726 TokenPosition token_pos) 2797 TokenPosition token_pos)
2727 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), 2798 : TemplateDartCall(Thread::Current()->GetNextDeoptId(),
2728 argument_names_(argument_names), 2799 type_args_len,
2729 token_pos_(token_pos), 2800 argument_names,
2730 arguments_(arguments) { 2801 arguments,
2802 token_pos) {
2803 ASSERT(!arguments->is_empty());
2731 SetInputAt(0, function); 2804 SetInputAt(0, function);
2732 } 2805 }
2733 2806
2734 DECLARE_INSTRUCTION(ClosureCall) 2807 DECLARE_INSTRUCTION(ClosureCall)
2735 2808
2736 const Array& argument_names() const { return argument_names_; }
2737 virtual TokenPosition token_pos() const { return token_pos_; }
2738
2739 virtual intptr_t ArgumentCount() const { return arguments_->length(); }
2740 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const {
2741 return (*arguments_)[index];
2742 }
2743
2744 // TODO(kmillikin): implement exact call counts for closure calls. 2809 // TODO(kmillikin): implement exact call counts for closure calls.
2745 virtual intptr_t CallCount() const { return 1; } 2810 virtual intptr_t CallCount() const { return 1; }
2746 2811
2747 virtual bool ComputeCanDeoptimize() const { return true; } 2812 virtual bool ComputeCanDeoptimize() const { return true; }
2748 2813
2749 virtual EffectSet Effects() const { return EffectSet::All(); } 2814 virtual EffectSet Effects() const { return EffectSet::All(); }
2750 2815
2751 PRINT_OPERANDS_TO_SUPPORT 2816 PRINT_OPERANDS_TO_SUPPORT
2752 2817
2753 private: 2818 private:
2754 const Array& argument_names_;
2755 TokenPosition token_pos_;
2756 ZoneGrowableArray<PushArgumentInstr*>* arguments_;
2757
2758 DISALLOW_COPY_AND_ASSIGN(ClosureCallInstr); 2819 DISALLOW_COPY_AND_ASSIGN(ClosureCallInstr);
2759 }; 2820 };
2760 2821
2761 2822
2762 class InstanceCallInstr : public TemplateDefinition<0, Throws> { 2823 class InstanceCallInstr : public TemplateDartCall<0> {
2763 public: 2824 public:
2764 InstanceCallInstr(TokenPosition token_pos, 2825 InstanceCallInstr(TokenPosition token_pos,
2765 const String& function_name, 2826 const String& function_name,
2766 Token::Kind token_kind, 2827 Token::Kind token_kind,
2767 ZoneGrowableArray<PushArgumentInstr*>* arguments, 2828 ZoneGrowableArray<PushArgumentInstr*>* arguments,
2829 intptr_t type_args_len,
2768 const Array& argument_names, 2830 const Array& argument_names,
2769 intptr_t checked_argument_count, 2831 intptr_t checked_argument_count,
2770 const ZoneGrowableArray<const ICData*>& ic_data_array) 2832 const ZoneGrowableArray<const ICData*>& ic_data_array)
2771 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), 2833 : TemplateDartCall(Thread::Current()->GetNextDeoptId(),
2834 type_args_len,
2835 argument_names,
2836 arguments,
2837 token_pos),
2772 ic_data_(NULL), 2838 ic_data_(NULL),
2773 token_pos_(token_pos),
2774 function_name_(function_name), 2839 function_name_(function_name),
2775 token_kind_(token_kind), 2840 token_kind_(token_kind),
2776 arguments_(arguments),
2777 argument_names_(argument_names),
2778 checked_argument_count_(checked_argument_count), 2841 checked_argument_count_(checked_argument_count),
2779 has_unique_selector_(false) { 2842 has_unique_selector_(false) {
2780 ic_data_ = GetICData(ic_data_array); 2843 ic_data_ = GetICData(ic_data_array);
2781 ASSERT(function_name.IsNotTemporaryScopedHandle()); 2844 ASSERT(function_name.IsNotTemporaryScopedHandle());
2782 ASSERT(!arguments->is_empty()); 2845 ASSERT(!arguments->is_empty());
2783 ASSERT(argument_names.IsZoneHandle() || argument_names.InVMHeap());
2784 ASSERT(Token::IsBinaryOperator(token_kind) || 2846 ASSERT(Token::IsBinaryOperator(token_kind) ||
2785 Token::IsEqualityOperator(token_kind) || 2847 Token::IsEqualityOperator(token_kind) ||
2786 Token::IsRelationalOperator(token_kind) || 2848 Token::IsRelationalOperator(token_kind) ||
2787 Token::IsUnaryOperator(token_kind) || 2849 Token::IsUnaryOperator(token_kind) ||
2788 Token::IsIndexOperator(token_kind) || 2850 Token::IsIndexOperator(token_kind) ||
2789 Token::IsTypeTestOperator(token_kind) || 2851 Token::IsTypeTestOperator(token_kind) ||
2790 Token::IsTypeCastOperator(token_kind) || token_kind == Token::kGET || 2852 Token::IsTypeCastOperator(token_kind) || token_kind == Token::kGET ||
2791 token_kind == Token::kSET || token_kind == Token::kILLEGAL); 2853 token_kind == Token::kSET || token_kind == Token::kILLEGAL);
2792 } 2854 }
2793 2855
2794 DECLARE_INSTRUCTION(InstanceCall) 2856 DECLARE_INSTRUCTION(InstanceCall)
2795 2857
2796 const ICData* ic_data() const { return ic_data_; } 2858 const ICData* ic_data() const { return ic_data_; }
2797 bool HasICData() const { return (ic_data() != NULL) && !ic_data()->IsNull(); } 2859 bool HasICData() const { return (ic_data() != NULL) && !ic_data()->IsNull(); }
2798 2860
2799 // ICData can be replaced by optimizer. 2861 // ICData can be replaced by optimizer.
2800 void set_ic_data(const ICData* value) { ic_data_ = value; } 2862 void set_ic_data(const ICData* value) { ic_data_ = value; }
2801 2863
2802 virtual TokenPosition token_pos() const { return token_pos_; }
2803 const String& function_name() const { return function_name_; } 2864 const String& function_name() const { return function_name_; }
2804 Token::Kind token_kind() const { return token_kind_; } 2865 Token::Kind token_kind() const { return token_kind_; }
2805 virtual intptr_t ArgumentCount() const { return arguments_->length(); }
2806 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const {
2807 return (*arguments_)[index];
2808 }
2809 const Array& argument_names() const { return argument_names_; }
2810 intptr_t checked_argument_count() const { return checked_argument_count_; } 2866 intptr_t checked_argument_count() const { return checked_argument_count_; }
2811 2867
2812 bool has_unique_selector() const { return has_unique_selector_; } 2868 bool has_unique_selector() const { return has_unique_selector_; }
2813 void set_has_unique_selector(bool b) { has_unique_selector_ = b; } 2869 void set_has_unique_selector(bool b) { has_unique_selector_ = b; }
2814 2870
2815 virtual bool ComputeCanDeoptimize() const { return true; } 2871 virtual bool ComputeCanDeoptimize() const { return true; }
2816 2872
2817 virtual Definition* Canonicalize(FlowGraph* flow_graph); 2873 virtual Definition* Canonicalize(FlowGraph* flow_graph);
2818 2874
2819 virtual bool CanBecomeDeoptimizationTarget() const { 2875 virtual bool CanBecomeDeoptimizationTarget() const {
2820 // Instance calls that are specialized by the optimizer need a 2876 // Instance calls that are specialized by the optimizer need a
2821 // deoptimization descriptor before the call. 2877 // deoptimization descriptor before the call.
2822 return true; 2878 return true;
2823 } 2879 }
2824 2880
2825 virtual EffectSet Effects() const { return EffectSet::All(); } 2881 virtual EffectSet Effects() const { return EffectSet::All(); }
2826 2882
2827 PRINT_OPERANDS_TO_SUPPORT 2883 PRINT_OPERANDS_TO_SUPPORT
2828 2884
2829 bool MatchesCoreName(const String& name); 2885 bool MatchesCoreName(const String& name);
2830 2886
2831 protected: 2887 protected:
2832 friend class JitOptimizer; 2888 friend class JitOptimizer;
2833 void set_ic_data(ICData* value) { ic_data_ = value; } 2889 void set_ic_data(ICData* value) { ic_data_ = value; }
2834 2890
2835 private: 2891 private:
2836 const ICData* ic_data_; 2892 const ICData* ic_data_;
2837 const TokenPosition token_pos_;
2838 const String& function_name_; 2893 const String& function_name_;
2839 const Token::Kind token_kind_; // Binary op, unary op, kGET or kILLEGAL. 2894 const Token::Kind token_kind_; // Binary op, unary op, kGET or kILLEGAL.
2840 ZoneGrowableArray<PushArgumentInstr*>* const arguments_;
2841 const Array& argument_names_;
2842 const intptr_t checked_argument_count_; 2895 const intptr_t checked_argument_count_;
2843 bool has_unique_selector_; 2896 bool has_unique_selector_;
2844 2897
2845 DISALLOW_COPY_AND_ASSIGN(InstanceCallInstr); 2898 DISALLOW_COPY_AND_ASSIGN(InstanceCallInstr);
2846 }; 2899 };
2847 2900
2848 2901
2849 class PolymorphicInstanceCallInstr : public TemplateDefinition<0, Throws> { 2902 class PolymorphicInstanceCallInstr : public TemplateDefinition<0, Throws> {
2850 public: 2903 public:
2851 PolymorphicInstanceCallInstr(InstanceCallInstr* instance_call, 2904 PolymorphicInstanceCallInstr(InstanceCallInstr* instance_call,
(...skipping 30 matching lines...) Expand all
2882 bool HasOnlyDispatcherOrImplicitAccessorTargets() const; 2935 bool HasOnlyDispatcherOrImplicitAccessorTargets() const;
2883 2936
2884 const CallTargets& targets() const { return targets_; } 2937 const CallTargets& targets() const { return targets_; }
2885 intptr_t NumberOfChecks() const { return targets_.length(); } 2938 intptr_t NumberOfChecks() const { return targets_.length(); }
2886 2939
2887 bool IsSureToCallSingleRecognizedTarget() const; 2940 bool IsSureToCallSingleRecognizedTarget() const;
2888 2941
2889 virtual intptr_t CallCount() const; 2942 virtual intptr_t CallCount() const;
2890 2943
2891 // If this polymophic call site was created to cover the remaining cids after 2944 // If this polymophic call site was created to cover the remaining cids after
2892 // inlinng then we need to keep track of the total number of calls including 2945 // inlining then we need to keep track of the total number of calls including
2893 // the ones that wer inlined. This is different from the CallCount above: Eg 2946 // the ones that we inlined. This is different from the CallCount above: Eg
2894 // if there were 100 calls originally, distributed across three class-ids in 2947 // if there were 100 calls originally, distributed across three class-ids in
2895 // the ratio 50, 40, 7, 3. The first two were inlined, so now we have only 2948 // the ratio 50, 40, 7, 3. The first two were inlined, so now we have only
2896 // 10 calls in the CallCount above, but the heuristics need to know that the 2949 // 10 calls in the CallCount above, but the heuristics need to know that the
2897 // last two cids cover 7% and 3% of the calls, not 70% and 30%. 2950 // last two cids cover 7% and 3% of the calls, not 70% and 30%.
2898 intptr_t total_call_count() { return total_call_count_; } 2951 intptr_t total_call_count() { return total_call_count_; }
2899 2952
2900 void set_total_call_count(intptr_t count) { total_call_count_ = count; } 2953 void set_total_call_count(intptr_t count) { total_call_count_ = count; }
2901 2954
2902 DECLARE_INSTRUCTION(PolymorphicInstanceCall) 2955 DECLARE_INSTRUCTION(PolymorphicInstanceCall)
2903 2956
2904 virtual bool ComputeCanDeoptimize() const { return true; } 2957 virtual bool ComputeCanDeoptimize() const { return true; }
(...skipping 306 matching lines...) Expand 10 before | Expand all | Expand 10 after
3211 } 3264 }
3212 3265
3213 ComparisonInstr* comparison_; 3266 ComparisonInstr* comparison_;
3214 const intptr_t if_true_; 3267 const intptr_t if_true_;
3215 const intptr_t if_false_; 3268 const intptr_t if_false_;
3216 3269
3217 DISALLOW_COPY_AND_ASSIGN(IfThenElseInstr); 3270 DISALLOW_COPY_AND_ASSIGN(IfThenElseInstr);
3218 }; 3271 };
3219 3272
3220 3273
3221 class StaticCallInstr : public TemplateDefinition<0, Throws> { 3274 class StaticCallInstr : public TemplateDartCall<0> {
3222 public: 3275 public:
3223 StaticCallInstr(TokenPosition token_pos, 3276 StaticCallInstr(TokenPosition token_pos,
3224 const Function& function, 3277 const Function& function,
3278 intptr_t type_args_len,
3225 const Array& argument_names, 3279 const Array& argument_names,
3226 ZoneGrowableArray<PushArgumentInstr*>* arguments, 3280 ZoneGrowableArray<PushArgumentInstr*>* arguments,
3227 const ZoneGrowableArray<const ICData*>& ic_data_array) 3281 const ZoneGrowableArray<const ICData*>& ic_data_array)
3228 : TemplateDefinition(Thread::Current()->GetNextDeoptId()), 3282 : TemplateDartCall(Thread::Current()->GetNextDeoptId(),
3283 type_args_len,
3284 argument_names,
3285 arguments,
3286 token_pos),
3229 ic_data_(NULL), 3287 ic_data_(NULL),
3230 token_pos_(token_pos),
3231 function_(function), 3288 function_(function),
3232 argument_names_(argument_names),
3233 arguments_(arguments),
3234 result_cid_(kDynamicCid), 3289 result_cid_(kDynamicCid),
3235 is_known_list_constructor_(false), 3290 is_known_list_constructor_(false),
3236 identity_(AliasIdentity::Unknown()) { 3291 identity_(AliasIdentity::Unknown()) {
3237 ic_data_ = GetICData(ic_data_array); 3292 ic_data_ = GetICData(ic_data_array);
3238 ASSERT(function.IsZoneHandle()); 3293 ASSERT(function.IsZoneHandle());
3239 ASSERT(!function.IsNull()); 3294 ASSERT(!function.IsNull());
3240 ASSERT(argument_names.IsZoneHandle() || argument_names.InVMHeap());
3241 } 3295 }
3242 3296
3243 StaticCallInstr(TokenPosition token_pos, 3297 StaticCallInstr(TokenPosition token_pos,
3244 const Function& function, 3298 const Function& function,
3299 intptr_t type_args_len,
3245 const Array& argument_names, 3300 const Array& argument_names,
3246 ZoneGrowableArray<PushArgumentInstr*>* arguments, 3301 ZoneGrowableArray<PushArgumentInstr*>* arguments,
3247 intptr_t deopt_id) 3302 intptr_t deopt_id)
3248 : TemplateDefinition(deopt_id), 3303 : TemplateDartCall(deopt_id,
3304 type_args_len,
3305 argument_names,
3306 arguments,
3307 token_pos),
3249 ic_data_(NULL), 3308 ic_data_(NULL),
3250 token_pos_(token_pos),
3251 function_(function), 3309 function_(function),
3252 argument_names_(argument_names),
3253 arguments_(arguments),
3254 result_cid_(kDynamicCid), 3310 result_cid_(kDynamicCid),
3255 is_known_list_constructor_(false), 3311 is_known_list_constructor_(false),
3256 identity_(AliasIdentity::Unknown()) { 3312 identity_(AliasIdentity::Unknown()) {
3257 ASSERT(function.IsZoneHandle()); 3313 ASSERT(function.IsZoneHandle());
3258 ASSERT(!function.IsNull()); 3314 ASSERT(!function.IsNull());
3259 ASSERT(argument_names.IsZoneHandle() || argument_names.InVMHeap());
3260 } 3315 }
3261 3316
3262 // ICData for static calls carries call count. 3317 // ICData for static calls carries call count.
3263 const ICData* ic_data() const { return ic_data_; } 3318 const ICData* ic_data() const { return ic_data_; }
3264 bool HasICData() const { return (ic_data() != NULL) && !ic_data()->IsNull(); } 3319 bool HasICData() const { return (ic_data() != NULL) && !ic_data()->IsNull(); }
3265 3320
3266 void set_ic_data(const ICData* value) { ic_data_ = value; } 3321 void set_ic_data(const ICData* value) { ic_data_ = value; }
3267 3322
3268 DECLARE_INSTRUCTION(StaticCall) 3323 DECLARE_INSTRUCTION(StaticCall)
3269 virtual CompileType ComputeType() const; 3324 virtual CompileType ComputeType() const;
3270 virtual Definition* Canonicalize(FlowGraph* flow_graph); 3325 virtual Definition* Canonicalize(FlowGraph* flow_graph);
3271 3326
3272 // Accessors forwarded to the AST node. 3327 // Accessors forwarded to the AST node.
3273 const Function& function() const { return function_; } 3328 const Function& function() const { return function_; }
3274 const Array& argument_names() const { return argument_names_; }
3275 virtual TokenPosition token_pos() const { return token_pos_; }
3276
3277 virtual intptr_t ArgumentCount() const { return arguments_->length(); }
3278 virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const {
3279 return (*arguments_)[index];
3280 }
3281 3329
3282 virtual intptr_t CallCount() const { 3330 virtual intptr_t CallCount() const {
3283 return ic_data() == NULL ? 0 : ic_data()->AggregateCount(); 3331 return ic_data() == NULL ? 0 : ic_data()->AggregateCount();
3284 } 3332 }
3285 3333
3286 virtual bool ComputeCanDeoptimize() const { return true; } 3334 virtual bool ComputeCanDeoptimize() const { return true; }
3287 3335
3288 virtual bool CanBecomeDeoptimizationTarget() const { 3336 virtual bool CanBecomeDeoptimizationTarget() const {
3289 // Static calls that are specialized by the optimizer (e.g. sqrt) need a 3337 // Static calls that are specialized by the optimizer (e.g. sqrt) need a
3290 // deoptimization descriptor before the call. 3338 // deoptimization descriptor before the call.
(...skipping 11 matching lines...) Expand all
3302 3350
3303 bool IsRecognizedFactory() const { return is_known_list_constructor(); } 3351 bool IsRecognizedFactory() const { return is_known_list_constructor(); }
3304 3352
3305 virtual AliasIdentity Identity() const { return identity_; } 3353 virtual AliasIdentity Identity() const { return identity_; }
3306 virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; } 3354 virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
3307 3355
3308 PRINT_OPERANDS_TO_SUPPORT 3356 PRINT_OPERANDS_TO_SUPPORT
3309 3357
3310 private: 3358 private:
3311 const ICData* ic_data_; 3359 const ICData* ic_data_;
3312 const TokenPosition token_pos_;
3313 const Function& function_; 3360 const Function& function_;
3314 const Array& argument_names_;
3315 ZoneGrowableArray<PushArgumentInstr*>* arguments_;
3316 intptr_t result_cid_; // For some library functions we know the result. 3361 intptr_t result_cid_; // For some library functions we know the result.
3317 3362
3318 // 'True' for recognized list constructors. 3363 // 'True' for recognized list constructors.
3319 bool is_known_list_constructor_; 3364 bool is_known_list_constructor_;
3320 3365
3321 AliasIdentity identity_; 3366 AliasIdentity identity_;
3322 3367
3323 DISALLOW_COPY_AND_ASSIGN(StaticCallInstr); 3368 DISALLOW_COPY_AND_ASSIGN(StaticCallInstr);
3324 }; 3369 };
3325 3370
(...skipping 3402 matching lines...) Expand 10 before | Expand all | Expand 10 after
6728 }; 6773 };
6729 6774
6730 6775
6731 class CheckedSmiOpInstr : public TemplateDefinition<2, Throws> { 6776 class CheckedSmiOpInstr : public TemplateDefinition<2, Throws> {
6732 public: 6777 public:
6733 CheckedSmiOpInstr(Token::Kind op_kind, 6778 CheckedSmiOpInstr(Token::Kind op_kind,
6734 Value* left, 6779 Value* left,
6735 Value* right, 6780 Value* right,
6736 InstanceCallInstr* call) 6781 InstanceCallInstr* call)
6737 : TemplateDefinition(call->deopt_id()), call_(call), op_kind_(op_kind) { 6782 : TemplateDefinition(call->deopt_id()), call_(call), op_kind_(op_kind) {
6783 ASSERT(call->type_args_len() == 0);
6738 SetInputAt(0, left); 6784 SetInputAt(0, left);
6739 SetInputAt(1, right); 6785 SetInputAt(1, right);
6740 } 6786 }
6741 6787
6742 InstanceCallInstr* call() const { return call_; } 6788 InstanceCallInstr* call() const { return call_; }
6743 Token::Kind op_kind() const { return op_kind_; } 6789 Token::Kind op_kind() const { return op_kind_; }
6744 Value* left() const { return inputs_[0]; } 6790 Value* left() const { return inputs_[0]; }
6745 Value* right() const { return inputs_[1]; } 6791 Value* right() const { return inputs_[1]; }
6746 6792
6747 virtual bool ComputeCanDeoptimize() const { return false; } 6793 virtual bool ComputeCanDeoptimize() const { return false; }
(...skipping 15 matching lines...) Expand all
6763 6809
6764 class CheckedSmiComparisonInstr : public TemplateComparison<2, Throws> { 6810 class CheckedSmiComparisonInstr : public TemplateComparison<2, Throws> {
6765 public: 6811 public:
6766 CheckedSmiComparisonInstr(Token::Kind op_kind, 6812 CheckedSmiComparisonInstr(Token::Kind op_kind,
6767 Value* left, 6813 Value* left,
6768 Value* right, 6814 Value* right,
6769 InstanceCallInstr* call) 6815 InstanceCallInstr* call)
6770 : TemplateComparison(call->token_pos(), op_kind, call->deopt_id()), 6816 : TemplateComparison(call->token_pos(), op_kind, call->deopt_id()),
6771 call_(call), 6817 call_(call),
6772 is_negated_(false) { 6818 is_negated_(false) {
6819 ASSERT(call->type_args_len() == 0);
6773 SetInputAt(0, left); 6820 SetInputAt(0, left);
6774 SetInputAt(1, right); 6821 SetInputAt(1, right);
6775 } 6822 }
6776 6823
6777 InstanceCallInstr* call() const { return call_; } 6824 InstanceCallInstr* call() const { return call_; }
6778 6825
6779 virtual bool ComputeCanDeoptimize() const { return false; } 6826 virtual bool ComputeCanDeoptimize() const { return false; }
6780 6827
6781 virtual Definition* Canonicalize(FlowGraph* flow_graph); 6828 virtual Definition* Canonicalize(FlowGraph* flow_graph);
6782 6829
(...skipping 1331 matching lines...) Expand 10 before | Expand all | Expand 10 after
8114 LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const { \ 8161 LocationSummary* Name::MakeLocationSummary(Zone* zone, bool opt) const { \
8115 UNIMPLEMENTED(); \ 8162 UNIMPLEMENTED(); \
8116 return NULL; \ 8163 return NULL; \
8117 } \ 8164 } \
8118 void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); } 8165 void Name::EmitNativeCode(FlowGraphCompiler* compiler) { UNIMPLEMENTED(); }
8119 8166
8120 8167
8121 } // namespace dart 8168 } // namespace dart
8122 8169
8123 #endif // RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_ 8170 #endif // RUNTIME_VM_INTERMEDIATE_LANGUAGE_H_
OLDNEW
« no previous file with comments | « runtime/vm/flow_graph_inliner.cc ('k') | runtime/vm/intermediate_language.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698