Skip to content

Commit 7e1d196

Browse files
rmacnak-googlecommit-bot@chromium.org
authored andcommitted
[vm] Switch TypeArguments to compressed pointers.
TEST=ci Change-Id: Ic3162ef1558fb803ab68749f1f1a4d820645ec7e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/194017 Commit-Queue: Ryan Macnak <[email protected]> Reviewed-by: Liam Appelbe <[email protected]>
1 parent 5b9a3f5 commit 7e1d196

29 files changed

+287
-158
lines changed

runtime/vm/clustered_snapshot.cc

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -690,10 +690,10 @@ class TypeArgumentsSerializationCluster
690690
TypeArgumentsPtr type_args = TypeArguments::RawCast(object);
691691
objects_.Add(type_args);
692692

693-
s->Push(type_args->untag()->instantiations_);
694-
const intptr_t length = Smi::Value(type_args->untag()->length_);
693+
s->Push(type_args->untag()->instantiations());
694+
const intptr_t length = Smi::Value(type_args->untag()->length());
695695
for (intptr_t i = 0; i < length; i++) {
696-
s->Push(type_args->untag()->types()[i]);
696+
s->Push(type_args->untag()->element(i));
697697
}
698698
}
699699

@@ -706,7 +706,7 @@ class TypeArgumentsSerializationCluster
706706
TypeArgumentsPtr type_args = objects_[i];
707707
s->AssignRef(type_args);
708708
AutoTraceObject(type_args);
709-
const intptr_t length = Smi::Value(type_args->untag()->length_);
709+
const intptr_t length = Smi::Value(type_args->untag()->length());
710710
s->WriteUnsigned(length);
711711
target_memory_size_ +=
712712
compiler::target::TypeArguments::InstanceSize(length);
@@ -719,15 +719,16 @@ class TypeArgumentsSerializationCluster
719719
for (intptr_t i = 0; i < count; i++) {
720720
TypeArgumentsPtr type_args = objects_[i];
721721
AutoTraceObject(type_args);
722-
const intptr_t length = Smi::Value(type_args->untag()->length_);
722+
const intptr_t length = Smi::Value(type_args->untag()->length());
723723
s->WriteUnsigned(length);
724-
intptr_t hash = Smi::Value(type_args->untag()->hash_);
724+
intptr_t hash = Smi::Value(type_args->untag()->hash());
725725
s->Write<int32_t>(hash);
726-
const intptr_t nullability = Smi::Value(type_args->untag()->nullability_);
726+
const intptr_t nullability =
727+
Smi::Value(type_args->untag()->nullability());
727728
s->WriteUnsigned(nullability);
728-
WriteField(type_args, instantiations_);
729+
WriteField(type_args, instantiations());
729730
for (intptr_t j = 0; j < length; j++) {
730-
s->WriteElementRef(type_args->untag()->types()[j], j);
731+
s->WriteElementRef(type_args->untag()->element(j), j);
731732
}
732733
}
733734
}

runtime/vm/compiler/assembler/assembler_arm.h

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -410,6 +410,9 @@ class Assembler : public AssemblerBase {
410410
void CompareWithFieldValue(Register value, FieldAddress address) {
411411
CompareWithMemoryValue(value, address);
412412
}
413+
void CompareWithCompressedFieldValue(Register value, FieldAddress address) {
414+
CompareWithMemoryValue(value, address);
415+
}
413416

414417
void CompareWithMemoryValue(Register value, Address address) {
415418
ldr(TMP, address);
@@ -946,14 +949,21 @@ class Assembler : public AssemblerBase {
946949
// For loading indexed payloads out of tagged objects like Arrays. If the
947950
// payload objects are word-sized, use TIMES_HALF_WORD_SIZE if the contents of
948951
// [index] is a Smi, otherwise TIMES_WORD_SIZE if unboxed.
949-
void LoadIndexedPayload(Register reg,
952+
void LoadIndexedPayload(Register dst,
950953
Register base,
951954
int32_t payload_start,
952955
Register index,
953956
ScaleFactor scale,
954957
OperandSize type = kFourBytes) {
955-
add(reg, base, Operand(index, LSL, scale));
956-
LoadFromOffset(reg, reg, payload_start - kHeapObjectTag, type);
958+
add(dst, base, Operand(index, LSL, scale));
959+
LoadFromOffset(dst, dst, payload_start - kHeapObjectTag, type);
960+
}
961+
void LoadIndexedCompressed(Register dst,
962+
Register base,
963+
int32_t offset,
964+
Register index) {
965+
add(dst, base, Operand(index, LSL, TIMES_COMPRESSED_WORD_SIZE));
966+
LoadCompressedFieldFromOffset(dst, dst, offset);
957967
}
958968
void LoadFromStack(Register dst, intptr_t depth);
959969
void StoreToStack(Register src, intptr_t depth);

runtime/vm/compiler/assembler/assembler_arm64.h

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -310,8 +310,9 @@ class Address : public ValueObject {
310310
switch (cid) {
311311
case kArrayCid:
312312
case kImmutableArrayCid:
313-
case kTypeArgumentsCid:
314313
return kEightBytes;
314+
case kTypeArgumentsCid:
315+
return kObjectBytes;
315316
case kOneByteStringCid:
316317
case kExternalOneByteStringCid:
317318
return kByte;
@@ -576,10 +577,15 @@ class Assembler : public AssemblerBase {
576577
void CompareWithFieldValue(Register value, FieldAddress address) {
577578
CompareWithMemoryValue(value, address);
578579
}
580+
void CompareWithCompressedFieldValue(Register value, FieldAddress address) {
581+
CompareWithMemoryValue(value, address, kObjectBytes);
582+
}
579583

580-
void CompareWithMemoryValue(Register value, Address address) {
581-
ldr(TMP, address);
582-
cmp(value, Operand(TMP));
584+
void CompareWithMemoryValue(Register value,
585+
Address address,
586+
OperandSize sz = kEightBytes) {
587+
ldr(TMP, address, sz);
588+
cmp(value, Operand(TMP), sz);
583589
}
584590

585591
void CompareTypeNullabilityWith(Register type, int8_t value) {
@@ -1707,6 +1713,13 @@ class Assembler : public AssemblerBase {
17071713
add(dest, base, Operand(index, LSL, scale));
17081714
LoadFromOffset(dest, dest, payload_offset - kHeapObjectTag, sz);
17091715
}
1716+
void LoadIndexedCompressed(Register dest,
1717+
Register base,
1718+
int32_t offset,
1719+
Register index) {
1720+
add(dest, base, Operand(index, LSL, TIMES_COMPRESSED_WORD_SIZE));
1721+
LoadCompressedFieldFromOffset(dest, dest, offset);
1722+
}
17101723
void LoadSFromOffset(VRegister dest, Register base, int32_t offset);
17111724
void LoadDFromOffset(VRegister dest, Register base, int32_t offset);
17121725
void LoadDFieldFromOffset(VRegister dest, Register base, int32_t offset) {

runtime/vm/compiler/assembler/assembler_ia32.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -624,6 +624,13 @@ class Assembler : public AssemblerBase {
624624
OperandSize sz = kFourBytes) {
625625
LoadFromOffset(dst, FieldAddress(base, index, scale, payload_offset), sz);
626626
}
627+
void LoadIndexedCompressed(Register dst,
628+
Register base,
629+
int32_t offset,
630+
Register index) {
631+
LoadCompressedField(
632+
dst, FieldAddress(base, index, TIMES_COMPRESSED_WORD_SIZE, offset));
633+
}
627634
void LoadFromStack(Register dst, intptr_t depth);
628635
void StoreToStack(Register src, intptr_t depth);
629636
void CompareToStack(Register src, intptr_t depth);

runtime/vm/compiler/assembler/assembler_x64.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -969,6 +969,13 @@ class Assembler : public AssemblerBase {
969969
OperandSize sz = kEightBytes) {
970970
LoadFromOffset(dst, FieldAddress(base, index, scale, payload_offset), sz);
971971
}
972+
void LoadIndexedCompressed(Register dst,
973+
Register base,
974+
int32_t offset,
975+
Register index) {
976+
LoadCompressed(
977+
dst, FieldAddress(base, index, TIMES_COMPRESSED_WORD_SIZE, offset));
978+
}
972979
void StoreFieldToOffset(Register src,
973980
Register base,
974981
int32_t offset,
@@ -999,6 +1006,9 @@ class Assembler : public AssemblerBase {
9991006
}
10001007

10011008
void CompareWithFieldValue(Register value, FieldAddress address) {
1009+
cmpq(value, address);
1010+
}
1011+
void CompareWithCompressedFieldValue(Register value, FieldAddress address) {
10021012
OBJ(cmp)(value, address);
10031013
}
10041014

runtime/vm/compiler/backend/flow_graph_compiler.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2702,7 +2702,7 @@ SubtypeTestCachePtr FlowGraphCompiler::GenerateUninstantiatedTypeTest(
27022702
// Check if type arguments are null, i.e. equivalent to vector of dynamic.
27032703
__ CompareObject(kTypeArgumentsReg, Object::null_object());
27042704
__ BranchIf(EQUAL, is_instance_lbl);
2705-
__ LoadFieldFromOffset(
2705+
__ LoadCompressedFieldFromOffset(
27062706
kScratchReg, kTypeArgumentsReg,
27072707
compiler::target::TypeArguments::type_at_offset(type_param.index()));
27082708
// kScratchReg: Concrete type of type.
@@ -3036,7 +3036,7 @@ void FlowGraphCompiler::GenerateCallerChecksForAssertAssignable(
30363036
__ BranchIf(EQUAL, done);
30373037
// Put the instantiated type parameter into the scratch register, so its
30383038
// TTS can be called by the caller.
3039-
__ LoadField(
3039+
__ LoadCompressedField(
30403040
TypeTestABI::kScratchReg,
30413041
compiler::FieldAddress(kTypeArgumentsReg,
30423042
compiler::target::TypeArguments::type_at_offset(

runtime/vm/compiler/backend/il_arm64.cc

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1783,7 +1783,11 @@ void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
17831783
ASSERT(representation() == kTagged);
17841784
ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid) ||
17851785
(class_id() == kTypeArgumentsCid));
1786-
__ ldr(result, element_address);
1786+
if (class_id() == kTypeArgumentsCid) {
1787+
__ LoadCompressed(result, element_address);
1788+
} else {
1789+
__ ldr(result, element_address);
1790+
}
17871791
break;
17881792
}
17891793
}

runtime/vm/compiler/backend/il_x64.cc

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1809,7 +1809,11 @@ void LoadIndexedInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
18091809
ASSERT(representation() == kTagged);
18101810
ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid) ||
18111811
(class_id() == kTypeArgumentsCid));
1812-
__ movq(result, element_address);
1812+
if (class_id() == kTypeArgumentsCid) {
1813+
__ LoadCompressed(result, element_address);
1814+
} else {
1815+
__ movq(result, element_address);
1816+
}
18131817
break;
18141818
}
18151819
}

runtime/vm/compiler/backend/slot.cc

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -238,8 +238,9 @@ const Slot& Slot::GetTypeArgumentsIndexSlot(Thread* thread, intptr_t index) {
238238
const intptr_t offset =
239239
compiler::target::TypeArguments::type_at_offset(index);
240240
const Slot& slot =
241-
Slot(Kind::kTypeArgumentsIndex, IsImmutableBit::encode(true), kDynamicCid,
242-
offset, ":argument", /*static_type=*/nullptr, kTagged);
241+
Slot(Kind::kTypeArgumentsIndex,
242+
IsImmutableBit::encode(true) | IsCompressedBit::encode(true),
243+
kDynamicCid, offset, ":argument", /*static_type=*/nullptr, kTagged);
243244
return SlotCache::Instance(thread).Canonicalize(slot);
244245
}
245246

runtime/vm/compiler/backend/slot.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ class ParsedFunction;
106106
V(ArgumentsDescriptor, UntaggedArray, count, Smi, FINAL) \
107107
V(ArgumentsDescriptor, UntaggedArray, size, Smi, FINAL) \
108108
V(PointerBase, UntaggedPointerBase, data_field, Dynamic, FINAL) \
109-
V(TypeArguments, UntaggedTypeArguments, length, Smi, FINAL) \
109+
V(TypeArguments, UntaggedTypeArguments, length, Smi, FINAL_COMPRESSED) \
110110
V(TypeParameter, UntaggedTypeParameter, bound, Dynamic, FINAL_COMPRESSED) \
111111
V(TypeParameter, UntaggedTypeParameter, name, Dynamic, FINAL_COMPRESSED) \
112112
V(UnhandledException, UntaggedUnhandledException, exception, Dynamic, \

0 commit comments

Comments
 (0)