11namespace interpreter {
105 if (reset_variable_hint) {
148 next_->prev_ =
prev_;
149 prev_->next_ = next_;
150 next_ =
prev_ =
this;
154 type_hint_ = TypeHint::kAny;
159 return this->next_ ==
this;
170 }
while (it != info);
176 return info->variable_hint().variable;
190 return info->type_hint();
211 return equivalence_id() == info->equivalence_id();
221 visitor = visitor->
next_;
222 }
while (visitor !=
this);
234 visitor = visitor->
next_;
235 }
while (visitor !=
this);
248 visitor = visitor->
next_;
249 }
while (visitor !=
this);
256 DCHECK(this->materialized());
259 while (visitor !=
this) {
264 (best_info ==
nullptr ||
268 visitor = visitor->
next_;
275 DCHECK(this->register_value() < temporary_base);
276 DCHECK(this->materialized());
278 while (visitor !=
this) {
282 visitor = visitor->
next_;
333 if (!
reg->needs_flush()) {
334 reg->set_needs_flush(
true);
341 if (reg_info->needs_flush()) {
343 }
else if (!reg_info->IsOnlyMemberOfEquivalenceSet()) {
345 }
else if (reg_info->allocated() && !reg_info->materialized()) {
359 if (!reg_info->needs_flush())
continue;
360 reg_info->set_needs_flush(
false);
361 reg_info->flush_variable_hint(
false);
362 reg_info->set_type_hint(TypeHint::kAny);
366 : reg_info->GetMaterializedEquivalent();
368 if (materialized !=
nullptr) {
373 while ((equivalent = materialized->
GetEquivalent()) != materialized) {
401 DCHECK_NE(input.index(), output.index());
418 DCHECK(info->materialized());
420 if (unmaterialized) {
428 if (info->materialized()) {
442 if (!info->materialized()) {
458 bool output_is_observable =
460 bool in_same_equivalence_set =
462 if (in_same_equivalence_set &&
463 (!output_is_observable || output_info->
materialized())) {
474 if (!in_same_equivalence_set) {
478 if (output_is_observable) {
486 if (input_is_observable) {
545 size_t new_size = index + 1;
548 for (
size_t i = old_size;
i < new_size; ++
i) {
557 info->set_allocated(
true);
558 if (!info->materialized()) {
static bool IsSameOrSubTypeHint(TypeHint hint1, TypeHint hint2)
void set_observer(Observer *observer)
virtual void EmitStar(Register output)=0
virtual void EmitMov(Register input, Register output)=0
virtual void EmitLdar(Register input)=0
RegisterInfo * GetAllocatedEquivalent()
void set_variable_hint(VariableHint hint)
void MoveToNewEquivalenceSet(uint32_t equivalence_id, MaterializedInfo materialized, ResetVariableHint reset=ResetVariableHint::kReset)
Register register_value() const
RegisterInfo * GetMaterializedEquivalent()
void set_needs_flush(bool needs_flush)
RegisterInfo(Register reg, uint32_t equivalence_id, bool materialized, bool allocated)
void flush_variable_hint(bool reset_variable_hint)
void set_equivalence_id(uint32_t equivalence_id)
RegisterInfo * next() const
uint32_t equivalence_id() const
void set_type_hint(TypeHint hint)
RegisterInfo * GetMaterializedEquivalentOtherThan(Register reg)
RegisterInfo & operator=(const RegisterInfo &)=delete
TypeHint type_hint() const
void set_allocated(bool allocated)
bool IsInSameEquivalenceSet(RegisterInfo *info) const
bool materialized() const
RegisterInfo * GetEquivalentToMaterialize()
VariableHint variable_hint_
RegisterInfo(const RegisterInfo &)=delete
RegisterInfo * GetEquivalent()
void MarkTemporariesAsUnmaterialized(Register temporary_base)
bool IsOnlyMemberOfEquivalenceSet() const
VariableHint variable_hint() const
void set_materialized(bool materialized)
void AddToEquivalenceSetOf(RegisterInfo *info)
ZoneDeque< RegisterInfo * > registers_needing_flushed_
TypeHint GetTypeHint(Register reg)
RegisterInfo * accumulator_info_
void RegisterTransfer(RegisterInfo *input, RegisterInfo *output)
RegisterInfo * GetOrCreateRegisterInfo(Register reg)
void Materialize(RegisterInfo *info)
Variable * GetPotentialVariableInRegister(Register reg)
size_t GetRegisterInfoTableIndex(Register reg) const
void RegisterFreeEvent(Register reg) override
const Register temporary_base_
void ResetTypeHintForAccumulator()
bool RegisterIsObservable(Register reg) const
static const uint32_t kInvalidEquivalenceId
Register RegisterFromRegisterInfoTableIndex(size_t index) const
RegisterList GetInputRegisterList(RegisterList reg_list)
BytecodeGenerator::TypeHint TypeHint
bool EnsureAllRegistersAreFlushed() const
void CreateMaterializedEquivalent(RegisterInfo *info)
bool IsAccumulatorReset()
void AddToEquivalenceSet(RegisterInfo *set_member, RegisterInfo *non_set_member)
ZoneVector< RegisterInfo * > register_info_table_
void GrowRegisterMap(Register reg)
int register_info_table_offset_
void PushToRegistersNeedingFlush(RegisterInfo *reg)
void SetTypeHintForAccumulator(TypeHint hint)
void PrepareOutputRegisterList(RegisterList reg_list)
void SetVariableInRegister(Variable *var, Register reg)
Register GetInputRegister(Register reg)
RegisterInfo * GetRegisterInfo(Register reg)
void OutputRegisterTransfer(RegisterInfo *input, RegisterInfo *output)
void PrepareOutputRegister(Register reg)
RegisterInfo * GetMaterializedEquivalentNotAccumulator(RegisterInfo *info)
uint32_t NextEquivalenceId()
bool IsVariableInRegister(Variable *var, Register reg)
BytecodeRegisterOptimizer(Zone *zone, BytecodeRegisterAllocator *register_allocator, int fixed_registers_count, int parameter_count, BytecodeWriter *bytecode_writer)
void AllocateRegister(RegisterInfo *info)
void RegisterListFreeEvent(RegisterList reg) override
BytecodeWriter * bytecode_writer_
void RegisterAllocateEvent(Register reg) override
bool RegisterIsTemporary(Register reg) const
void RegisterListAllocateEvent(RegisterList reg_list) override
const Register accumulator_
int register_count() const
const Register first_register() const
static constexpr Register FromParameterIndex(int index)
constexpr int index() const
Handle< SharedFunctionInfo > info
ZoneVector< RpoNumber > & result
constexpr uint32_t kMaxUInt32
#define DCHECK_NOT_NULL(val)
#define DCHECK_NE(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)