summaryrefslogtreecommitdiff
path: root/libartbase/base/bit_vector.cc
diff options
context:
space:
mode:
author Alex Light <allight@google.com> 2020-11-12 17:05:28 +0000
committer Treehugger Robot <treehugger-gerrit@google.com> 2020-11-13 10:07:21 +0000
commitb6837f0350ff66c13582b0e94178dd5ca283ff0a (patch)
treef79fff81352545efe967850e3d17e32255dcfecd /libartbase/base/bit_vector.cc
parent32c2eb81320f24b5bab24754204b8be95faa08b0 (diff)
Revert^2 "Partial LSE analysis & store removal"
A ScopedArenaAllocator in a single test was accidentally loaded using operator new which is not supported. This caused a memory leak. This reverts commit fe270426c8a2a69a8f669339e83b86fbf40e25a1. This unreverts commit bb6cda60e4418c0ab557ea4090e046bed8206763. Bug: 67037140 Reason for revert: Fixed memory leak in LoadStoreAnalysisTest.PartialEscape test case Test: SANITIZE_HOST=address ASAN_OPTIONS=detect_leaks=0 m test-art-host-gtest-dependencies Run art_compiler_tests Change-Id: I34fa2079df946ae54b8c91fa771a44d56438a719
Diffstat (limited to 'libartbase/base/bit_vector.cc')
-rw-r--r--libartbase/base/bit_vector.cc27
1 files changed, 27 insertions, 0 deletions
diff --git a/libartbase/base/bit_vector.cc b/libartbase/base/bit_vector.cc
index 8e3d4c9bf7..d3cb652c0c 100644
--- a/libartbase/base/bit_vector.cc
+++ b/libartbase/base/bit_vector.cc
@@ -376,4 +376,31 @@ Allocator* BitVector::GetAllocator() const {
return allocator_;
}
+void BaseBitVectorArray::Resize(size_t rows, size_t cols, bool clear) {
+ DCHECK(IsExpandable());
+ if (clear) {
+ Clear();
+ }
+ cols = RoundUp(cols, BitVector::kWordBits);
+ num_columns_ = cols;
+ num_rows_ = rows;
+ // Ensure size
+ GetRawData().SetBit(num_rows_ * num_columns_ - 1);
+ GetRawData().ClearBit(num_rows_ * num_columns_ - 1);
+}
+
+// In order to improve performance we do this in 4-byte blocks. Clang should be
+// able to optimize this to larger blocks if possible.
+void BaseBitVectorArray::UnionRows(size_t dest_row, size_t other) {
+ DCHECK_LT(dest_row, num_rows_);
+ DCHECK_LT(other, num_rows_);
+ size_t block_words = num_columns_ / BitVector::kWordBits;
+ uint32_t* dest =
+ GetRawData().GetRawStorage() + ((dest_row * num_columns_) / BitVector::kWordBits);
+ uint32_t* source = GetRawData().GetRawStorage() + ((other * num_columns_) / BitVector::kWordBits);
+ for (uint32_t i = 0; i < block_words; ++i, ++dest, ++source) {
+ *dest = (*dest) | (*source);
+ }
+}
+
} // namespace art