23bool IsRename(Node* node) {
24 switch (node->opcode()) {
25 case IrOpcode::kCheckHeapObject:
26 case IrOpcode::kFinishRegion:
27 case IrOpcode::kTypeGuard:
28 return !node->IsDead();
34Node* ResolveRenames(Node* node) {
35 while (IsRename(node)) {
36 node = node->InputAt(0);
41bool MayAlias(Node* a, Node* b) {
45 }
else if (IsRename(b)) {
46 return MayAlias(a, b->InputAt(0));
47 }
else if (IsRename(a)) {
48 return MayAlias(a->InputAt(0), b);
49 }
else if (b->opcode() == IrOpcode::kAllocate) {
50 switch (a->opcode()) {
51 case IrOpcode::kAllocate:
52 case IrOpcode::kHeapConstant:
53 case IrOpcode::kParameter:
58 }
else if (a->opcode() == IrOpcode::kAllocate) {
59 switch (b->opcode()) {
60 case IrOpcode::kHeapConstant:
61 case IrOpcode::kParameter:
71bool MustAlias(Node* a, Node* b) {
72 return ResolveRenames(a) == ResolveRenames(b);
78 if (
v8_flags.trace_turbo_load_elimination) {
79 if (node->op()->EffectInputCount() > 0) {
80 PrintF(
" visit #%d:%s", node->id(), node->op()->mnemonic());
81 if (node->op()->ValueInputCount() > 0) {
83 for (
int i = 0;
i < node->op()->ValueInputCount(); ++
i) {
86 PrintF(
"#%d:%s", value->id(), value->op()->mnemonic());
91 for (
int i = 0;
i < node->op()->EffectInputCount(); ++
i) {
94 PrintF(
" state[%i]: #%d:%s\n",
i, effect->
id(),
95 effect->op()->mnemonic());
98 PrintF(
" no state[%i]: #%d:%s\n",
i, effect->
id(),
99 effect->op()->mnemonic());
104 switch (node->opcode()) {
105 case IrOpcode::kMapGuard:
107 case IrOpcode::kCheckMaps:
109 case IrOpcode::kCompareMaps:
111 case IrOpcode::kEnsureWritableFastElements:
113 case IrOpcode::kMaybeGrowFastElements:
115 case IrOpcode::kTransitionElementsKind:
117 case IrOpcode::kTransitionElementsKindOrCheckMap:
119 case IrOpcode::kLoadField:
121 case IrOpcode::kStoreField:
123 case IrOpcode::kLoadElement:
125 case IrOpcode::kStoreElement:
127 case IrOpcode::kTransitionAndStoreElement:
129 case IrOpcode::kStoreTypedElement:
131 case IrOpcode::kEffectPhi:
133 case IrOpcode::kDead:
135 case IrOpcode::kStart:
146 if (r1 == r2)
return true;
152LoadElimination::AbstractState
const
158 if (element.object ==
nullptr)
continue;
161 if (MustAlias(
object, element.object) && MustAlias(index, element.index) &&
162 IsCompatible(representation, element.representation)) {
163 return element.value;
173 if (element.object ==
nullptr)
continue;
174 if (MayAlias(
object, element.object)) {
176 for (
Element const element2 : this->elements_) {
177 if (element2.object ==
nullptr)
continue;
180 if (!MayAlias(
object, element2.object) ||
183 that->elements_[that->next_index_++] = element2;
195 if (
this == that)
return true;
198 if (this_element.
object ==
nullptr)
continue;
199 for (
size_t j = 0;; ++j) {
201 Element that_element = that->elements_[j];
210 Element that_element = that->elements_[
i];
211 if (that_element.
object ==
nullptr)
continue;
212 for (
size_t j = 0;; ++j) {
228 if (this->Equals(that))
return this;
231 if (this_element.object ==
nullptr)
continue;
232 for (
Element const that_element : that->elements_) {
233 if (this_element.object == that_element.
object &&
234 this_element.index == that_element.
index &&
235 this_element.value == that_element.
value) {
247 if (element.object) {
248 PrintF(
" #%d:%s @ #%d:%s -> #%d:%s\n", element.object->id(),
249 element.object->op()->mnemonic(), element.index->id(),
250 element.index->op()->mnemonic(), element.value->id(),
251 element.value->op()->mnemonic());
257 Node*
object)
const {
258 for (
auto& pair : info_for_node_) {
259 if (pair.first->IsDead())
continue;
260 if (MustAlias(
object, pair.first))
return &pair.second;
268 if (!
x.address())
return true;
269 if (!
y.address())
return true;
270 if (
x.address() !=
y.address())
return false;
283 bool MayAlias(
Node* other)
const;
293 for (
auto info1 : this->info_for_node_) {
294 if (info1.first->IsDead())
continue;
300 if (MustAlias(
object, info1.first)) {
302 for (
auto info2 : this->info_for_node_) {
303 if (!MustAlias(
object, info2.first)) {
304 that->info_for_node_.insert(info2);
316 for (
auto info1 : this->info_for_node_) {
317 if (info1.first->IsDead())
continue;
318 if (alias_info.
MayAlias(info1.first)) {
320 for (
auto info2 : this->info_for_node_) {
321 if (!alias_info.
MayAlias(info2.first) ||
322 !MayAlias(name, info2.second.name)) {
323 that->info_for_node_.insert(info2);
333 for (
auto pair : info_for_node_) {
334 PrintF(
" #%d:%s -> #%d:%s [repr=%s]\n", pair.first->id(),
335 pair.first->op()->mnemonic(), pair.second.value->id(),
336 pair.second.value->op()->mnemonic(),
342 : info_for_node_(
zone) {}
346 : info_for_node_(
zone) {
347 object = ResolveRenames(
object);
353 auto it = info_for_node_.find(ResolveRenames(
object));
354 if (it == info_for_node_.end())
return false;
355 *object_maps = it->second;
361 for (
auto info1 : this->info_for_node_) {
362 if (alias_info.
MayAlias(info1.first)) {
364 for (
auto info2 : this->info_for_node_) {
365 if (!alias_info.
MayAlias(info2.first))
366 that->info_for_node_.insert(info2);
376 if (this->Equals(that))
return this;
378 for (
auto this_it : this->info_for_node_) {
379 Node* this_object = this_it.first;
381 auto that_it = that->info_for_node_.find(this_object);
382 if (that_it != that->info_for_node_.end() && that_it->second == this_maps) {
395 that->info_for_node_.erase(that->info_for_node_.begin());
397 object = ResolveRenames(
object);
398 that->info_for_node_[object] = maps;
405 for (
auto pair : info_for_node_) {
406 os <<
" #" << pair.first->id() <<
":" << pair.first->op()->mnemonic()
409 for (
size_t i = 0;
i < maps.
size(); ++
i) {
410 os <<
" - " <<
Brief(*maps[
i].
object()) << std::endl;
418 for (
size_t i = 0u;
i < this_fields.size(); ++
i) {
422 if (!that_field || !that_field->
Equals(this_field))
return false;
423 }
else if (that_field) {
435 }
else if (that->elements_) {
438 if (!FieldsEquals(this->fields_, that->fields_) ||
439 !FieldsEquals(this->const_fields_, that->const_fields_)) {
443 if (!that->maps_ || !that->maps_->Equals(this->maps_)) {
446 }
else if (that->maps_) {
455 for (
size_t i = 0;
i < this_fields->size(); ++
i) {
458 if (that_fields[
i]) {
459 this_field = this_field->
Merge(that_fields[
i],
zone, &fields_count_);
461 this_field =
nullptr;
478 FieldsMerge(&this->const_fields_, that->const_fields_,
zone);
479 const_fields_count_ = fields_count_;
480 FieldsMerge(&this->fields_, that->fields_,
zone);
484 this->maps_ = that->maps_ ? that->maps_->Merge(this->maps_,
zone) :
nullptr;
490 return this->maps_ && this->maps_->Lookup(
object, object_map);
497 that->maps_ = that->maps_->Extend(
object, maps,
zone);
508 if (this->maps_ != that_maps) {
510 that->
maps_ = that_maps;
520 return KillMaps(alias_info,
zone);
526 return this->
elements_->Lookup(
object, index, representation);
537 if (that->elements_) {
539 that->elements_->Extend(
object, index, value, representation,
zone);
566 bool is_const = info.const_field_info.IsConst();
568 for (
int index : index_range) {
569 int count_before = fields[
index] ? fields[
index]->count() : 0;
572 fields[
index]->Extend(
object, info,
zone, that->fields_count_);
576 int added = fields[
index]->count() - count_before;
577 if (is_const) that->const_fields_count_ += added;
578 that->fields_count_ += added;
589 for (
int index : index_range) {
590 if (
AbstractField const* this_field = this->const_fields_[index]) {
591 this_field = this_field->KillConst(
object,
zone);
592 if (this->const_fields_[index] != this_field) {
595 int removed = this->const_fields_[
index]->count() -
596 that->const_fields_[
index]->count();
597 that->const_fields_count_ -= removed;
598 that->fields_count_ -= removed;
602 return that ? that :
this;
609 return KillField(alias_info, index_range, name,
zone);
616 for (
int index : index_range) {
617 if (
AbstractField const* this_field = this->fields_[index]) {
618 this_field = this_field->Kill(alias_info, name,
zone);
619 if (this->fields_[index] != this_field) {
623 this->fields_[
index]->count() - that->fields_[
index]->count();
624 that->fields_count_ -= removed;
628 return that ? that :
this;
635 for (
size_t i = 0;; ++
i) {
636 if (
i == fields_.
size()) {
641 this_field->
Kill(alias_info, name,
zone);
642 if (that_field != this_field) {
645 while (++
i < fields_.
size()) {
646 if (this->fields_[
i] !=
nullptr) {
647 that->fields_[
i] = this->fields_[
i]->Kill(alias_info, name,
zone);
648 int removed = this->fields_[
i]->count() - that->fields_[
i]->count();
649 that->fields_count_ -= removed;
661 for (
size_t i = 0;
i < const_fields_.
size(); ++
i) {
662 if (const_fields_[
i]) {
665 that->const_fields_count_ = const_fields_count_;
666 that->fields_count_ = const_fields_count_;
678 std::optional<LoadElimination::FieldInfo const*>
result;
679 for (
int index : index_range) {
681 if (const_field_info.
IsConst()) {
682 if (
AbstractField const* this_field = const_fields_[index]) {
683 info = this_field->Lookup(
object);
685 if (!(info && info->const_field_info == const_field_info))
return nullptr;
688 info = this_field->Lookup(
object);
690 if (!info)
return nullptr;
692 if (!
result.has_value()) {
694 }
else if (**
result != *info) {
710 if (
object_->opcode() == IrOpcode::kAllocate) {
714 if (!compiler::MayAlias(
object_, other)) {
718 if (
map_.has_value()) {
721 if (
state_->LookupMaps(other, &other_maps) && other_maps.
size() == 1) {
722 if (map != other_maps.
at(0)) {
739 for (
size_t i = 0;
i < fields_.
size(); ++
i) {
745 for (
size_t i = 0;
i < const_fields_.
size(); ++
i) {
747 PrintF(
" const field %zu:\n",
i);
748 const_field->Print();
755 size_t const id = node->id();
756 if (
id < info_for_node_.size())
return info_for_node_[id];
762 size_t const id = node->id();
763 if (
id >= info_for_node_.size()) info_for_node_.resize(
id + 1,
nullptr);
764 info_for_node_[id] =
state;
772 if (state ==
nullptr)
return NoChange();
774 if (state->LookupMaps(
object, &object_maps)) {
775 if (maps.contains(object_maps))
return Replace(effect);
778 state = state->SetMaps(
object, maps,
zone());
787 if (state ==
nullptr)
return NoChange();
789 if (state->LookupMaps(
object, &object_maps)) {
790 if (maps.contains(object_maps))
return Replace(effect);
793 state = state->SetMaps(
object, maps,
zone());
802 if (state ==
nullptr)
return NoChange();
804 if (state->LookupMaps(
object, &object_maps)) {
805 if (maps.contains(object_maps)) {
807 ReplaceWithValue(node, value, effect);
808 return Replace(value);
820 if (state ==
nullptr)
return NoChange();
824 if (state->LookupMaps(elements, &elements_maps) &&
825 fixed_array_maps.
contains(elements_maps)) {
826 ReplaceWithValue(node, elements, effect);
827 return Replace(elements);
830 state = state->SetMaps(node, fixed_array_maps,
zone());
832 state = state->KillField(
object,
836 state = state->AddField(
847 if (state ==
nullptr)
return NoChange();
850 state = state->SetMaps(
857 state = state->SetMaps(node, fixed_array_maps,
zone());
860 state = state->KillField(
object,
864 state = state->AddField(
877 if (state ==
nullptr)
return NoChange();
878 switch (transition.
mode()) {
884 state = state->KillField(
890 if (state->LookupMaps(
object, &object_maps)) {
894 return Replace(effect);
900 state = state->KillMaps(alias_info,
zone());
901 state = state->SetMaps(
object, object_maps,
zone());
905 state = state->KillMaps(alias_info,
zone());
918 if (state ==
nullptr)
return NoChange();
919 for (
MapRef source_map : source_maps) {
924 state = state->KillField(
931 if (state->LookupMaps(
object, &object_maps)) {
935 return Replace(effect);
937 for (
MapRef source_map : source_maps) {
942 state = state->KillMaps(alias_info,
zone());
943 state = state->SetMaps(
object, object_maps,
zone());
947 for (
MapRef source_map : source_maps) {
949 state = state->KillMaps(alias_info,
zone());
962 if (state ==
nullptr)
return NoChange();
968 if (state->LookupMaps(
object, &object_maps)) {
971 state = state->KillMaps(
object,
zone());
972 state = state->SetMaps(
object, object_maps,
zone());
975 state = state->KillField(
object,
987 if (state ==
nullptr)
return NoChange();
992 if (state->LookupMaps(
object, &object_maps) && object_maps.
size() == 1) {
995 ReplaceWithValue(node, value, effect);
996 return Replace(value);
1002 access.machine_type.representation();
1004 state->LookupField(
object, field_index, access.const_field_info);
1011 if (lookup_result) {
1014 Node* replacement = lookup_result->
value;
1015 if (IsCompatible(representation, lookup_result->
representation) &&
1016 !replacement->
IsDead()) {
1024 replacement = effect =
1026 replacement, effect, control);
1029 ReplaceWithValue(node, replacement, effect);
1030 return Replace(replacement);
1034 access.const_field_info);
1035 state = state->AddField(
object, field_index, info,
zone());
1038 if (access.map.has_value()) {
1050 if (state ==
nullptr)
return NoChange();
1055 state = state->KillMaps(
object,
zone());
1061 state = state->SetMaps(
object, object_maps,
zone());
1066 bool is_const_store = access.const_field_info.IsConst();
1068 access.machine_type.representation();
1070 state->LookupField(
object, field_index, access.const_field_info);
1072 if (lookup_result &&
1085 bool incompatible_representation =
1086 !lookup_result->
name.is_null() &&
1088 bool illegal_double_const_store =
1089 is_const_store && !access.is_store_in_literal;
1090 if (incompatible_representation || illegal_double_const_store) {
1094 return Replace(unreachable);
1096 if (lookup_result->
value == new_value) {
1098 return Replace(effect);
1103 FieldInfo new_info(new_value, representation, access.name,
1104 access.const_field_info);
1105 if (is_const_store && access.is_store_in_literal) {
1109 state = state->KillConstField(
object, field_index,
zone());
1111 state = state->KillField(
object, field_index, access.name,
zone());
1112 state = state->AddField(
object, field_index, new_info,
zone());
1113 if (is_const_store) {
1118 state = state->AddField(
object, field_index, new_info,
zone());
1122 state = state->KillFields(
object, access.name,
zone());
1133 if (state ==
nullptr)
return NoChange();
1137 switch (access.machine_type.representation()) {
1161 if (
Node* replacement = state->LookupElement(
1162 object, index, access.machine_type.representation())) {
1171 ReplaceWithValue(node, replacement, effect);
1172 return Replace(replacement);
1175 state = state->AddElement(
object, index, node,
1176 access.machine_type.representation(),
zone());
1189 if (state ==
nullptr)
return NoChange();
1190 Node*
const old_value =
1191 state->LookupElement(
object, index, access.machine_type.representation());
1192 if (old_value == new_value) {
1194 return Replace(effect);
1197 state = state->KillElement(
object, index,
zone());
1199 switch (access.machine_type.representation()) {
1223 state = state->AddElement(
object, index, new_value,
1224 access.machine_type.representation(),
zone());
1233 if (state ==
nullptr)
return NoChange();
1239 int predecessor_count = phi->InputCount() - 1;
1247 if (!input_state->
LookupMaps(phi->InputAt(0), &object_maps))
return state;
1248 for (
int i = 1;
i < predecessor_count;
i++) {
1253 if (input_maps != object_maps)
return state;
1255 return state->SetMaps(phi, object_maps,
zone());
1262 if (state0 ==
nullptr)
return NoChange();
1263 if (control->
opcode() == IrOpcode::kLoop) {
1273 int const input_count = node->op()->EffectInputCount();
1274 for (
int i = 1;
i < input_count; ++
i) {
1282 for (
int i = 1;
i < input_count; ++
i) {
1290 for (
Node* use : control->
uses()) {
1291 if (use->opcode() == IrOpcode::kPhi) {
1304 if (node->op()->EffectInputCount() == 1) {
1305 if (node->op()->EffectOutputCount() == 1) {
1311 if (state ==
nullptr)
return NoChange();
1314 state = state->KillAll(
zone());
1322 DCHECK_EQ(0, node->op()->EffectInputCount());
1323 DCHECK_EQ(0, node->op()->EffectOutputCount());
1331 if (state != original) {
1332 if (original ==
nullptr || !state->
Equals(original)) {
1334 return Changed(node);
1347 state = state->KillMaps(
object,
zone());
1351 state = state->KillFields(
object, access.name,
zone());
1353 state = state->KillField(
object, field_index, access.name,
zone());
1362 struct TransitionElementsKindInfo {
1368 Zone temp_zone(
zone()->allocator(),
"Temporary scoped zone");
1372 visited.insert(node);
1374 queue.push(node->InputAt(
i));
1376 while (!queue.empty()) {
1377 Node*
const current = queue.front();
1379 if (visited.find(current) == visited.end()) {
1380 visited.insert(current);
1382 switch (current->opcode()) {
1383 case IrOpcode::kEnsureWritableFastElements: {
1385 state = state->KillField(
1390 case IrOpcode::kMaybeGrowFastElements: {
1392 state = state->KillField(
1397 case IrOpcode::kTransitionElementsKind: {
1401 if (!state->LookupMaps(
object, &object_maps) ||
1403 element_transitions_.
push_back({transition,
object});
1407 case IrOpcode::kTransitionElementsKindOrCheckMap: {
1413 if (!state->LookupMaps(
object, &object_maps) ||
1418 target.elements_kind())
1427 case IrOpcode::kTransitionAndStoreElement: {
1430 state = state->KillMaps(
object,
zone());
1432 state = state->KillField(
1437 case IrOpcode::kStoreField: {
1442 case IrOpcode::kStoreElement: {
1445 state = state->KillElement(
object, index,
zone());
1448 case IrOpcode::kCheckMaps:
1449 case IrOpcode::kStoreTypedElement: {
1454 return state->KillAll(
zone());
1457 for (
int i = 0;
i < current->op()->EffectInputCount(); ++
i) {
1487 for (
const TransitionElementsKindInfo& t : element_transitions_) {
1488 AliasStateInfo alias_info(state, t.object, t.transition.source());
1489 state = state->KillMaps(alias_info,
zone());
1491 for (
const TransitionElementsKindInfo& t : element_transitions_) {
1492 switch (t.transition.mode()) {
1496 AliasStateInfo alias_info(state, t.object, t.transition.source());
1497 state = state->KillField(
1509 int offset,
int representation_size) {
1561 return FieldIndexOf(access.offset, representation_size);
static constexpr int kMapOffset
void remove(T handle, Zone *zone)
void insert(T handle, Zone *zone)
bool contains(ZoneCompactSet< T > const &other) const
void push_back(const T &value)
ZoneRefSet< Map > const & maps() const
const ZoneRefSet< Map > & sources() const
Node * HeapConstantNoHole(Handle< HeapObject > value)
Isolate * isolate() const
Factory * factory() const
Node * Lookup(Node *object, Node *index, MachineRepresentation representation) const
bool Equals(AbstractElements const *that) const
Element elements_[kMaxTrackedElements]
AbstractElements const * Merge(AbstractElements const *that, Zone *zone) const
AbstractElements const * Kill(Node *object, Node *index, Zone *zone) const
bool Equals(AbstractField const *that) const
AbstractField const * KillConst(Node *object, Zone *zone) const
AbstractField const * Kill(const AliasStateInfo &alias_info, MaybeHandle< Name > name, Zone *zone) const
FieldInfo const * Lookup(Node *object) const
AbstractField const * Merge(AbstractField const *that, Zone *zone, int *count) const
bool Lookup(Node *object, ZoneRefSet< Map > *object_maps) const
AbstractMaps const * Merge(AbstractMaps const *that, Zone *zone) const
AbstractMaps const * Kill(const AliasStateInfo &alias_info, Zone *zone) const
ZoneMap< Node *, ZoneRefSet< Map > > info_for_node_
AbstractMaps const * Extend(Node *object, ZoneRefSet< Map > maps, Zone *zone) const
void Set(Node *node, AbstractState const *state)
AbstractState const * Get(Node *node) const
AbstractState const * KillMaps(Node *object, Zone *zone) const
AbstractState const * KillAll(Zone *zone) const
FieldInfo const * LookupField(Node *object, IndexRange index, ConstFieldInfo const_field_info) const
void FieldsMerge(AbstractFields *this_fields, AbstractFields const &that_fields, Zone *zone)
AbstractFields const_fields_
AbstractElements const * elements_
bool LookupMaps(Node *object, ZoneRefSet< Map > *object_maps) const
AbstractState const * KillField(const AliasStateInfo &alias_info, IndexRange index, MaybeHandle< Name > name, Zone *zone) const
AbstractState const * AddField(Node *object, IndexRange index, FieldInfo info, Zone *zone) const
std::array< AbstractField const *, kMaxTrackedFieldsPerObject > AbstractFields
AbstractState const * KillFields(Node *object, MaybeHandle< Name > name, Zone *zone) const
AbstractState const * KillConstField(Node *object, IndexRange index_range, Zone *zone) const
void Merge(AbstractState const *that, Zone *zone)
AbstractState const * KillElement(Node *object, Node *index, Zone *zone) const
AbstractState const * AddElement(Node *object, Node *index, Node *value, MachineRepresentation representation, Zone *zone) const
static AbstractState const empty_state_
AbstractState const * SetMaps(Node *object, ZoneRefSet< Map > maps, Zone *zone) const
Node * LookupElement(Node *object, Node *index, MachineRepresentation representation) const
AbstractMaps const * maps_
bool FieldsEquals(AbstractFields const &this_fields, AbstractFields const &that_fields) const
bool Equals(AbstractState const *that) const
AliasStateInfo(const AbstractState *state, Node *object)
AliasStateInfo(const AbstractState *state, Node *object, MapRef map)
bool MayAlias(Node *other) const
const AbstractState * state_
static IndexRange Invalid()
Reduction ReduceMapGuard(Node *node)
JSGraph * jsgraph() const
AbstractStateForEffectNodes node_states_
static size_t const kMaxTrackedObjects
AbstractState const * ComputeLoopStateForStoreField(Node *current, LoadElimination::AbstractState const *state, FieldAccess const &access) const
static IndexRange FieldIndexOf(int offset, int representation_size)
Reduction ReduceMaybeGrowFastElements(Node *node)
Reduction ReduceTransitionElementsKindOrCheckMap(Node *node)
Reduction ReduceEffectPhi(Node *node)
Reduction ReduceStart(Node *node)
CommonOperatorBuilder * common() const
Isolate * isolate() const
Reduction UpdateState(Node *node, AbstractState const *state)
JSHeapBroker * broker() const
Reduction ReduceCompareMaps(Node *node)
Reduction ReduceStoreTypedElement(Node *node)
AbstractState const * UpdateStateForPhi(AbstractState const *state, Node *effect_phi, Node *phi)
Reduction ReduceStoreElement(Node *node)
Reduction ReduceTransitionElementsKind(Node *node)
Reduction ReduceLoadElement(Node *node)
Factory * factory() const
Reduction ReduceStoreField(Node *node, FieldAccess const &access)
Reduction ReduceTransitionAndStoreElement(Node *node)
AbstractState const * ComputeLoopState(Node *node, AbstractState const *state) const
Reduction Reduce(Node *node) final
Reduction ReduceEnsureWritableFastElements(Node *node)
Reduction ReduceCheckMaps(Node *node)
static AbstractState const * empty_state()
Reduction ReduceOtherNode(Node *node)
Reduction ReduceLoadField(Node *node, FieldAccess const &access)
CommonOperatorBuilder * common() const
ElementsKind elements_kind() const
static Type GetType(const Node *node)
static Node * GetEffectInput(Node *node, int index=0)
static Node * GetValueInput(Node *node, int index)
static void SetType(Node *node, Type type)
static Node * GetControlInput(Node *node, int index=0)
constexpr IrOpcode::Value opcode() const
Node * NewNode(const Operator *op, int input_count, Node *const *inputs, bool incomplete=false)
bool Maybe(Type that) const
bool IsHeapConstant() const
const HeapConstantType * AsHeapConstant() const
static Type Intersect(Type type1, Type type2, Zone *zone)
Handle< SharedFunctionInfo > info
enum v8::internal::@1270::DeoptimizableCodeIterator::@67 state_
#define V8_ENABLE_DOUBLE_CONST_STORE_CHECK_BOOL
Handle< FixedArray > elements_
ZoneVector< RpoNumber > & result
LiftoffAssembler::CacheState state
const GrowFastElementsParameters & GrowFastElementsParametersOf(const Operator *op)
CheckMapsParameters const & CheckMapsParametersOf(Operator const *op)
ZoneRefSet< Map > const & MapGuardMapsOf(Operator const *op)
const FieldAccess & FieldAccessOf(const Operator *op)
const ElementAccess & ElementAccessOf(const Operator *op)
ZoneRefSet< Map > const & CompareMapsParametersOf(Operator const *op)
MapRef FastMapParameterOf(const Operator *op)
ElementsTransitionWithMultipleSources const & ElementsTransitionWithMultipleSourcesOf(const Operator *op)
ElementsTransition const & ElementsTransitionOf(const Operator *op)
MapRef DoubleMapParameterOf(const Operator *op)
constexpr int kTaggedSize
bool Is(IndirectHandle< U > value)
void PrintF(const char *format,...)
constexpr bool IsAnyTagged(MachineRepresentation rep)
bool IsSimpleMapChangeTransition(ElementsKind from_kind, ElementsKind to_kind)
const char * MachineReprToString(MachineRepresentation rep)
V8_EXPORT_PRIVATE FlagValues v8_flags
V8_EXPORT_PRIVATE constexpr int ElementSizeInBytes(MachineRepresentation)
#define DCHECK_NOT_NULL(val)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
constexpr bool IsAligned(T value, U alignment)
static ConstFieldInfo None()
MachineRepresentation representation
ConstFieldInfo const_field_info