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

Unified Diff: test/cctest/test-heap.cc

Issue 1169453003: Revert of Add SIMD 128 alignment support to Heap. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/heap/heap.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: test/cctest/test-heap.cc
diff --git a/test/cctest/test-heap.cc b/test/cctest/test-heap.cc
index d7b8eaa6ed1dcda2d858402651e3a63a85433b1a..da19f09f7cc22f6202ade9172d4edefeb943975b 100644
--- a/test/cctest/test-heap.cc
+++ b/test/cctest/test-heap.cc
@@ -1785,18 +1785,14 @@
TEST(TestAlignmentCalculations) {
- // Maximum fill amounts are consistent.
+ // Maximum fill amounts should be consistent.
int maximum_double_misalignment = kDoubleSize - kPointerSize;
- int maximum_simd128_misalignment = kSimd128Size - kPointerSize;
int max_word_fill = Heap::GetMaximumFillToAlign(kWordAligned);
CHECK_EQ(0, max_word_fill);
int max_double_fill = Heap::GetMaximumFillToAlign(kDoubleAligned);
CHECK_EQ(maximum_double_misalignment, max_double_fill);
int max_double_unaligned_fill = Heap::GetMaximumFillToAlign(kDoubleUnaligned);
CHECK_EQ(maximum_double_misalignment, max_double_unaligned_fill);
- int max_simd128_unaligned_fill =
- Heap::GetMaximumFillToAlign(kSimd128Unaligned);
- CHECK_EQ(maximum_simd128_misalignment, max_simd128_unaligned_fill);
Address base = reinterpret_cast<Address>(NULL);
int fill = 0;
@@ -1818,16 +1814,6 @@
CHECK_EQ(maximum_double_misalignment, fill);
fill = Heap::GetFillToAlign(base + kPointerSize, kDoubleUnaligned);
CHECK_EQ(0, fill);
-
- // 128 bit SIMD types have 2 or 4 possible alignments, depending on platform.
- fill = Heap::GetFillToAlign(base, kSimd128Unaligned);
- CHECK_EQ((3 * kPointerSize) & kSimd128AlignmentMask, fill);
- fill = Heap::GetFillToAlign(base + kPointerSize, kSimd128Unaligned);
- CHECK_EQ((2 * kPointerSize) & kSimd128AlignmentMask, fill);
- fill = Heap::GetFillToAlign(base + 2 * kPointerSize, kSimd128Unaligned);
- CHECK_EQ(kPointerSize, fill);
- fill = Heap::GetFillToAlign(base + 3 * kPointerSize, kSimd128Unaligned);
- CHECK_EQ(0, fill);
}
@@ -1843,94 +1829,65 @@
}
-// Get new space allocation into the desired alignment.
-static Address AlignNewSpace(AllocationAlignment alignment, int offset) {
- Address* top_addr = CcTest::heap()->new_space()->allocation_top_address();
- int fill = Heap::GetFillToAlign(*top_addr, alignment);
- if (fill) {
- NewSpaceAllocateAligned(fill + offset, kWordAligned);
- }
- return *top_addr;
-}
-
-
TEST(TestAlignedAllocation) {
// Double misalignment is 4 on 32-bit platforms, 0 on 64-bit ones.
const intptr_t double_misalignment = kDoubleSize - kPointerSize;
- Address* top_addr = CcTest::heap()->new_space()->allocation_top_address();
- Address start;
- HeapObject* obj;
- HeapObject* filler;
if (double_misalignment) {
- // Allocate a pointer sized object that must be double aligned at an
- // aligned address.
- start = AlignNewSpace(kDoubleAligned, 0);
- obj = NewSpaceAllocateAligned(kPointerSize, kDoubleAligned);
- CHECK(IsAddressAligned(obj->address(), kDoubleAlignment));
- // There is no filler.
+ Address* top_addr = CcTest::heap()->new_space()->allocation_top_address();
+ // Align the top for the first test.
+ if (!IsAddressAligned(*top_addr, kDoubleAlignment))
+ NewSpaceAllocateAligned(kPointerSize, kWordAligned);
+
+ // Allocate a pointer sized object that must be double aligned.
+ Address start = *top_addr;
+ HeapObject* obj1 = NewSpaceAllocateAligned(kPointerSize, kDoubleAligned);
+ CHECK(IsAddressAligned(obj1->address(), kDoubleAlignment));
+ // Only the object was allocated.
CHECK_EQ(kPointerSize, *top_addr - start);
-
- // Allocate a second pointer sized object that must be double aligned at an
- // unaligned address.
- start = AlignNewSpace(kDoubleAligned, kPointerSize);
- obj = NewSpaceAllocateAligned(kPointerSize, kDoubleAligned);
- CHECK(IsAddressAligned(obj->address(), kDoubleAlignment));
- // There is a filler object before the object.
- filler = HeapObject::FromAddress(start);
- CHECK(obj != filler && filler->IsFiller() &&
- filler->Size() == kPointerSize);
- CHECK_EQ(kPointerSize + double_misalignment, *top_addr - start);
-
- // Similarly for kDoubleUnaligned.
- start = AlignNewSpace(kDoubleUnaligned, 0);
- obj = NewSpaceAllocateAligned(kPointerSize, kDoubleUnaligned);
- CHECK(IsAddressAligned(obj->address(), kDoubleAlignment, kPointerSize));
+ // top is now misaligned.
+ // Allocate a second pointer sized object that must be double aligned.
+ HeapObject* obj2 = NewSpaceAllocateAligned(kPointerSize, kDoubleAligned);
+ CHECK(IsAddressAligned(obj2->address(), kDoubleAlignment));
+ // There should be a filler object in between the two objects.
+ CHECK(HeapObject::FromAddress(start + kPointerSize)->IsFiller());
+ // Two objects and a filler object were allocated.
+ CHECK_EQ(2 * kPointerSize + double_misalignment, *top_addr - start);
+
+ // Similarly for kDoubleUnaligned. top is misaligned.
+ start = *top_addr;
+ obj1 = NewSpaceAllocateAligned(kPointerSize, kDoubleUnaligned);
+ CHECK(IsAddressAligned(obj1->address(), kDoubleAlignment, kPointerSize));
CHECK_EQ(kPointerSize, *top_addr - start);
- start = AlignNewSpace(kDoubleUnaligned, kPointerSize);
- obj = NewSpaceAllocateAligned(kPointerSize, kDoubleUnaligned);
- CHECK(IsAddressAligned(obj->address(), kDoubleAlignment, kPointerSize));
- // There is a filler object before the object.
- filler = HeapObject::FromAddress(start);
- CHECK(obj != filler && filler->IsFiller() &&
- filler->Size() == kPointerSize);
- CHECK_EQ(kPointerSize + double_misalignment, *top_addr - start);
- }
-
- // Now test SIMD alignment. There are 2 or 4 possible alignments, depending
- // on platform.
- start = AlignNewSpace(kSimd128Unaligned, 0);
- obj = NewSpaceAllocateAligned(kPointerSize, kSimd128Unaligned);
- CHECK(IsAddressAligned(obj->address(), kSimd128Alignment, kPointerSize));
- // There is no filler.
- CHECK_EQ(kPointerSize, *top_addr - start);
- start = AlignNewSpace(kSimd128Unaligned, kPointerSize);
- obj = NewSpaceAllocateAligned(kPointerSize, kSimd128Unaligned);
- CHECK(IsAddressAligned(obj->address(), kSimd128Alignment, kPointerSize));
- // There is a filler object before the object.
- filler = HeapObject::FromAddress(start);
- CHECK(obj != filler && filler->IsFiller() &&
- filler->Size() == kSimd128Size - kPointerSize);
- CHECK_EQ(kPointerSize + kSimd128Size - kPointerSize, *top_addr - start);
-
- if (double_misalignment) {
- // Test the 2 other alignments possible on 32 bit platforms.
- start = AlignNewSpace(kSimd128Unaligned, 2 * kPointerSize);
- obj = NewSpaceAllocateAligned(kPointerSize, kSimd128Unaligned);
- CHECK(IsAddressAligned(obj->address(), kSimd128Alignment, kPointerSize));
- // There is a filler object before the object.
- filler = HeapObject::FromAddress(start);
- CHECK(obj != filler && filler->IsFiller() &&
- filler->Size() == 2 * kPointerSize);
- CHECK_EQ(kPointerSize + 2 * kPointerSize, *top_addr - start);
- start = AlignNewSpace(kSimd128Unaligned, 3 * kPointerSize);
- obj = NewSpaceAllocateAligned(kPointerSize, kSimd128Unaligned);
- CHECK(IsAddressAligned(obj->address(), kSimd128Alignment, kPointerSize));
- // There is a filler object before the object.
- filler = HeapObject::FromAddress(start);
- CHECK(obj != filler && filler->IsFiller() &&
- filler->Size() == kPointerSize);
- CHECK_EQ(kPointerSize + kPointerSize, *top_addr - start);
- }
+ obj2 = NewSpaceAllocateAligned(kPointerSize, kDoubleUnaligned);
+ CHECK(IsAddressAligned(obj2->address(), kDoubleAlignment, kPointerSize));
+ CHECK(HeapObject::FromAddress(start + kPointerSize)->IsFiller());
+ CHECK_EQ(2 * kPointerSize + double_misalignment, *top_addr - start);
+ }
+}
+
+
+// Force allocation to happen from the free list, at a desired misalignment.
+static Address SetUpFreeListAllocation(int misalignment) {
+ Heap* heap = CcTest::heap();
+ OldSpace* old_space = heap->old_space();
+ Address top = old_space->top();
+ // First, allocate enough filler to get the linear area into the desired
+ // misalignment.
+ const intptr_t maximum_misalignment = 2 * kPointerSize;
+ const intptr_t maximum_misalignment_mask = maximum_misalignment - 1;
+ intptr_t top_alignment = OffsetFrom(top) & maximum_misalignment_mask;
+ int filler_size = misalignment - static_cast<int>(top_alignment);
+ if (filler_size < 0) filler_size += maximum_misalignment;
+ if (filler_size) {
+ // Create the filler object.
+ AllocationResult allocation = old_space->AllocateRawUnaligned(filler_size);
+ HeapObject* obj = NULL;
+ allocation.To(&obj);
+ heap->CreateFillerObjectAt(obj->address(), filler_size);
+ }
+ top = old_space->top();
+ old_space->EmptyAllocationInfo();
+ return top;
}
@@ -1946,105 +1903,38 @@
}
-// Get old space allocation into the desired alignment.
-static Address AlignOldSpace(AllocationAlignment alignment, int offset) {
- Address* top_addr = CcTest::heap()->old_space()->allocation_top_address();
- int fill = Heap::GetFillToAlign(*top_addr, alignment);
- int allocation = fill + offset;
- if (allocation) {
- OldSpaceAllocateAligned(allocation, kWordAligned);
- }
- Address top = *top_addr;
- // Now force the remaining allocation onto the free list.
- CcTest::heap()->old_space()->EmptyAllocationInfo();
- return top;
-}
-
-
// Test the case where allocation must be done from the free list, so filler
// may precede or follow the object.
TEST(TestAlignedOverAllocation) {
// Double misalignment is 4 on 32-bit platforms, 0 on 64-bit ones.
const intptr_t double_misalignment = kDoubleSize - kPointerSize;
- Address start;
- HeapObject* obj;
- HeapObject* filler1;
- HeapObject* filler2;
if (double_misalignment) {
- start = AlignOldSpace(kDoubleAligned, 0);
- obj = OldSpaceAllocateAligned(kPointerSize, kDoubleAligned);
- // The object is aligned, and a filler object is created after.
- CHECK(IsAddressAligned(obj->address(), kDoubleAlignment));
- filler1 = HeapObject::FromAddress(start + kPointerSize);
- CHECK(obj != filler1 && filler1->IsFiller() &&
- filler1->Size() == kPointerSize);
+ Address start = SetUpFreeListAllocation(0);
+ HeapObject* obj1 = OldSpaceAllocateAligned(kPointerSize, kDoubleAligned);
+ // The object should be aligned, and a filler object should be created.
+ CHECK(IsAddressAligned(obj1->address(), kDoubleAlignment));
+ CHECK(HeapObject::FromAddress(start)->IsFiller() &&
+ HeapObject::FromAddress(start + kPointerSize)->IsFiller());
// Try the opposite alignment case.
- start = AlignOldSpace(kDoubleAligned, kPointerSize);
- obj = OldSpaceAllocateAligned(kPointerSize, kDoubleAligned);
- CHECK(IsAddressAligned(obj->address(), kDoubleAlignment));
- filler1 = HeapObject::FromAddress(start);
- CHECK(obj != filler1);
- CHECK(filler1->IsFiller());
- CHECK(filler1->Size() == kPointerSize);
- CHECK(obj != filler1 && filler1->IsFiller() &&
- filler1->Size() == kPointerSize);
+ start = SetUpFreeListAllocation(kPointerSize);
+ HeapObject* obj2 = OldSpaceAllocateAligned(kPointerSize, kDoubleAligned);
+ CHECK(IsAddressAligned(obj2->address(), kDoubleAlignment));
+ CHECK(HeapObject::FromAddress(start)->IsFiller() &&
+ HeapObject::FromAddress(start + kPointerSize)->IsFiller());
// Similarly for kDoubleUnaligned.
- start = AlignOldSpace(kDoubleUnaligned, 0);
- obj = OldSpaceAllocateAligned(kPointerSize, kDoubleUnaligned);
- // The object is aligned, and a filler object is created after.
- CHECK(IsAddressAligned(obj->address(), kDoubleAlignment, kPointerSize));
- filler1 = HeapObject::FromAddress(start + kPointerSize);
- CHECK(obj != filler1 && filler1->IsFiller() &&
- filler1->Size() == kPointerSize);
+ start = SetUpFreeListAllocation(0);
+ obj1 = OldSpaceAllocateAligned(kPointerSize, kDoubleUnaligned);
+ // The object should be aligned, and a filler object should be created.
+ CHECK(IsAddressAligned(obj1->address(), kDoubleAlignment, kPointerSize));
+ CHECK(HeapObject::FromAddress(start)->IsFiller() &&
+ HeapObject::FromAddress(start + kPointerSize)->IsFiller());
// Try the opposite alignment case.
- start = AlignOldSpace(kDoubleUnaligned, kPointerSize);
- obj = OldSpaceAllocateAligned(kPointerSize, kDoubleUnaligned);
- CHECK(IsAddressAligned(obj->address(), kDoubleAlignment, kPointerSize));
- filler1 = HeapObject::FromAddress(start);
- CHECK(obj != filler1 && filler1->IsFiller() &&
- filler1->Size() == kPointerSize);
- }
-
- // Now test SIMD alignment. There are 2 or 4 possible alignments, depending
- // on platform.
- start = AlignOldSpace(kSimd128Unaligned, 0);
- obj = OldSpaceAllocateAligned(kPointerSize, kSimd128Unaligned);
- CHECK(IsAddressAligned(obj->address(), kSimd128Alignment, kPointerSize));
- // There is a filler object after the object.
- filler1 = HeapObject::FromAddress(start + kPointerSize);
- CHECK(obj != filler1 && filler1->IsFiller() &&
- filler1->Size() == kSimd128Size - kPointerSize);
- start = AlignOldSpace(kSimd128Unaligned, kPointerSize);
- obj = OldSpaceAllocateAligned(kPointerSize, kSimd128Unaligned);
- CHECK(IsAddressAligned(obj->address(), kSimd128Alignment, kPointerSize));
- // There is a filler object before the object.
- filler1 = HeapObject::FromAddress(start);
- CHECK(obj != filler1 && filler1->IsFiller() &&
- filler1->Size() == kSimd128Size - kPointerSize);
-
- if (double_misalignment) {
- // Test the 2 other alignments possible on 32 bit platforms.
- start = AlignOldSpace(kSimd128Unaligned, 2 * kPointerSize);
- obj = OldSpaceAllocateAligned(kPointerSize, kSimd128Unaligned);
- CHECK(IsAddressAligned(obj->address(), kSimd128Alignment, kPointerSize));
- // There are filler objects before and after the object.
- filler1 = HeapObject::FromAddress(start);
- CHECK(obj != filler1 && filler1->IsFiller() &&
- filler1->Size() == 2 * kPointerSize);
- filler2 = HeapObject::FromAddress(start + 3 * kPointerSize);
- CHECK(obj != filler2 && filler2->IsFiller() &&
- filler2->Size() == kPointerSize);
- start = AlignOldSpace(kSimd128Unaligned, 3 * kPointerSize);
- obj = OldSpaceAllocateAligned(kPointerSize, kSimd128Unaligned);
- CHECK(IsAddressAligned(obj->address(), kSimd128Alignment, kPointerSize));
- // There are filler objects before and after the object.
- filler1 = HeapObject::FromAddress(start);
- CHECK(obj != filler1 && filler1->IsFiller() &&
- filler1->Size() == kPointerSize);
- filler2 = HeapObject::FromAddress(start + 2 * kPointerSize);
- CHECK(obj != filler2 && filler2->IsFiller() &&
- filler2->Size() == 2 * kPointerSize);
+ start = SetUpFreeListAllocation(kPointerSize);
+ obj2 = OldSpaceAllocateAligned(kPointerSize, kDoubleUnaligned);
+ CHECK(IsAddressAligned(obj2->address(), kDoubleAlignment, kPointerSize));
+ CHECK(HeapObject::FromAddress(start)->IsFiller() &&
+ HeapObject::FromAddress(start + kPointerSize)->IsFiller());
}
}
« no previous file with comments | « src/heap/heap.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698