From ea6c05d2c33fd4b29a53122192af32d3d95ab113 Mon Sep 17 00:00:00 2001 From: Victor Gomes Date: Fri, 27 Jan 2023 14:44:35 +0100 Subject: [PATCH] [maglev] Pass field representation to LoadPolymorphicTaggedField So we can statically find the returning type in case of a Smi. Bug: v8:7700 Change-Id: I67f8d1c1c96fef8dc4e246953d9face2c04a9923 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4198152 Reviewed-by: Toon Verwaest Commit-Queue: Victor Gomes Cr-Commit-Position: refs/heads/main@{#85523} --- src/maglev/maglev-graph-builder.cc | 14 +++++++++++++- src/maglev/maglev-ir.h | 10 ++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/maglev/maglev-graph-builder.cc b/src/maglev/maglev-graph-builder.cc index 0f6aeb7b65..6b2161ed64 100644 --- a/src/maglev/maglev-graph-builder.cc +++ b/src/maglev/maglev-graph-builder.cc @@ -1397,6 +1397,18 @@ NodeType StaticTypeForNode(ValueNode* node) { } return NodeType::kHeapObjectWithKnownMap; } + case Opcode::kLoadPolymorphicTaggedField: { + Representation field_representation = + node->Cast()->field_representation(); + switch (field_representation.kind()) { + case Representation::kSmi: + return NodeType::kSmi; + case Representation::kHeapObject: + return NodeType::kAnyHeapObject; + default: + return NodeType::kUnknown; + } + } case Opcode::kToNumberOrNumeric: if (node->Cast()->mode() == Object::Conversion::kToNumber) { @@ -2140,7 +2152,7 @@ bool MaglevGraphBuilder::TryBuildNamedAccess( {lookup_start_object}, std::move(access_infos))); } else { SetAccumulator(AddNewNode( - {lookup_start_object}, std::move(access_infos))); + {lookup_start_object}, field_repr, std::move(access_infos))); } return true; diff --git a/src/maglev/maglev-ir.h b/src/maglev/maglev-ir.h index 14ad252243..a71abdb78f 100644 --- a/src/maglev/maglev-ir.h +++ b/src/maglev/maglev-ir.h @@ -4044,8 +4044,11 @@ class LoadPolymorphicTaggedField public: explicit LoadPolymorphicTaggedField( - uint64_t bitfield, ZoneVector&& access_info) - : Base(bitfield), access_infos_(access_info) {} + uint64_t bitfield, Representation field_representation, + ZoneVector&& access_info) + : Base(bitfield), + field_representation_(field_representation), + access_infos_(access_info) {} static constexpr OpProperties kProperties = OpProperties::Reading() | OpProperties::EagerDeopt() | @@ -4056,12 +4059,15 @@ class LoadPolymorphicTaggedField static constexpr int kObjectIndex = 0; Input& object_input() { return input(kObjectIndex); } + Representation field_representation() const { return field_representation_; } + int MaxCallStackArgs() const { return 0; } void SetValueLocationConstraints(); void GenerateCode(MaglevAssembler*, const ProcessingState&); void PrintParams(std::ostream&, MaglevGraphLabeller*) const {} private: + Representation field_representation_; ZoneVector access_infos_; };