diff options
| author | 2018-08-01 13:49:25 +0000 | |
|---|---|---|
| committer | 2018-08-01 13:49:25 +0000 | |
| commit | 91f0fdb4372d3f2bcfcd9db67afcbe7ee1901048 (patch) | |
| tree | 9eaf6465a7212af4ae5f31d39b0e242f32c23077 /compiler/optimizing/stack_map_test.cc | |
| parent | 35dc0b5874b6f8c98b83560c966773c9973fc4b1 (diff) | |
| parent | b73323c50d10d3850d2d8719a481f4f430fc51ce (diff) | |
Merge "Deduplicate stackmaps at BitTable level."
Diffstat (limited to 'compiler/optimizing/stack_map_test.cc')
| -rw-r--r-- | compiler/optimizing/stack_map_test.cc | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/compiler/optimizing/stack_map_test.cc b/compiler/optimizing/stack_map_test.cc index 42f978988f..16a9216311 100644 --- a/compiler/optimizing/stack_map_test.cc +++ b/compiler/optimizing/stack_map_test.cc @@ -758,4 +758,48 @@ TEST(StackMapTest, TestDeduplicateStackMask) { stack_map2.GetStackMaskIndex()); } +TEST(StackMapTest, TestDedupeBitTables) { + MallocArenaPool pool; + ArenaStack arena_stack(&pool); + ScopedArenaAllocator allocator(&arena_stack); + StackMapStream stream(&allocator, kRuntimeISA); + stream.BeginMethod(32, 0, 0, 2); + + stream.BeginStackMapEntry(0, 64 * kPcAlign); + stream.AddDexRegisterEntry(Kind::kInStack, 0); + stream.AddDexRegisterEntry(Kind::kConstant, -2); + stream.EndStackMapEntry(); + + stream.EndMethod(); + std::vector<uint8_t> memory(stream.PrepareForFillIn()); + MemoryRegion region(memory.data(), memory.size()); + stream.FillInCodeInfo(region); + + std::vector<uint8_t> out; + CodeInfo::DedupeMap dedupe_map; + size_t deduped1 = CodeInfo::Dedupe(&out, memory.data(), &dedupe_map); + size_t deduped2 = CodeInfo::Dedupe(&out, memory.data(), &dedupe_map); + + for (size_t deduped : { deduped1, deduped2 }) { + CodeInfo code_info(out.data() + deduped); + ASSERT_EQ(1u, code_info.GetNumberOfStackMaps()); + + StackMap stack_map = code_info.GetStackMapAt(0); + ASSERT_TRUE(stack_map.Equals(code_info.GetStackMapForDexPc(0))); + ASSERT_TRUE(stack_map.Equals(code_info.GetStackMapForNativePcOffset(64 * kPcAlign))); + ASSERT_EQ(0u, stack_map.GetDexPc()); + ASSERT_EQ(64u * kPcAlign, stack_map.GetNativePcOffset(kRuntimeISA)); + + ASSERT_TRUE(stack_map.HasDexRegisterMap()); + DexRegisterMap dex_register_map = code_info.GetDexRegisterMapOf(stack_map); + + ASSERT_EQ(Kind::kInStack, dex_register_map[0].GetKind()); + ASSERT_EQ(Kind::kConstant, dex_register_map[1].GetKind()); + ASSERT_EQ(0, dex_register_map[0].GetStackOffsetInBytes()); + ASSERT_EQ(-2, dex_register_map[1].GetConstant()); + } + + ASSERT_GT(memory.size() * 2, out.size()); +} + } // namespace art |