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

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

Issue 2737303003: Allow dispatch to use a range of Class-ids in tests (Closed)
Patch Set: Created 3 years, 9 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
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 RUNTIME_VM_FLOW_GRAPH_COMPILER_H_ 5 #ifndef RUNTIME_VM_FLOW_GRAPH_COMPILER_H_
6 #define RUNTIME_VM_FLOW_GRAPH_COMPILER_H_ 6 #define RUNTIME_VM_FLOW_GRAPH_COMPILER_H_
7 7
8 #include "vm/allocation.h" 8 #include "vm/allocation.h"
9 #include "vm/assembler.h" 9 #include "vm/assembler.h"
10 #include "vm/code_descriptors.h" 10 #include "vm/code_descriptors.h"
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
225 private: 225 private:
226 virtual void EmitNativeCode(FlowGraphCompiler* compiler) = 0; 226 virtual void EmitNativeCode(FlowGraphCompiler* compiler) = 0;
227 227
228 Label entry_label_; 228 Label entry_label_;
229 Label exit_label_; 229 Label exit_label_;
230 230
231 DISALLOW_COPY_AND_ASSIGN(SlowPathCode); 231 DISALLOW_COPY_AND_ASSIGN(SlowPathCode);
232 }; 232 };
233 233
234 234
235 struct CidTarget { 235 struct CidRangeTarget {
236 intptr_t cid; 236 intptr_t cid_start;
237 intptr_t cid_end;
237 Function* target; 238 Function* target;
238 intptr_t count; 239 intptr_t count;
239 CidTarget(intptr_t cid_arg, Function* target_arg, intptr_t count_arg) 240 CidRangeTarget(intptr_t cid_start_arg,
240 : cid(cid_arg), target(target_arg), count(count_arg) {} 241 intptr_t cid_end_arg,
242 Function* target_arg,
243 intptr_t count_arg)
244 : cid_start(cid_start_arg),
245 cid_end(cid_end_arg),
246 target(target_arg),
247 count(count_arg) {}
241 }; 248 };
242 249
243 250
244 class FlowGraphCompiler : public ValueObject { 251 class FlowGraphCompiler : public ValueObject {
245 private: 252 private:
246 class BlockInfo : public ZoneAllocated { 253 class BlockInfo : public ZoneAllocated {
247 public: 254 public:
248 BlockInfo() 255 BlockInfo()
249 : block_label_(), 256 : block_label_(),
250 jump_label_(&block_label_), 257 jump_label_(&block_label_),
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 intptr_t deopt_id, 427 intptr_t deopt_id,
421 TokenPosition token_pos, 428 TokenPosition token_pos,
422 LocationSummary* locs); 429 LocationSummary* locs);
423 430
424 void EmitPolymorphicInstanceCall(const ICData& ic_data, 431 void EmitPolymorphicInstanceCall(const ICData& ic_data,
425 intptr_t argument_count, 432 intptr_t argument_count,
426 const Array& argument_names, 433 const Array& argument_names,
427 intptr_t deopt_id, 434 intptr_t deopt_id,
428 TokenPosition token_pos, 435 TokenPosition token_pos,
429 LocationSummary* locs, 436 LocationSummary* locs,
430 bool complete); 437 bool complete,
438 intptr_t total_ic_count);
431 439
432 // Pass a value for try-index where block is not available (e.g. slow path). 440 // Pass a value for try-index where block is not available (e.g. slow path).
433 void EmitMegamorphicInstanceCall(const ICData& ic_data, 441 void EmitMegamorphicInstanceCall(const ICData& ic_data,
434 intptr_t argument_count, 442 intptr_t argument_count,
435 intptr_t deopt_id, 443 intptr_t deopt_id,
436 TokenPosition token_pos, 444 TokenPosition token_pos,
437 LocationSummary* locs, 445 LocationSummary* locs,
438 intptr_t try_index, 446 intptr_t try_index,
439 intptr_t slow_path_argument_count = 0); 447 intptr_t slow_path_argument_count = 0);
440 448
441 void EmitSwitchableInstanceCall(const ICData& ic_data, 449 void EmitSwitchableInstanceCall(const ICData& ic_data,
442 intptr_t argument_count, 450 intptr_t argument_count,
443 intptr_t deopt_id, 451 intptr_t deopt_id,
444 TokenPosition token_pos, 452 TokenPosition token_pos,
445 LocationSummary* locs); 453 LocationSummary* locs);
446 454
447 void EmitTestAndCall(const ICData& ic_data, 455 void EmitTestAndCall(const ICData& ic_data,
448 intptr_t arg_count, 456 intptr_t arg_count,
449 const Array& arg_names, 457 const Array& arg_names,
450 Label* failed, 458 Label* failed,
451 Label* match_found, 459 Label* match_found,
452 intptr_t deopt_id, 460 intptr_t deopt_id,
453 TokenPosition token_index, 461 TokenPosition token_index,
454 LocationSummary* locs, 462 LocationSummary* locs,
455 bool complete); 463 bool complete,
464 intptr_t total_ic_calls);
456 465
457 Condition EmitEqualityRegConstCompare(Register reg, 466 Condition EmitEqualityRegConstCompare(Register reg,
458 const Object& obj, 467 const Object& obj,
459 bool needs_number_check, 468 bool needs_number_check,
460 TokenPosition token_pos); 469 TokenPosition token_pos);
461 Condition EmitEqualityRegRegCompare(Register left, 470 Condition EmitEqualityRegRegCompare(Register left,
462 Register right, 471 Register right,
463 bool needs_number_check, 472 bool needs_number_check,
464 TokenPosition token_pos); 473 TokenPosition token_pos);
465 474
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
553 if (current_block_ == NULL) { 562 if (current_block_ == NULL) {
554 return CatchClauseNode::kInvalidTryIndex; 563 return CatchClauseNode::kInvalidTryIndex;
555 } 564 }
556 return current_block_->try_index(); 565 return current_block_->try_index();
557 } 566 }
558 567
559 bool may_reoptimize() const { return may_reoptimize_; } 568 bool may_reoptimize() const { return may_reoptimize_; }
560 569
561 // Returns 'sorted' array in decreasing count order. 570 // Returns 'sorted' array in decreasing count order.
562 static void SortICDataByCount(const ICData& ic_data, 571 static void SortICDataByCount(const ICData& ic_data,
563 GrowableArray<CidTarget>* sorted, 572 GrowableArray<CidRangeTarget>* sorted,
564 bool drop_smi); 573 bool drop_smi);
565 574
566 // Use in unoptimized compilation to preserve/reuse ICData. 575 // Use in unoptimized compilation to preserve/reuse ICData.
567 const ICData* GetOrAddInstanceCallICData(intptr_t deopt_id, 576 const ICData* GetOrAddInstanceCallICData(intptr_t deopt_id,
568 const String& target_name, 577 const String& target_name,
569 const Array& arguments_descriptor, 578 const Array& arguments_descriptor,
570 intptr_t num_args_tested); 579 intptr_t num_args_tested);
571 580
572 const ICData* GetOrAddStaticCallICData(intptr_t deopt_id, 581 const ICData* GetOrAddStaticCallICData(intptr_t deopt_id,
573 const Function& target, 582 const Function& target,
(...skipping 29 matching lines...) Expand all
603 intptr_t deopt_id, 612 intptr_t deopt_id,
604 intptr_t argument_count, 613 intptr_t argument_count,
605 CallResult result, 614 CallResult result,
606 LocationSummary* locs); 615 LocationSummary* locs);
607 void RecordAfterCall(Instruction* instr, CallResult result); 616 void RecordAfterCall(Instruction* instr, CallResult result);
608 #endif 617 #endif
609 618
610 private: 619 private:
611 friend class CheckStackOverflowSlowPath; // For pending_deoptimization_env_. 620 friend class CheckStackOverflowSlowPath; // For pending_deoptimization_env_.
612 621
613 static bool ShouldInlineSmiStringHashCode(const ICData& ic_data);
614
615 void EmitFrameEntry(); 622 void EmitFrameEntry();
616 623
617 void AddStaticCallTarget(const Function& function); 624 void AddStaticCallTarget(const Function& function);
618 625
619 void GenerateDeferredCode(); 626 void GenerateDeferredCode();
620 627
621 void EmitInstructionPrologue(Instruction* instr); 628 void EmitInstructionPrologue(Instruction* instr);
622 void EmitInstructionEpilogue(Instruction* instr); 629 void EmitInstructionEpilogue(Instruction* instr);
623 630
624 // Emit code to load a Value into register 'dst'. 631 // Emit code to load a Value into register 'dst'.
625 void LoadValue(Register dst, Value* value); 632 void LoadValue(Register dst, Value* value);
626 633
627 void EmitOptimizedStaticCall(const Function& function, 634 void EmitOptimizedStaticCall(const Function& function,
628 const Array& arguments_descriptor, 635 const Array& arguments_descriptor,
629 intptr_t argument_count, 636 intptr_t argument_count,
630 intptr_t deopt_id, 637 intptr_t deopt_id,
631 TokenPosition token_pos, 638 TokenPosition token_pos,
632 LocationSummary* locs); 639 LocationSummary* locs);
633 640
634 void EmitUnoptimizedStaticCall(intptr_t argument_count, 641 void EmitUnoptimizedStaticCall(intptr_t argument_count,
635 intptr_t deopt_id, 642 intptr_t deopt_id,
636 TokenPosition token_pos, 643 TokenPosition token_pos,
637 LocationSummary* locs, 644 LocationSummary* locs,
638 const ICData& ic_data); 645 const ICData& ic_data);
639 646
647 // Helper for TestAndCall that calculates a good bias that
648 // allows more compact instructions to be emitted.
649 intptr_t GetGoodBias(const GrowableArray<CidRangeTarget>& sorted,
Vyacheslav Egorov (Google) 2017/03/10 10:31:30 ComputeGoodBiasForCidComparison(...)?
erikcorry 2017/03/10 13:30:01 Done.
650 intptr_t max_immediate);
651
640 // DBC handles type tests differently from all other architectures due 652 // DBC handles type tests differently from all other architectures due
641 // to its interpreted nature. 653 // to its interpreted nature.
642 #if !defined(TARGET_ARCH_DBC) 654 #if !defined(TARGET_ARCH_DBC)
643 // Type checking helper methods. 655 // Type checking helper methods.
644 void CheckClassIds(Register class_id_reg, 656 void CheckClassIds(Register class_id_reg,
645 const GrowableArray<intptr_t>& class_ids, 657 const GrowableArray<intptr_t>& class_ids,
646 Label* is_instance_lbl, 658 Label* is_instance_lbl,
647 Label* is_not_instance_lbl); 659 Label* is_not_instance_lbl);
648 660
649 RawSubtypeTestCache* GenerateInlineInstanceof(TokenPosition token_pos, 661 RawSubtypeTestCache* GenerateInlineInstanceof(TokenPosition token_pos,
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
803 ZoneGrowableArray<const ICData*>* deopt_id_to_ic_data_; 815 ZoneGrowableArray<const ICData*>* deopt_id_to_ic_data_;
804 816
805 Array& edge_counters_array_; 817 Array& edge_counters_array_;
806 818
807 DISALLOW_COPY_AND_ASSIGN(FlowGraphCompiler); 819 DISALLOW_COPY_AND_ASSIGN(FlowGraphCompiler);
808 }; 820 };
809 821
810 } // namespace dart 822 } // namespace dart
811 823
812 #endif // RUNTIME_VM_FLOW_GRAPH_COMPILER_H_ 824 #endif // RUNTIME_VM_FLOW_GRAPH_COMPILER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698