mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 02:47:36 +00:00
[vm/compiler] Convert more LoadUntagged -> LoadField.
Missed a couple of LoadUntaggeds for PointerBase.data in the graph
intrinsifier during 4d1bdaac
.
Creates slots for ExternalOneByteString.external_data and
ExternalTwoByteString.external_data and uses LoadField with those slots
instead of LoadUntagged.
TEST=ci
Issue: https://github.com/dart-lang/sdk/issues/42072
Fixes: https://github.com/dart-lang/sdk/issues/53124
Change-Id: I900281644c4c42ad303cc7a6121e4c8bb7852cfe
Cq-Include-Trybots: luci.dart.try:vm-aot-linux-release-simarm_x64-try,vm-aot-linux-release-x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/330787
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Tess Strickland <sstrickl@google.com>
This commit is contained in:
parent
1b4ae5a7e1
commit
20b6843238
|
@ -407,16 +407,12 @@ void MemoryCopyInstr::EmitComputeStartPointer(FlowGraphCompiler* compiler,
|
|||
compiler::target::TwoByteString::data_offset() - kHeapObjectTag;
|
||||
break;
|
||||
case kExternalOneByteStringCid:
|
||||
__ ldr(array_reg,
|
||||
compiler::FieldAddress(array_reg,
|
||||
compiler::target::ExternalOneByteString::
|
||||
external_data_offset()));
|
||||
__ LoadFromSlot(array_reg, array_reg,
|
||||
Slot::ExternalOneByteString_external_data());
|
||||
break;
|
||||
case kExternalTwoByteStringCid:
|
||||
__ ldr(array_reg,
|
||||
compiler::FieldAddress(array_reg,
|
||||
compiler::target::ExternalTwoByteString::
|
||||
external_data_offset()));
|
||||
__ LoadFromSlot(array_reg, array_reg,
|
||||
Slot::ExternalTwoByteString_external_data());
|
||||
break;
|
||||
default:
|
||||
UNREACHABLE();
|
||||
|
|
|
@ -308,16 +308,12 @@ void MemoryCopyInstr::EmitComputeStartPointer(FlowGraphCompiler* compiler,
|
|||
compiler::target::TwoByteString::data_offset() - kHeapObjectTag;
|
||||
break;
|
||||
case kExternalOneByteStringCid:
|
||||
__ ldr(array_reg,
|
||||
compiler::FieldAddress(array_reg,
|
||||
compiler::target::ExternalOneByteString::
|
||||
external_data_offset()));
|
||||
__ LoadFromSlot(array_reg, array_reg,
|
||||
Slot::ExternalOneByteString_external_data());
|
||||
break;
|
||||
case kExternalTwoByteStringCid:
|
||||
__ ldr(array_reg,
|
||||
compiler::FieldAddress(array_reg,
|
||||
compiler::target::ExternalTwoByteString::
|
||||
external_data_offset()));
|
||||
__ LoadFromSlot(array_reg, array_reg,
|
||||
Slot::ExternalTwoByteString_external_data());
|
||||
break;
|
||||
default:
|
||||
UNREACHABLE();
|
||||
|
|
|
@ -201,16 +201,12 @@ void MemoryCopyInstr::EmitComputeStartPointer(FlowGraphCompiler* compiler,
|
|||
compiler::target::TwoByteString::data_offset() - kHeapObjectTag;
|
||||
break;
|
||||
case kExternalOneByteStringCid:
|
||||
__ movl(array_reg,
|
||||
compiler::FieldAddress(array_reg,
|
||||
compiler::target::ExternalOneByteString::
|
||||
external_data_offset()));
|
||||
__ LoadFromSlot(array_reg, array_reg,
|
||||
Slot::ExternalOneByteString_external_data());
|
||||
break;
|
||||
case kExternalTwoByteStringCid:
|
||||
__ movl(array_reg,
|
||||
compiler::FieldAddress(array_reg,
|
||||
compiler::target::ExternalTwoByteString::
|
||||
external_data_offset()));
|
||||
__ LoadFromSlot(array_reg, array_reg,
|
||||
Slot::ExternalTwoByteString_external_data());
|
||||
break;
|
||||
default:
|
||||
UNREACHABLE();
|
||||
|
|
|
@ -403,16 +403,12 @@ void MemoryCopyInstr::EmitComputeStartPointer(FlowGraphCompiler* compiler,
|
|||
compiler::target::TwoByteString::data_offset() - kHeapObjectTag;
|
||||
break;
|
||||
case kExternalOneByteStringCid:
|
||||
__ lx(array_reg,
|
||||
compiler::FieldAddress(array_reg,
|
||||
compiler::target::ExternalOneByteString::
|
||||
external_data_offset()));
|
||||
__ LoadFromSlot(array_reg, array_reg,
|
||||
Slot::ExternalOneByteString_external_data());
|
||||
break;
|
||||
case kExternalTwoByteStringCid:
|
||||
__ lx(array_reg,
|
||||
compiler::FieldAddress(array_reg,
|
||||
compiler::target::ExternalTwoByteString::
|
||||
external_data_offset()));
|
||||
__ LoadFromSlot(array_reg, array_reg,
|
||||
Slot::ExternalTwoByteString_external_data());
|
||||
break;
|
||||
default:
|
||||
UNREACHABLE();
|
||||
|
|
|
@ -296,16 +296,12 @@ void MemoryCopyInstr::EmitComputeStartPointer(FlowGraphCompiler* compiler,
|
|||
compiler::target::TwoByteString::data_offset() - kHeapObjectTag;
|
||||
break;
|
||||
case kExternalOneByteStringCid:
|
||||
__ movq(array_reg,
|
||||
compiler::FieldAddress(array_reg,
|
||||
compiler::target::ExternalOneByteString::
|
||||
external_data_offset()));
|
||||
__ LoadFromSlot(array_reg, array_reg,
|
||||
Slot::ExternalOneByteString_external_data());
|
||||
break;
|
||||
case kExternalTwoByteStringCid:
|
||||
__ movq(array_reg,
|
||||
compiler::FieldAddress(array_reg,
|
||||
compiler::target::ExternalTwoByteString::
|
||||
external_data_offset()));
|
||||
__ LoadFromSlot(array_reg, array_reg,
|
||||
Slot::ExternalTwoByteString_external_data());
|
||||
break;
|
||||
default:
|
||||
UNREACHABLE();
|
||||
|
|
|
@ -3497,14 +3497,14 @@ static Definition* PrepareInlineStringIndexOp(FlowGraph* flow_graph,
|
|||
|
||||
// For external strings: Load backing store.
|
||||
if (cid == kExternalOneByteStringCid) {
|
||||
str = new LoadUntaggedInstr(
|
||||
new Value(str),
|
||||
compiler::target::ExternalOneByteString::external_data_offset());
|
||||
str = new LoadFieldInstr(
|
||||
new Value(str), Slot::ExternalOneByteString_external_data(),
|
||||
InnerPointerAccess::kCannotBeInnerPointer, call->source());
|
||||
cursor = flow_graph->AppendTo(cursor, str, nullptr, FlowGraph::kValue);
|
||||
} else if (cid == kExternalTwoByteStringCid) {
|
||||
str = new LoadUntaggedInstr(
|
||||
new Value(str),
|
||||
compiler::target::ExternalTwoByteString::external_data_offset());
|
||||
str = new LoadFieldInstr(
|
||||
new Value(str), Slot::ExternalTwoByteString_external_data(),
|
||||
InnerPointerAccess::kCannotBeInnerPointer, call->source());
|
||||
cursor = flow_graph->AppendTo(cursor, str, nullptr, FlowGraph::kValue);
|
||||
}
|
||||
|
||||
|
|
|
@ -212,7 +212,11 @@ NONNULLABLE_BOXED_NATIVE_SLOTS_LIST(FOR_EACH_NATIVE_SLOT)
|
|||
AOT_ONLY_UNBOXED_NATIVE_ADDRESS_SLOTS_LIST(V) \
|
||||
V(Function, UntaggedFunction, entry_point, false, FINAL) \
|
||||
V(FinalizerBase, UntaggedFinalizerBase, isolate, false, VAR) \
|
||||
V(PointerBase, UntaggedPointerBase, data, true, VAR)
|
||||
V(PointerBase, UntaggedPointerBase, data, true, VAR) \
|
||||
V(ExternalOneByteString, UntaggedExternalOneByteString, external_data, \
|
||||
false, FINAL) \
|
||||
V(ExternalTwoByteString, UntaggedExternalTwoByteString, external_data, \
|
||||
false, FINAL)
|
||||
|
||||
// For uses that do not need to know whether a given slot may contain an
|
||||
// inner pointer to a GC-able object or not. (Generally, such users only need
|
||||
|
|
|
@ -225,8 +225,9 @@ static bool IntrinsifyArrayGetIndexed(FlowGraph* flow_graph,
|
|||
Slot::GetLengthFieldForArrayCid(array_cid));
|
||||
|
||||
if (IsExternalTypedDataClassId(array_cid)) {
|
||||
array = builder.AddDefinition(new LoadUntaggedInstr(
|
||||
new Value(array), target::PointerBase::data_offset()));
|
||||
array = builder.AddDefinition(new LoadFieldInstr(
|
||||
new Value(array), Slot::PointerBase_data(),
|
||||
InnerPointerAccess::kCannotBeInnerPointer, builder.Source()));
|
||||
}
|
||||
|
||||
Definition* result = builder.AddDefinition(new LoadIndexedInstr(
|
||||
|
@ -409,8 +410,9 @@ static bool IntrinsifyArraySetIndexed(FlowGraph* flow_graph,
|
|||
}
|
||||
|
||||
if (IsExternalTypedDataClassId(array_cid)) {
|
||||
array = builder.AddDefinition(new LoadUntaggedInstr(
|
||||
new Value(array), target::PointerBase::data_offset()));
|
||||
array = builder.AddDefinition(new LoadFieldInstr(
|
||||
new Value(array), Slot::PointerBase_data(),
|
||||
InnerPointerAccess::kCannotBeInnerPointer, builder.Source()));
|
||||
}
|
||||
// No store barrier.
|
||||
ASSERT(IsExternalTypedDataClassId(array_cid) ||
|
||||
|
@ -547,11 +549,13 @@ static bool BuildCodeUnitAt(FlowGraph* flow_graph, intptr_t cid) {
|
|||
|
||||
// For external strings: Load external data.
|
||||
if (cid == kExternalOneByteStringCid) {
|
||||
str = builder.AddDefinition(new LoadUntaggedInstr(
|
||||
new Value(str), target::ExternalOneByteString::external_data_offset()));
|
||||
str = builder.AddDefinition(new LoadFieldInstr(
|
||||
new Value(str), Slot::ExternalOneByteString_external_data(),
|
||||
InnerPointerAccess::kCannotBeInnerPointer, builder.Source()));
|
||||
} else if (cid == kExternalTwoByteStringCid) {
|
||||
str = builder.AddDefinition(new LoadUntaggedInstr(
|
||||
new Value(str), target::ExternalTwoByteString::external_data_offset()));
|
||||
str = builder.AddDefinition(new LoadFieldInstr(
|
||||
new Value(str), Slot::ExternalTwoByteString_external_data(),
|
||||
InnerPointerAccess::kCannotBeInnerPointer, builder.Source()));
|
||||
}
|
||||
|
||||
Definition* load = builder.AddDefinition(new LoadIndexedInstr(
|
||||
|
|
|
@ -1725,17 +1725,19 @@ Value* IRRegExpMacroAssembler::LoadCodeUnitsAt(LocalVariable* index,
|
|||
Value* pattern_val = BindLoadLocal(*string_param_);
|
||||
if (IsExternalStringClassId(specialization_cid_)) {
|
||||
// The data of an external string is stored through one indirection.
|
||||
intptr_t external_offset = 0;
|
||||
const Slot* slot = nullptr;
|
||||
if (specialization_cid_ == kExternalOneByteStringCid) {
|
||||
external_offset = ExternalOneByteString::external_data_offset();
|
||||
slot = &Slot::ExternalOneByteString_external_data();
|
||||
} else if (specialization_cid_ == kExternalTwoByteStringCid) {
|
||||
external_offset = ExternalTwoByteString::external_data_offset();
|
||||
slot = &Slot::ExternalTwoByteString_external_data();
|
||||
} else {
|
||||
UNREACHABLE();
|
||||
}
|
||||
// This pushes an untagged value on the stack which is immediately consumed
|
||||
// by LoadCodeUnitsAtInstr below.
|
||||
pattern_val = Bind(new (Z) LoadUntaggedInstr(pattern_val, external_offset));
|
||||
pattern_val = Bind(new (Z) LoadFieldInstr(
|
||||
pattern_val, *slot, InnerPointerAccess::kCannotBeInnerPointer,
|
||||
InstructionSource()));
|
||||
}
|
||||
|
||||
// Here pattern_val might be untagged so this must not trigger a GC.
|
||||
|
|
Loading…
Reference in a new issue