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

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

Issue 12871010: Replace scalarlist optimizations and split external array loads into two IL instructions. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: fixed math library, passes all tests Created 7 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 | Annotate | Revision Log
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_FLOW_GRAPH_ALLOCATOR_H_ 5 #ifndef VM_FLOW_GRAPH_ALLOCATOR_H_
6 #define VM_FLOW_GRAPH_ALLOCATOR_H_ 6 #define VM_FLOW_GRAPH_ALLOCATOR_H_
7 7
8 #include "vm/growable_array.h" 8 #include "vm/growable_array.h"
9 #include "vm/intermediate_language.h" 9 #include "vm/intermediate_language.h"
10 10
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after
220 // Spill the given live range from the given position until some 220 // Spill the given live range from the given position until some
221 // position preceding the to position. 221 // position preceding the to position.
222 void SpillBetween(LiveRange* range, intptr_t from, intptr_t to); 222 void SpillBetween(LiveRange* range, intptr_t from, intptr_t to);
223 223
224 // Mark the live range as a live object pointer at all safepoints 224 // Mark the live range as a live object pointer at all safepoints
225 // contained in the range. 225 // contained in the range.
226 void MarkAsObjectAtSafepoints(LiveRange* range); 226 void MarkAsObjectAtSafepoints(LiveRange* range);
227 227
228 MoveOperands* AddMoveAt(intptr_t pos, Location to, Location from); 228 MoveOperands* AddMoveAt(intptr_t pos, Location to, Location from);
229 229
230 Location MakeRegisterLocation(intptr_t reg, Location::Representation rep) { 230 Location MakeRegisterLocation(intptr_t reg, Representation rep) {
231 return Location::MachineRegisterLocation(register_kind_, reg, rep); 231 return Location::MachineRegisterLocation(register_kind_, reg, rep);
232 } 232 }
233 233
234 void PrintLiveRanges(); 234 void PrintLiveRanges();
235 235
236 const FlowGraph& flow_graph_; 236 const FlowGraph& flow_graph_;
237 237
238 ReachingDefs reaching_defs_; 238 ReachingDefs reaching_defs_;
239 239
240 // Set of SSA values that have unboxed mint representation. Indexed 240 // Set of SSA values that have unboxed mint representation. Indexed
241 // by SSA temp index. 241 // by SSA temp index.
242 BitVector* mint_values_; 242 GrowableArray<Representation> value_representations_;
Vyacheslav Egorov (Google) 2013/03/18 18:42:29 Comment above requires update.
Florian Schneider 2013/03/19 11:48:57 Done.
243 243
244 const GrowableArray<BlockEntryInstr*>& block_order_; 244 const GrowableArray<BlockEntryInstr*>& block_order_;
245 const GrowableArray<BlockEntryInstr*>& postorder_; 245 const GrowableArray<BlockEntryInstr*>& postorder_;
246 246
247 // Mapping between lifetime positions and instructions. 247 // Mapping between lifetime positions and instructions.
248 GrowableArray<Instruction*> instructions_; 248 GrowableArray<Instruction*> instructions_;
249 249
250 // Mapping between lifetime positions and blocks containing them. 250 // Mapping between lifetime positions and blocks containing them.
251 GrowableArray<BlockInfo*> block_info_; 251 GrowableArray<BlockInfo*> block_info_;
252 252
(...skipping 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
520 const intptr_t pos_; 520 const intptr_t pos_;
521 LocationSummary* const locs_; 521 LocationSummary* const locs_;
522 522
523 SafepointPosition* next_; 523 SafepointPosition* next_;
524 }; 524 };
525 525
526 526
527 // LiveRange represents a sequence of UseIntervals for a given SSA value. 527 // LiveRange represents a sequence of UseIntervals for a given SSA value.
528 class LiveRange : public ZoneAllocated { 528 class LiveRange : public ZoneAllocated {
529 public: 529 public:
530 explicit LiveRange(intptr_t vreg, Location::Representation rep) 530 explicit LiveRange(intptr_t vreg, Representation rep)
531 : vreg_(vreg), 531 : vreg_(vreg),
532 representation_(rep), 532 representation_(rep),
533 assigned_location_(), 533 assigned_location_(),
534 spill_slot_(), 534 spill_slot_(),
535 uses_(NULL), 535 uses_(NULL),
536 first_use_interval_(NULL), 536 first_use_interval_(NULL),
537 last_use_interval_(NULL), 537 last_use_interval_(NULL),
538 first_safepoint_(NULL), 538 first_safepoint_(NULL),
539 last_safepoint_(NULL), 539 last_safepoint_(NULL),
540 next_sibling_(NULL), 540 next_sibling_(NULL),
541 has_only_any_uses_in_loops_(0), 541 has_only_any_uses_in_loops_(0),
542 is_loop_phi_(false), 542 is_loop_phi_(false),
543 finger_() { 543 finger_() {
544 } 544 }
545 545
546 static LiveRange* MakeTemp(intptr_t pos, Location* location_slot); 546 static LiveRange* MakeTemp(intptr_t pos, Location* location_slot);
547 547
548 intptr_t vreg() const { return vreg_; } 548 intptr_t vreg() const { return vreg_; }
549 Location::Representation representation() const { return representation_; } 549 Representation representation() const { return representation_; }
550 LiveRange* next_sibling() const { return next_sibling_; } 550 LiveRange* next_sibling() const { return next_sibling_; }
551 UsePosition* first_use() const { return uses_; } 551 UsePosition* first_use() const { return uses_; }
552 void set_first_use(UsePosition* use) { uses_ = use; } 552 void set_first_use(UsePosition* use) { uses_ = use; }
553 UseInterval* first_use_interval() const { return first_use_interval_; } 553 UseInterval* first_use_interval() const { return first_use_interval_; }
554 UseInterval* last_use_interval() const { return last_use_interval_; } 554 UseInterval* last_use_interval() const { return last_use_interval_; }
555 Location assigned_location() const { return assigned_location_; } 555 Location assigned_location() const { return assigned_location_; }
556 intptr_t Start() const { return first_use_interval()->start(); } 556 intptr_t Start() const { return first_use_interval()->start(); }
557 intptr_t End() const { return last_use_interval()->end(); } 557 intptr_t End() const { return last_use_interval()->end(); }
558 558
559 SafepointPosition* first_safepoint() const { return first_safepoint_; } 559 SafepointPosition* first_safepoint() const { return first_safepoint_; }
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
611 } 611 }
612 } 612 }
613 613
614 bool is_loop_phi() const { return is_loop_phi_; } 614 bool is_loop_phi() const { return is_loop_phi_; }
615 void mark_loop_phi() { 615 void mark_loop_phi() {
616 is_loop_phi_ = true; 616 is_loop_phi_ = true;
617 } 617 }
618 618
619 private: 619 private:
620 LiveRange(intptr_t vreg, 620 LiveRange(intptr_t vreg,
621 Location::Representation rep, 621 Representation rep,
622 UsePosition* uses, 622 UsePosition* uses,
623 UseInterval* first_use_interval, 623 UseInterval* first_use_interval,
624 UseInterval* last_use_interval, 624 UseInterval* last_use_interval,
625 SafepointPosition* first_safepoint, 625 SafepointPosition* first_safepoint,
626 LiveRange* next_sibling) 626 LiveRange* next_sibling)
627 : vreg_(vreg), 627 : vreg_(vreg),
628 representation_(rep), 628 representation_(rep),
629 assigned_location_(), 629 assigned_location_(),
630 uses_(uses), 630 uses_(uses),
631 first_use_interval_(first_use_interval), 631 first_use_interval_(first_use_interval),
632 last_use_interval_(last_use_interval), 632 last_use_interval_(last_use_interval),
633 first_safepoint_(first_safepoint), 633 first_safepoint_(first_safepoint),
634 last_safepoint_(NULL), 634 last_safepoint_(NULL),
635 next_sibling_(next_sibling), 635 next_sibling_(next_sibling),
636 has_only_any_uses_in_loops_(0), 636 has_only_any_uses_in_loops_(0),
637 is_loop_phi_(false), 637 is_loop_phi_(false),
638 finger_() { 638 finger_() {
639 } 639 }
640 640
641 const intptr_t vreg_; 641 const intptr_t vreg_;
642 Location::Representation representation_; 642 Representation representation_;
643 Location assigned_location_; 643 Location assigned_location_;
644 Location spill_slot_; 644 Location spill_slot_;
645 645
646 UsePosition* uses_; 646 UsePosition* uses_;
647 UseInterval* first_use_interval_; 647 UseInterval* first_use_interval_;
648 UseInterval* last_use_interval_; 648 UseInterval* last_use_interval_;
649 649
650 SafepointPosition* first_safepoint_; 650 SafepointPosition* first_safepoint_;
651 SafepointPosition* last_safepoint_; 651 SafepointPosition* last_safepoint_;
652 652
653 LiveRange* next_sibling_; 653 LiveRange* next_sibling_;
654 654
655 intptr_t has_only_any_uses_in_loops_; 655 intptr_t has_only_any_uses_in_loops_;
656 bool is_loop_phi_; 656 bool is_loop_phi_;
657 657
658 AllocationFinger finger_; 658 AllocationFinger finger_;
659 659
660 DISALLOW_COPY_AND_ASSIGN(LiveRange); 660 DISALLOW_COPY_AND_ASSIGN(LiveRange);
661 }; 661 };
662 662
663 663
664 } // namespace dart 664 } // namespace dart
665 665
666 #endif // VM_FLOW_GRAPH_ALLOCATOR_H_ 666 #endif // VM_FLOW_GRAPH_ALLOCATOR_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698