summaryrefslogtreecommitdiffstats
path: root/compiler/optimizing/stack_map_test.cc
diff options
context:
space:
mode:
authorNicolas Geoffray <ngeoffray@google.com>2015-03-13 14:39:40 +0000
committerNicolas Geoffray <ngeoffray@google.com>2015-03-13 18:28:19 +0000
commitfead4e4f397455aa31905b2982d4d861126ab89d (patch)
tree21e4ccd99472bbf5cf1fac3bc20d0bca6f176022 /compiler/optimizing/stack_map_test.cc
parentcc22e3946baf035c8732e9417ab132bfe663aa45 (diff)
downloadandroid_art-fead4e4f397455aa31905b2982d4d861126ab89d.tar.gz
android_art-fead4e4f397455aa31905b2982d4d861126ab89d.tar.bz2
android_art-fead4e4f397455aa31905b2982d4d861126ab89d.zip
[optimizing] Don't record None locations in the stack maps.
- moved environment recording from code generator to stack map stream - added creation/loading factory methods for the DexRegisterMap (hides internal details) - added new tests Change-Id: Ic8b6d044f0d8255c6759c19a41df332ef37876fe
Diffstat (limited to 'compiler/optimizing/stack_map_test.cc')
-rw-r--r--compiler/optimizing/stack_map_test.cc74
1 files changed, 54 insertions, 20 deletions
diff --git a/compiler/optimizing/stack_map_test.cc b/compiler/optimizing/stack_map_test.cc
index 3a5f80686d..4606bd63c9 100644
--- a/compiler/optimizing/stack_map_test.cc
+++ b/compiler/optimizing/stack_map_test.cc
@@ -31,19 +31,17 @@ static bool SameBits(MemoryRegion region, const BitVector& bit_vector) {
return true;
}
-static size_t ComputeDexRegisterMapSize(const DexRegisterMap& dex_registers,
- size_t number_of_dex_registers) {
- return dex_registers.FindLocationOffset(number_of_dex_registers);
-}
-
TEST(StackMapTest, Test1) {
ArenaPool pool;
ArenaAllocator arena(&pool);
StackMapStream stream(&arena);
ArenaBitVector sp_mask(&arena, 0, false);
+ ArenaBitVector live_registers_mask(&arena, 0, true);
+ live_registers_mask.SetBit(0);
+ live_registers_mask.SetBit(1);
size_t number_of_dex_registers = 2;
- stream.AddStackMapEntry(0, 64, 0x3, &sp_mask, number_of_dex_registers, 0);
+ stream.AddStackMapEntry(0, 64, 0x3, &sp_mask, number_of_dex_registers, 0, &live_registers_mask);
stream.AddDexRegisterEntry(DexRegisterLocation::Kind::kInStack, 0);
stream.AddDexRegisterEntry(DexRegisterLocation::Kind::kConstant, -2);
@@ -68,10 +66,9 @@ TEST(StackMapTest, Test1) {
ASSERT_TRUE(stack_map.HasDexRegisterMap());
DexRegisterMap dex_registers = code_info.GetDexRegisterMapOf(stack_map, number_of_dex_registers);
- ASSERT_EQ(6u, dex_registers.Size());
- ASSERT_EQ(6u, ComputeDexRegisterMapSize(dex_registers, number_of_dex_registers));
- DexRegisterLocation location0 = dex_registers.GetLocationKindAndValue(0);
- DexRegisterLocation location1 = dex_registers.GetLocationKindAndValue(1);
+ ASSERT_EQ(7u, dex_registers.Size());
+ DexRegisterLocation location0 = dex_registers.GetLocationKindAndValue(0, number_of_dex_registers);
+ DexRegisterLocation location1 = dex_registers.GetLocationKindAndValue(1, number_of_dex_registers);
ASSERT_EQ(DexRegisterLocation::Kind::kInStack, location0.GetKind());
ASSERT_EQ(DexRegisterLocation::Kind::kConstant, location1.GetKind());
ASSERT_EQ(DexRegisterLocation::Kind::kInStack, location0.GetInternalKind());
@@ -91,7 +88,10 @@ TEST(StackMapTest, Test2) {
sp_mask1.SetBit(2);
sp_mask1.SetBit(4);
size_t number_of_dex_registers = 2;
- stream.AddStackMapEntry(0, 64, 0x3, &sp_mask1, number_of_dex_registers, 2);
+ ArenaBitVector live_registers_mask1(&arena, 0, true);
+ live_registers_mask1.SetBit(0);
+ live_registers_mask1.SetBit(1);
+ stream.AddStackMapEntry(0, 64, 0x3, &sp_mask1, number_of_dex_registers, 2, &live_registers_mask1);
stream.AddDexRegisterEntry(DexRegisterLocation::Kind::kInStack, 0);
stream.AddDexRegisterEntry(DexRegisterLocation::Kind::kConstant, -2);
stream.AddInlineInfoEntry(42);
@@ -100,7 +100,10 @@ TEST(StackMapTest, Test2) {
ArenaBitVector sp_mask2(&arena, 0, true);
sp_mask2.SetBit(3);
sp_mask1.SetBit(8);
- stream.AddStackMapEntry(1, 128, 0xFF, &sp_mask2, number_of_dex_registers, 0);
+ ArenaBitVector live_registers_mask2(&arena, 0, true);
+ live_registers_mask2.SetBit(0);
+ live_registers_mask2.SetBit(1);
+ stream.AddStackMapEntry(1, 128, 0xFF, &sp_mask2, number_of_dex_registers, 0, &live_registers_mask2);
stream.AddDexRegisterEntry(DexRegisterLocation::Kind::kInRegister, 18);
stream.AddDexRegisterEntry(DexRegisterLocation::Kind::kInFpuRegister, 3);
@@ -128,10 +131,11 @@ TEST(StackMapTest, Test2) {
ASSERT_TRUE(stack_map.HasDexRegisterMap());
DexRegisterMap dex_registers =
code_info.GetDexRegisterMapOf(stack_map, number_of_dex_registers);
- ASSERT_EQ(6u, dex_registers.Size());
- ASSERT_EQ(6u, ComputeDexRegisterMapSize(dex_registers, number_of_dex_registers));
- DexRegisterLocation location0 = dex_registers.GetLocationKindAndValue(0);
- DexRegisterLocation location1 = dex_registers.GetLocationKindAndValue(1);
+ ASSERT_EQ(7u, dex_registers.Size());
+ DexRegisterLocation location0 =
+ dex_registers.GetLocationKindAndValue(0, number_of_dex_registers);
+ DexRegisterLocation location1 =
+ dex_registers.GetLocationKindAndValue(1, number_of_dex_registers);
ASSERT_EQ(DexRegisterLocation::Kind::kInStack, location0.GetKind());
ASSERT_EQ(DexRegisterLocation::Kind::kConstant, location1.GetKind());
ASSERT_EQ(DexRegisterLocation::Kind::kInStack, location0.GetInternalKind());
@@ -161,10 +165,11 @@ TEST(StackMapTest, Test2) {
ASSERT_TRUE(stack_map.HasDexRegisterMap());
DexRegisterMap dex_registers =
code_info.GetDexRegisterMapOf(stack_map, number_of_dex_registers);
- ASSERT_EQ(2u, dex_registers.Size());
- ASSERT_EQ(2u, ComputeDexRegisterMapSize(dex_registers, number_of_dex_registers));
- DexRegisterLocation location0 = dex_registers.GetLocationKindAndValue(0);
- DexRegisterLocation location1 = dex_registers.GetLocationKindAndValue(1);
+ ASSERT_EQ(3u, dex_registers.Size());
+ DexRegisterLocation location0 =
+ dex_registers.GetLocationKindAndValue(0, number_of_dex_registers);
+ DexRegisterLocation location1 =
+ dex_registers.GetLocationKindAndValue(1, number_of_dex_registers);
ASSERT_EQ(DexRegisterLocation::Kind::kInRegister, location0.GetKind());
ASSERT_EQ(DexRegisterLocation::Kind::kInFpuRegister, location1.GetKind());
ASSERT_EQ(DexRegisterLocation::Kind::kInRegister, location0.GetInternalKind());
@@ -176,4 +181,33 @@ TEST(StackMapTest, Test2) {
}
}
+TEST(StackMapTest, TestNonLiveDexRegisters) {
+ ArenaPool pool;
+ ArenaAllocator arena(&pool);
+ StackMapStream stream(&arena);
+
+ ArenaBitVector sp_mask(&arena, 0, false);
+ ArenaBitVector live_registers_mask(&arena, 0, true);
+ live_registers_mask.SetBit(1);
+ uint32_t number_of_dex_registers = 2;
+ stream.AddStackMapEntry(0, 64, 0x3, &sp_mask, number_of_dex_registers, 0, &live_registers_mask);
+ stream.AddDexRegisterEntry(DexRegisterLocation::Kind::kConstant, -2);
+
+ size_t size = stream.ComputeNeededSize();
+ void* memory = arena.Alloc(size, kArenaAllocMisc);
+ MemoryRegion region(memory, size);
+ stream.FillIn(region);
+
+ CodeInfo code_info(region);
+ StackMap stack_map = code_info.GetStackMapAt(0);
+ ASSERT_TRUE(stack_map.HasDexRegisterMap());
+ DexRegisterMap dex_registers = code_info.GetDexRegisterMapOf(stack_map, 2);
+ ASSERT_EQ(DexRegisterLocation::Kind::kNone,
+ dex_registers.GetLocationKind(0, number_of_dex_registers));
+ ASSERT_EQ(DexRegisterLocation::Kind::kConstant,
+ dex_registers.GetLocationKind(1, number_of_dex_registers));
+ ASSERT_EQ(-2, dex_registers.GetConstant(1, number_of_dex_registers));
+ ASSERT_FALSE(stack_map.HasInlineInfo());
+}
+
} // namespace art