Index: src/compiler/bytecode-graph-builder.h |
diff --git a/src/compiler/bytecode-graph-builder.h b/src/compiler/bytecode-graph-builder.h |
index bbc504d7931826c080cc12fd31090d88f3be1cb8..03edcacbdee6a3f491f8c246789aad2e09021e61 100644 |
--- a/src/compiler/bytecode-graph-builder.h |
+++ b/src/compiler/bytecode-graph-builder.h |
@@ -28,7 +28,13 @@ class BytecodeGraphBuilder { |
Graph* graph() const { return jsgraph_->graph(); } |
private: |
+ enum class AccumulatorUpdateMode { |
+ kOutputIgnored, |
+ kOutputInAccumulator, |
+ }; |
+ |
class Environment; |
+ class FrameStateBeforeAndAfter; |
void CreateGraphBody(bool stack_check); |
void VisitBytecodes(); |
@@ -58,9 +64,6 @@ class BytecodeGraphBuilder { |
// a feedback slot. |
VectorSlotPair CreateVectorSlotPair(int slot_id); |
- // Replaces the frame state inputs with empty frame states. |
- void AddEmptyFrameStateInputs(Node* node); |
- |
void set_environment(Environment* env) { environment_ = env; } |
const Environment* environment() const { return environment_; } |
Environment* environment() { return environment_; } |
@@ -127,7 +130,8 @@ class BytecodeGraphBuilder { |
interpreter::Register first_arg, |
size_t arity); |
- void BuildCreateLiteral(const Operator* op); |
+ void BuildCreateLiteral(const Operator* op, |
+ const interpreter::BytecodeArrayIterator& iterator); |
void BuildCreateRegExpLiteral( |
const interpreter::BytecodeArrayIterator& iterator); |
void BuildCreateArrayLiteral( |
@@ -179,6 +183,9 @@ class BytecodeGraphBuilder { |
const Handle<BytecodeArray>& bytecode_array() const { |
return bytecode_array_; |
} |
+ const FrameStateFunctionInfo* frame_state_function_info() const { |
+ return frame_state_function_info_; |
+ } |
LanguageMode language_mode() const { |
// TODO(mythria): Don't rely on parse information to get language mode. |
@@ -211,10 +218,12 @@ class BytecodeGraphBuilder { |
CompilationInfo* info_; |
JSGraph* jsgraph_; |
Handle<BytecodeArray> bytecode_array_; |
+ const FrameStateFunctionInfo* frame_state_function_info_; |
const interpreter::BytecodeArrayIterator* bytecode_iterator_; |
const BytecodeBranchAnalysis* branch_analysis_; |
Environment* environment_; |
+ |
// Merge environments are snapshots of the environment at a particular |
// bytecode offset to be merged into a later environment. |
ZoneMap<int, Environment*> merge_environments_; |
@@ -253,9 +262,11 @@ class BytecodeGraphBuilder::Environment : public ZoneObject { |
void BindRegister(interpreter::Register the_register, Node* node); |
Node* LookupRegister(interpreter::Register the_register) const; |
- void BindAccumulator(Node* node); |
+ void BindAccumulator(Node* node, FrameStateBeforeAndAfter* states = nullptr); |
Node* LookupAccumulator() const; |
+ void RecordAfterState(Node* node, FrameStateBeforeAndAfter* states); |
+ |
bool IsMarkedAsUnreachable() const; |
void MarkAsUnreachable(); |
@@ -265,6 +276,15 @@ class BytecodeGraphBuilder::Environment : public ZoneObject { |
effect_dependency_ = dependency; |
} |
+ // Preserve a checkpoint of the environment for the IR graph. Any |
+ // further mutation of the environment will not affect checkpoints. |
+ Node* Checkpoint(BailoutId ast_id, AccumulatorUpdateMode update_mode); |
+ |
+ // Returns true if the state values are up to date with the current |
+ // environment. If update_mode is AccumulatorUpdateMode::kOutputInAccumulator |
+ // then accumulator state can be different from the environment. |
+ bool StateValuesAreUpToDate(AccumulatorUpdateMode update_mode); |
+ |
// Control dependency tracked by this environment. |
Node* GetControlDependency() const { return control_dependency_; } |
void UpdateControlDependency(Node* dependency) { |
@@ -281,26 +301,32 @@ class BytecodeGraphBuilder::Environment : public ZoneObject { |
private: |
explicit Environment(const Environment* copy); |
void PrepareForLoop(); |
+ bool StateValuesRequireUpdate(Node** state_values, int offset, int count); |
+ void UpdateStateValues(Node** state_values, int offset, int count); |
int RegisterToValuesIndex(interpreter::Register the_register) const; |
+ |
Zone* zone() const { return builder_->local_zone(); } |
Graph* graph() const { return builder_->graph(); } |
CommonOperatorBuilder* common() const { return builder_->common(); } |
BytecodeGraphBuilder* builder() const { return builder_; } |
const NodeVector* values() const { return &values_; } |
NodeVector* values() { return &values_; } |
- Node* accumulator() { return accumulator_; } |
int register_base() const { return register_base_; } |
+ int accumulator_base() const { return accumulator_base_; } |
BytecodeGraphBuilder* builder_; |
int register_count_; |
int parameter_count_; |
- Node* accumulator_; |
Node* context_; |
Node* control_dependency_; |
Node* effect_dependency_; |
NodeVector values_; |
+ Node* parameters_state_values_; |
+ Node* registers_state_values_; |
+ Node* accumulator_state_values_; |
int register_base_; |
+ int accumulator_base_; |
}; |
} // namespace compiler |