| Index: src/compiler/bytecode-graph-builder.cc
|
| diff --git a/src/compiler/bytecode-graph-builder.cc b/src/compiler/bytecode-graph-builder.cc
|
| index 12a5d29d21770df1c39b691df66c3654c3f27946..f4f73f0755d17befbd94d48fc47d9ad7ac3ba02d 100644
|
| --- a/src/compiler/bytecode-graph-builder.cc
|
| +++ b/src/compiler/bytecode-graph-builder.cc
|
| @@ -82,8 +82,8 @@ class BytecodeGraphBuilder::Environment : public ZoneObject {
|
|
|
| bool StateValuesRequireUpdate(Node** state_values, Node** values, int count);
|
| void UpdateStateValues(Node** state_values, Node** values, int count);
|
| - void UpdateStateValuesWithCache(Node** state_values, Node** values,
|
| - int count);
|
| + void UpdateStateValuesWithCache(Node** state_values, Node** values, int count,
|
| + const BitVector* liveness);
|
|
|
| int RegisterToValuesIndex(interpreter::Register the_register) const;
|
|
|
| @@ -108,10 +108,6 @@ class BytecodeGraphBuilder::Environment : public ZoneObject {
|
| Node* accumulator_state_values_;
|
| int register_base_;
|
| int accumulator_base_;
|
| -
|
| - // A working area for writing maybe-dead values to when updating the state
|
| - // values for registers.
|
| - NodeVector state_value_working_area_;
|
| };
|
|
|
|
|
| @@ -132,8 +128,7 @@ BytecodeGraphBuilder::Environment::Environment(BytecodeGraphBuilder* builder,
|
| values_(builder->local_zone()),
|
| parameters_state_values_(nullptr),
|
| registers_state_values_(nullptr),
|
| - accumulator_state_values_(nullptr),
|
| - state_value_working_area_(builder->local_zone()) {
|
| + accumulator_state_values_(nullptr) {
|
| // The layout of values_ is:
|
| //
|
| // [receiver] [parameters] [registers] [accumulator]
|
| @@ -158,8 +153,6 @@ BytecodeGraphBuilder::Environment::Environment(BytecodeGraphBuilder* builder,
|
| // Accumulator
|
| accumulator_base_ = static_cast<int>(values()->size());
|
| values()->push_back(undefined_constant);
|
| -
|
| - state_value_working_area_.resize(register_count_);
|
| }
|
|
|
| BytecodeGraphBuilder::Environment::Environment(
|
| @@ -175,9 +168,7 @@ BytecodeGraphBuilder::Environment::Environment(
|
| registers_state_values_(nullptr),
|
| accumulator_state_values_(nullptr),
|
| register_base_(other->register_base_),
|
| - accumulator_base_(other->accumulator_base_),
|
| - // Environments can share their working area.
|
| - state_value_working_area_(other->state_value_working_area_) {
|
| + accumulator_base_(other->accumulator_base_) {
|
| values_ = other->values_;
|
| }
|
|
|
| @@ -398,15 +389,15 @@ void BytecodeGraphBuilder::Environment::UpdateStateValues(Node** state_values,
|
| Node** values,
|
| int count) {
|
| if (StateValuesRequireUpdate(state_values, values, count)) {
|
| - const Operator* op = common()->StateValues(count);
|
| + const Operator* op = common()->StateValues(count, SparseInputMask::Dense());
|
| (*state_values) = graph()->NewNode(op, count, values);
|
| }
|
| }
|
|
|
| void BytecodeGraphBuilder::Environment::UpdateStateValuesWithCache(
|
| - Node** state_values, Node** values, int count) {
|
| + Node** state_values, Node** values, int count, const BitVector* liveness) {
|
| *state_values = builder_->state_values_cache_.GetNodeForValues(
|
| - values, static_cast<size_t>(count));
|
| + values, static_cast<size_t>(count), liveness);
|
| }
|
|
|
| Node* BytecodeGraphBuilder::Environment::Checkpoint(
|
| @@ -415,31 +406,17 @@ Node* BytecodeGraphBuilder::Environment::Checkpoint(
|
| UpdateStateValues(¶meters_state_values_, &values()->at(0),
|
| parameter_count());
|
|
|
| - if (liveness) {
|
| - Node* optimized_out = builder()->jsgraph()->OptimizedOutConstant();
|
| -
|
| - for (int i = 0; i < register_count(); ++i) {
|
| - state_value_working_area_[i] = liveness->RegisterIsLive(i)
|
| - ? values()->at(register_base() + i)
|
| - : optimized_out;
|
| - }
|
| -
|
| - Node* accumulator_value = liveness->AccumulatorIsLive()
|
| - ? values()->at(accumulator_base())
|
| - : optimized_out;
|
| -
|
| - UpdateStateValuesWithCache(®isters_state_values_,
|
| - state_value_working_area_.data(),
|
| - register_count());
|
| -
|
| - UpdateStateValues(&accumulator_state_values_, &accumulator_value, 1);
|
| - } else {
|
| - UpdateStateValuesWithCache(®isters_state_values_,
|
| - &values()->at(register_base()),
|
| - register_count());
|
| - UpdateStateValues(&accumulator_state_values_,
|
| - &values()->at(accumulator_base()), 1);
|
| - }
|
| + // TODO(leszeks): We should pass a view of the liveness bitvector here, with
|
| + // offset and count, rather than passing the entire bitvector and assuming
|
| + // that register liveness starts at offset 0.
|
| + UpdateStateValuesWithCache(®isters_state_values_,
|
| + &values()->at(register_base()), register_count(),
|
| + liveness ? &liveness->bit_vector() : nullptr);
|
| +
|
| + Node* accumulator_value = liveness == nullptr || liveness->AccumulatorIsLive()
|
| + ? values()->at(accumulator_base())
|
| + : builder()->jsgraph()->OptimizedOutConstant();
|
| + UpdateStateValues(&accumulator_state_values_, &accumulator_value, 1);
|
|
|
| const Operator* op = common()->FrameState(
|
| bailout_id, combine, builder()->frame_state_function_info());
|
|
|