[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:
Tess Strickland 2023-10-17 16:14:29 +00:00 committed by Commit Queue
parent 1b4ae5a7e1
commit 20b6843238
9 changed files with 49 additions and 59 deletions

View file

@ -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();

View file

@ -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();

View file

@ -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();

View file

@ -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();

View file

@ -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();

View file

@ -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);
}

View file

@ -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

View file

@ -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(

View file

@ -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.