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

Side by Side Diff: src/IceBitVector.h

Issue 1746613002: Subzero: Reduce copying of Liveness bitvectors. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Fix memory over-allocation Created 4 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
« no previous file with comments | « no previous file | src/IceCfg.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===- subzero/src/IceBitVector.h - Inline bit vector. ----------*- C++ -*-===// 1 //===- subzero/src/IceBitVector.h - Inline bit vector. ----------*- C++ -*-===//
2 // 2 //
3 // The Subzero Code Generator 3 // The Subzero Code Generator
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 /// 9 ///
10 /// \file 10 /// \file
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 BitVector(Allocator A = Allocator()) 301 BitVector(Allocator A = Allocator())
302 : Size(0), Capacity(0), Alloc(std::move(A)) { 302 : Size(0), Capacity(0), Alloc(std::move(A)) {
303 Bits = nullptr; 303 Bits = nullptr;
304 } 304 }
305 305
306 /// BitVector ctor - Creates a bitvector of specified number of bits. All 306 /// BitVector ctor - Creates a bitvector of specified number of bits. All
307 /// bits are initialized to the specified value. 307 /// bits are initialized to the specified value.
308 explicit BitVector(unsigned s, bool t = false, Allocator A = Allocator()) 308 explicit BitVector(unsigned s, bool t = false, Allocator A = Allocator())
309 : Size(s), Alloc(std::move(A)) { 309 : Size(s), Alloc(std::move(A)) {
310 Capacity = NumBitWords(s); 310 Capacity = NumBitWords(s);
311 Bits = Alloc.allocate(Capacity * sizeof(BitWord)); 311 Bits = Alloc.allocate(Capacity);
312 init_words(Bits, Capacity, t); 312 init_words(Bits, Capacity, t);
313 if (t) 313 if (t)
314 clear_unused_bits(); 314 clear_unused_bits();
315 } 315 }
316 316
317 /// BitVector copy ctor. 317 /// BitVector copy ctor.
318 BitVector(const BitVector &RHS) : Size(RHS.size()), Alloc(RHS.Alloc) { 318 BitVector(const BitVector &RHS) : Size(RHS.size()), Alloc(RHS.Alloc) {
319 if (Size == 0) { 319 if (Size == 0) {
320 Bits = nullptr; 320 Bits = nullptr;
321 Capacity = 0; 321 Capacity = 0;
322 return; 322 return;
323 } 323 }
324 324
325 Capacity = NumBitWords(RHS.size()); 325 Capacity = NumBitWords(RHS.size());
326 Bits = Alloc.allocate(Capacity * sizeof(BitWord)); 326 Bits = Alloc.allocate(Capacity);
327 std::memcpy(Bits, RHS.Bits, Capacity * sizeof(BitWord)); 327 std::memcpy(Bits, RHS.Bits, Capacity * sizeof(BitWord));
328 } 328 }
329 329
330 BitVector(BitVector &&RHS) 330 BitVector(BitVector &&RHS)
331 : Bits(RHS.Bits), Size(RHS.Size), Capacity(RHS.Capacity), 331 : Bits(RHS.Bits), Size(RHS.Size), Capacity(RHS.Capacity),
332 Alloc(std::move(RHS.Alloc)) { 332 Alloc(std::move(RHS.Alloc)) {
333 RHS.Bits = nullptr; 333 RHS.Bits = nullptr;
334 } 334 }
335 335
336 ~BitVector() { 336 ~BitVector() {
337 if (Bits != nullptr) { 337 if (Bits != nullptr) {
338 Alloc.deallocate(Bits, Capacity * sizeof(BitWord)); 338 Alloc.deallocate(Bits, Capacity);
339 } 339 }
340 } 340 }
341 341
342 /// empty - Tests whether there are no bits in this bitvector. 342 /// empty - Tests whether there are no bits in this bitvector.
343 bool empty() const { return Size == 0; } 343 bool empty() const { return Size == 0; }
344 344
345 /// size - Returns the number of bits in this bitvector. 345 /// size - Returns the number of bits in this bitvector.
346 size_type size() const { return Size; } 346 size_type size() const { return Size; }
347 347
348 /// count - Returns the number of bits which are set. 348 /// count - Returns the number of bits which are set.
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after
648 648
649 Size = RHS.size(); 649 Size = RHS.size();
650 unsigned RHSWords = NumBitWords(Size); 650 unsigned RHSWords = NumBitWords(Size);
651 if (Size <= Capacity * BITWORD_SIZE) { 651 if (Size <= Capacity * BITWORD_SIZE) {
652 if (Size) 652 if (Size)
653 std::memcpy(Bits, RHS.Bits, RHSWords * sizeof(BitWord)); 653 std::memcpy(Bits, RHS.Bits, RHSWords * sizeof(BitWord));
654 clear_unused_bits(); 654 clear_unused_bits();
655 return *this; 655 return *this;
656 } 656 }
657 657
658 // Currently, BitVector is only used by liveness analysis. With the
659 // following assert, we make sure BitVectors grow in a single step from 0 to
660 // their final capacity, rather than growing slowly and "leaking" memory in
661 // the process.
662 assert(Capacity == 0);
663
658 // Grow the bitvector to have enough elements. 664 // Grow the bitvector to have enough elements.
659 const auto OldCapacity = Capacity; 665 const auto OldCapacity = Capacity;
660 Capacity = RHSWords; 666 Capacity = RHSWords;
661 assert(Capacity > 0 && "negative capacity?"); 667 assert(Capacity > 0 && "negative capacity?");
662 BitWord *NewBits = Alloc.allocate(Capacity * sizeof(BitWord)); 668 BitWord *NewBits = Alloc.allocate(Capacity);
663 std::memcpy(NewBits, RHS.Bits, Capacity * sizeof(BitWord)); 669 std::memcpy(NewBits, RHS.Bits, Capacity * sizeof(BitWord));
664 670
665 // Destroy the old bits. 671 // Destroy the old bits.
666 Alloc.deallocate(Bits, OldCapacity * sizeof(BitWord)); 672 Alloc.deallocate(Bits, OldCapacity);
667 Bits = NewBits; 673 Bits = NewBits;
668 674
669 return *this; 675 return *this;
670 } 676 }
671 677
672 const BitVector &operator=(BitVector &&RHS) { 678 const BitVector &operator=(BitVector &&RHS) {
673 if (this == &RHS) 679 if (this == &RHS)
674 return *this; 680 return *this;
675 681
676 Alloc.deallocate(Bits, Capacity * sizeof(BitWord)); 682 Alloc.deallocate(Bits, Capacity);
677 Bits = RHS.Bits; 683 Bits = RHS.Bits;
678 Size = RHS.Size; 684 Size = RHS.Size;
679 Capacity = RHS.Capacity; 685 Capacity = RHS.Capacity;
680 686
681 RHS.Bits = nullptr; 687 RHS.Bits = nullptr;
682 688
683 return *this; 689 return *this;
684 } 690 }
685 691
686 void swap(BitVector &RHS) { 692 void swap(BitVector &RHS) {
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
748 } 754 }
749 } 755 }
750 756
751 // Clear the unused bits in the high words. 757 // Clear the unused bits in the high words.
752 void clear_unused_bits() { set_unused_bits(false); } 758 void clear_unused_bits() { set_unused_bits(false); }
753 759
754 void grow(unsigned NewSize) { 760 void grow(unsigned NewSize) {
755 const auto OldCapacity = Capacity; 761 const auto OldCapacity = Capacity;
756 Capacity = std::max(NumBitWords(NewSize), Capacity * 2); 762 Capacity = std::max(NumBitWords(NewSize), Capacity * 2);
757 assert(Capacity > 0 && "realloc-ing zero space"); 763 assert(Capacity > 0 && "realloc-ing zero space");
758 auto *NewBits = Alloc.allocate(Capacity * sizeof(BitWord)); 764 auto *NewBits = Alloc.allocate(Capacity);
759 std::memcpy(Bits, NewBits, OldCapacity * sizeof(BitWord)); 765 std::memcpy(Bits, NewBits, OldCapacity * sizeof(BitWord));
760 Alloc.deallocate(Bits, OldCapacity * sizeof(BitWord)); 766 Alloc.deallocate(Bits, OldCapacity);
761 Bits = NewBits; 767 Bits = NewBits;
762 768
763 clear_unused_bits(); 769 clear_unused_bits();
764 } 770 }
765 771
766 void init_words(BitWord *B, unsigned NumWords, bool t) { 772 void init_words(BitWord *B, unsigned NumWords, bool t) {
767 memset(B, 0 - (int)t, NumWords * sizeof(BitWord)); 773 memset(B, 0 - (int)t, NumWords * sizeof(BitWord));
768 } 774 }
769 775
770 template <bool AddBits, bool InvertMask> 776 template <bool AddBits, bool InvertMask>
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
802 }; 808 };
803 809
804 } // end of namespace Ice 810 } // end of namespace Ice
805 811
806 namespace std { 812 namespace std {
807 /// Implement std::swap in terms of BitVector swap. 813 /// Implement std::swap in terms of BitVector swap.
808 inline void swap(Ice::BitVector &LHS, Ice::BitVector &RHS) { LHS.swap(RHS); } 814 inline void swap(Ice::BitVector &LHS, Ice::BitVector &RHS) { LHS.swap(RHS); }
809 } 815 }
810 816
811 #endif // SUBZERO_SRC_ICEBITVECTOR_H 817 #endif // SUBZERO_SRC_ICEBITVECTOR_H
OLDNEW
« no previous file with comments | « no previous file | src/IceCfg.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698