| Index: src/hydrogen.h
|
| diff --git a/src/hydrogen.h b/src/hydrogen.h
|
| index bd28ba1b74d55da9df2dd5c11cc615a6c4ba4f0b..febe9ddbba6f7011adb6132da4f1a42146619ccd 100644
|
| --- a/src/hydrogen.h
|
| +++ b/src/hydrogen.h
|
| @@ -110,7 +110,7 @@ class HBasicBlock V8_FINAL : public ZoneObject {
|
| bool IsFinished() const { return end_ != NULL; }
|
| void AddPhi(HPhi* phi);
|
| void RemovePhi(HPhi* phi);
|
| - void AddInstruction(HInstruction* instr);
|
| + void AddInstruction(HInstruction* instr, int position);
|
| bool Dominates(HBasicBlock* other) const;
|
| int LoopNestingDepth() const;
|
|
|
| @@ -133,30 +133,18 @@ class HBasicBlock V8_FINAL : public ZoneObject {
|
|
|
| void SetJoinId(BailoutId ast_id);
|
|
|
| - void Finish(HControlInstruction* last);
|
| - void FinishExit(HControlInstruction* instruction);
|
| - void Goto(HBasicBlock* block,
|
| - FunctionState* state = NULL,
|
| - bool add_simulate = true);
|
| - void GotoNoSimulate(HBasicBlock* block) {
|
| - Goto(block, NULL, false);
|
| - }
|
| -
|
| int PredecessorIndexOf(HBasicBlock* predecessor) const;
|
| HPhi* AddNewPhi(int merged_index);
|
| HSimulate* AddNewSimulate(BailoutId ast_id,
|
| + int position,
|
| RemovableSimulate removable = FIXED_SIMULATE) {
|
| HSimulate* instr = CreateSimulate(ast_id, removable);
|
| - AddInstruction(instr);
|
| + AddInstruction(instr, position);
|
| return instr;
|
| }
|
| void AssignCommonDominator(HBasicBlock* other);
|
| void AssignLoopSuccessorDominators();
|
|
|
| - // Add the inlined function exit sequence, adding an HLeaveInlined
|
| - // instruction and updating the bailout environment.
|
| - void AddLeaveInlined(HValue* return_value, FunctionState* state);
|
| -
|
| // If a target block is tagged as an inline function return, all
|
| // predecessors should contain the inlined exit sequence:
|
| //
|
| @@ -191,14 +179,30 @@ class HBasicBlock V8_FINAL : public ZoneObject {
|
| void Verify();
|
| #endif
|
|
|
| - private:
|
| + protected:
|
| friend class HGraphBuilder;
|
|
|
| + HSimulate* CreateSimulate(BailoutId ast_id, RemovableSimulate removable);
|
| + void Finish(HControlInstruction* last, int position);
|
| + void FinishExit(HControlInstruction* instruction, int position);
|
| + void Goto(HBasicBlock* block,
|
| + int position,
|
| + FunctionState* state = NULL,
|
| + bool add_simulate = true);
|
| + void GotoNoSimulate(HBasicBlock* block, int position) {
|
| + Goto(block, position, NULL, false);
|
| + }
|
| +
|
| + // Add the inlined function exit sequence, adding an HLeaveInlined
|
| + // instruction and updating the bailout environment.
|
| + void AddLeaveInlined(HValue* return_value,
|
| + FunctionState* state,
|
| + int position);
|
| +
|
| + private:
|
| void RegisterPredecessor(HBasicBlock* pred);
|
| void AddDominatedBlock(HBasicBlock* block);
|
|
|
| - HSimulate* CreateSimulate(BailoutId ast_id, RemovableSimulate removable);
|
| -
|
| int block_id_;
|
| HGraph* graph_;
|
| ZoneList<HPhi*> phis_;
|
| @@ -940,29 +944,24 @@ class HIfContinuation V8_FINAL {
|
| public:
|
| HIfContinuation() : continuation_captured_(false) {}
|
| HIfContinuation(HBasicBlock* true_branch,
|
| - HBasicBlock* false_branch,
|
| - int position = RelocInfo::kNoPosition)
|
| + HBasicBlock* false_branch)
|
| : continuation_captured_(true), true_branch_(true_branch),
|
| - false_branch_(false_branch), position_(position) {}
|
| + false_branch_(false_branch) {}
|
| ~HIfContinuation() { ASSERT(!continuation_captured_); }
|
|
|
| void Capture(HBasicBlock* true_branch,
|
| - HBasicBlock* false_branch,
|
| - int position) {
|
| + HBasicBlock* false_branch) {
|
| ASSERT(!continuation_captured_);
|
| true_branch_ = true_branch;
|
| false_branch_ = false_branch;
|
| - position_ = position;
|
| continuation_captured_ = true;
|
| }
|
|
|
| void Continue(HBasicBlock** true_branch,
|
| - HBasicBlock** false_branch,
|
| - int* position) {
|
| + HBasicBlock** false_branch) {
|
| ASSERT(continuation_captured_);
|
| *true_branch = true_branch_;
|
| *false_branch = false_branch_;
|
| - if (position != NULL) *position = position_;
|
| continuation_captured_ = false;
|
| }
|
|
|
| @@ -979,7 +978,6 @@ class HIfContinuation V8_FINAL {
|
| bool continuation_captured_;
|
| HBasicBlock* true_branch_;
|
| HBasicBlock* false_branch_;
|
| - int position_;
|
| };
|
|
|
|
|
| @@ -988,7 +986,8 @@ class HGraphBuilder {
|
| explicit HGraphBuilder(CompilationInfo* info)
|
| : info_(info),
|
| graph_(NULL),
|
| - current_block_(NULL) {}
|
| + current_block_(NULL),
|
| + position_(RelocInfo::kNoPosition) {}
|
| virtual ~HGraphBuilder() {}
|
|
|
| HBasicBlock* current_block() const { return current_block_; }
|
| @@ -1011,6 +1010,34 @@ class HGraphBuilder {
|
|
|
| // Adding instructions.
|
| HInstruction* AddInstruction(HInstruction* instr);
|
| + void FinishCurrentBlock(HControlInstruction* last);
|
| + void FinishExitCurrentBlock(HControlInstruction* instruction);
|
| +
|
| + void Goto(HBasicBlock* from,
|
| + HBasicBlock* target,
|
| + FunctionState* state = NULL,
|
| + bool add_simulate = true) {
|
| + from->Goto(target, position_, state, add_simulate);
|
| + }
|
| + void Goto(HBasicBlock* target,
|
| + FunctionState* state = NULL,
|
| + bool add_simulate = true) {
|
| + Goto(current_block(), target, state, add_simulate);
|
| + }
|
| + void GotoNoSimulate(HBasicBlock* from, HBasicBlock* target) {
|
| + Goto(from, target, NULL, false);
|
| + }
|
| + void GotoNoSimulate(HBasicBlock* target) {
|
| + Goto(target, NULL, false);
|
| + }
|
| + void AddLeaveInlined(HBasicBlock* block,
|
| + HValue* return_value,
|
| + FunctionState* state) {
|
| + block->AddLeaveInlined(return_value, state, position_);
|
| + }
|
| + void AddLeaveInlined(HValue* return_value, FunctionState* state) {
|
| + return AddLeaveInlined(current_block(), return_value, state);
|
| + }
|
|
|
| template<class I>
|
| HInstruction* NewUncasted() { return I::New(zone(), context()); }
|
| @@ -1205,6 +1232,8 @@ class HGraphBuilder {
|
|
|
| void AddSimulate(BailoutId id, RemovableSimulate removable = FIXED_SIMULATE);
|
|
|
| + int position() const { return position_; }
|
| +
|
| protected:
|
| virtual bool BuildGraph() = 0;
|
|
|
| @@ -1297,8 +1326,7 @@ class HGraphBuilder {
|
|
|
| class IfBuilder V8_FINAL {
|
| public:
|
| - explicit IfBuilder(HGraphBuilder* builder,
|
| - int position = RelocInfo::kNoPosition);
|
| + explicit IfBuilder(HGraphBuilder* builder);
|
| IfBuilder(HGraphBuilder* builder,
|
| HIfContinuation* continuation);
|
|
|
| @@ -1449,7 +1477,6 @@ class HGraphBuilder {
|
| HGraphBuilder* builder() const { return builder_; }
|
|
|
| HGraphBuilder* builder_;
|
| - int position_;
|
| bool finished_ : 1;
|
| bool deopt_then_ : 1;
|
| bool deopt_else_ : 1;
|
| @@ -1610,7 +1637,6 @@ class HGraphBuilder {
|
| void BuildCompareNil(
|
| HValue* value,
|
| Handle<Type> type,
|
| - int position,
|
| HIfContinuation* continuation);
|
|
|
| HValue* BuildCreateAllocationMemento(HValue* previous_object,
|
| @@ -1625,6 +1651,12 @@ class HGraphBuilder {
|
| HInstruction* BuildGetNativeContext();
|
| HInstruction* BuildGetArrayFunction();
|
|
|
| + protected:
|
| + void SetSourcePosition(int position) {
|
| + ASSERT(position != RelocInfo::kNoPosition);
|
| + position_ = position;
|
| + }
|
| +
|
| private:
|
| HGraphBuilder();
|
|
|
| @@ -1634,6 +1666,7 @@ class HGraphBuilder {
|
| CompilationInfo* info_;
|
| HGraph* graph_;
|
| HBasicBlock* current_block_;
|
| + int position_;
|
| };
|
|
|
|
|
| @@ -1651,7 +1684,7 @@ inline HInstruction* HGraphBuilder::AddUncasted<HDeoptimize>(
|
| if (type == Deoptimizer::SOFT) {
|
| isolate()->counters()->soft_deopts_inserted()->Increment();
|
| }
|
| - current_block()->Finish(instr);
|
| + FinishCurrentBlock(instr);
|
| set_current_block(after_deopt_block);
|
| return instr;
|
| }
|
| @@ -1685,7 +1718,7 @@ inline HInstruction* HGraphBuilder::AddUncasted<HReturn>(HValue* value) {
|
| int num_parameters = graph()->info()->num_parameters();
|
| HValue* params = AddUncasted<HConstant>(num_parameters);
|
| HReturn* return_instruction = New<HReturn>(value, params);
|
| - current_block()->FinishExit(return_instruction);
|
| + FinishExitCurrentBlock(return_instruction);
|
| return return_instruction;
|
| }
|
|
|
| @@ -1719,8 +1752,7 @@ inline HInstruction* HGraphBuilder::NewUncasted<HContext>() {
|
| }
|
|
|
|
|
| -class HOptimizedGraphBuilder V8_FINAL
|
| - : public HGraphBuilder, public AstVisitor {
|
| +class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor {
|
| public:
|
| // A class encapsulating (lazily-allocated) break and continue blocks for
|
| // a breakable statement. Separated from BreakAndContinueScope so that it
|
| @@ -1807,7 +1839,7 @@ class HOptimizedGraphBuilder V8_FINAL
|
|
|
| DEFINE_AST_VISITOR_SUBCLASS_MEMBERS();
|
|
|
| - private:
|
| + protected:
|
| // Type of a member function that generates inline code for a native function.
|
| typedef void (HOptimizedGraphBuilder::*InlineFunctionGenerator)
|
| (CallRuntime* call);
|
| @@ -1977,6 +2009,7 @@ class HOptimizedGraphBuilder V8_FINAL
|
| AST_NODE_LIST(DECLARE_VISIT)
|
| #undef DECLARE_VISIT
|
|
|
| + private:
|
| // Helpers for flow graph construction.
|
| enum GlobalPropertyAccess {
|
| kUseCell,
|
| @@ -2028,13 +2061,11 @@ class HOptimizedGraphBuilder V8_FINAL
|
|
|
| void HandleGlobalVariableAssignment(Variable* var,
|
| HValue* value,
|
| - int position,
|
| BailoutId ast_id);
|
|
|
| void HandlePropertyAssignment(Assignment* expr);
|
| void HandleCompoundAssignment(Assignment* expr);
|
| - void HandlePolymorphicLoadNamedField(int position,
|
| - BailoutId ast_id,
|
| + void HandlePolymorphicLoadNamedField(BailoutId ast_id,
|
| BailoutId return_id,
|
| HValue* object,
|
| SmallMapList* types,
|
| @@ -2131,14 +2162,12 @@ class HOptimizedGraphBuilder V8_FINAL
|
| BailoutId return_id,
|
| bool can_inline_accessor = true);
|
|
|
| - void HandlePolymorphicStoreNamedField(int position,
|
| - BailoutId assignment_id,
|
| + void HandlePolymorphicStoreNamedField(BailoutId assignment_id,
|
| HValue* object,
|
| HValue* value,
|
| SmallMapList* types,
|
| Handle<String> name);
|
| - bool TryStorePolymorphicAsMonomorphic(int position,
|
| - BailoutId assignment_id,
|
| + bool TryStorePolymorphicAsMonomorphic(BailoutId assignment_id,
|
| HValue* object,
|
| HValue* value,
|
| SmallMapList* types,
|
| @@ -2187,7 +2216,6 @@ class HOptimizedGraphBuilder V8_FINAL
|
| HValue* key,
|
| HValue* val,
|
| SmallMapList* maps,
|
| - int position,
|
| bool is_store,
|
| KeyedAccessStoreMode store_mode,
|
| bool* has_side_effects);
|
| @@ -2196,7 +2224,6 @@ class HOptimizedGraphBuilder V8_FINAL
|
| HValue* key,
|
| HValue* val,
|
| Expression* expr,
|
| - int position,
|
| bool is_store,
|
| bool* has_side_effects);
|
|
|
| @@ -2207,12 +2234,10 @@ class HOptimizedGraphBuilder V8_FINAL
|
| HCheckMaps* AddCheckMap(HValue* object, Handle<Map> map);
|
|
|
| void BuildLoad(Property* property,
|
| - int position,
|
| BailoutId ast_id);
|
| void PushLoad(Property* property,
|
| HValue* object,
|
| - HValue* key,
|
| - int position);
|
| + HValue* key);
|
|
|
| void BuildStoreForEffect(Expression* expression,
|
| Property* prop,
|
|
|