| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_HYDROGEN_H_ | 5 #ifndef V8_HYDROGEN_H_ |
| 6 #define V8_HYDROGEN_H_ | 6 #define V8_HYDROGEN_H_ |
| 7 | 7 |
| 8 #include "src/v8.h" | 8 #include "src/v8.h" |
| 9 | 9 |
| 10 #include "src/accessors.h" | 10 #include "src/accessors.h" |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 81 | 81 |
| 82 void AttachLoopInformation(); | 82 void AttachLoopInformation(); |
| 83 void DetachLoopInformation(); | 83 void DetachLoopInformation(); |
| 84 bool IsLoopHeader() const { return loop_information() != NULL; } | 84 bool IsLoopHeader() const { return loop_information() != NULL; } |
| 85 bool IsStartBlock() const { return block_id() == 0; } | 85 bool IsStartBlock() const { return block_id() == 0; } |
| 86 void PostProcessLoopHeader(IterationStatement* stmt); | 86 void PostProcessLoopHeader(IterationStatement* stmt); |
| 87 | 87 |
| 88 bool IsFinished() const { return end_ != NULL; } | 88 bool IsFinished() const { return end_ != NULL; } |
| 89 void AddPhi(HPhi* phi); | 89 void AddPhi(HPhi* phi); |
| 90 void RemovePhi(HPhi* phi); | 90 void RemovePhi(HPhi* phi); |
| 91 void AddInstruction(HInstruction* instr, HSourcePosition position); | 91 void AddInstruction(HInstruction* instr, SourcePosition position); |
| 92 bool Dominates(HBasicBlock* other) const; | 92 bool Dominates(HBasicBlock* other) const; |
| 93 bool EqualToOrDominates(HBasicBlock* other) const; | 93 bool EqualToOrDominates(HBasicBlock* other) const; |
| 94 int LoopNestingDepth() const; | 94 int LoopNestingDepth() const; |
| 95 | 95 |
| 96 void SetInitialEnvironment(HEnvironment* env); | 96 void SetInitialEnvironment(HEnvironment* env); |
| 97 void ClearEnvironment() { | 97 void ClearEnvironment() { |
| 98 DCHECK(IsFinished()); | 98 DCHECK(IsFinished()); |
| 99 DCHECK(end()->SuccessorCount() == 0); | 99 DCHECK(end()->SuccessorCount() == 0); |
| 100 last_environment_ = NULL; | 100 last_environment_ = NULL; |
| 101 } | 101 } |
| 102 bool HasEnvironment() const { return last_environment_ != NULL; } | 102 bool HasEnvironment() const { return last_environment_ != NULL; } |
| 103 void UpdateEnvironment(HEnvironment* env); | 103 void UpdateEnvironment(HEnvironment* env); |
| 104 HBasicBlock* parent_loop_header() const { return parent_loop_header_; } | 104 HBasicBlock* parent_loop_header() const { return parent_loop_header_; } |
| 105 | 105 |
| 106 void set_parent_loop_header(HBasicBlock* block) { | 106 void set_parent_loop_header(HBasicBlock* block) { |
| 107 DCHECK(parent_loop_header_ == NULL); | 107 DCHECK(parent_loop_header_ == NULL); |
| 108 parent_loop_header_ = block; | 108 parent_loop_header_ = block; |
| 109 } | 109 } |
| 110 | 110 |
| 111 bool HasParentLoopHeader() const { return parent_loop_header_ != NULL; } | 111 bool HasParentLoopHeader() const { return parent_loop_header_ != NULL; } |
| 112 | 112 |
| 113 void SetJoinId(BailoutId ast_id); | 113 void SetJoinId(BailoutId ast_id); |
| 114 | 114 |
| 115 int PredecessorIndexOf(HBasicBlock* predecessor) const; | 115 int PredecessorIndexOf(HBasicBlock* predecessor) const; |
| 116 HPhi* AddNewPhi(int merged_index); | 116 HPhi* AddNewPhi(int merged_index); |
| 117 HSimulate* AddNewSimulate(BailoutId ast_id, | 117 HSimulate* AddNewSimulate(BailoutId ast_id, SourcePosition position, |
| 118 HSourcePosition position, | |
| 119 RemovableSimulate removable = FIXED_SIMULATE) { | 118 RemovableSimulate removable = FIXED_SIMULATE) { |
| 120 HSimulate* instr = CreateSimulate(ast_id, removable); | 119 HSimulate* instr = CreateSimulate(ast_id, removable); |
| 121 AddInstruction(instr, position); | 120 AddInstruction(instr, position); |
| 122 return instr; | 121 return instr; |
| 123 } | 122 } |
| 124 void AssignCommonDominator(HBasicBlock* other); | 123 void AssignCommonDominator(HBasicBlock* other); |
| 125 void AssignLoopSuccessorDominators(); | 124 void AssignLoopSuccessorDominators(); |
| 126 | 125 |
| 127 // If a target block is tagged as an inline function return, all | 126 // If a target block is tagged as an inline function return, all |
| 128 // predecessors should contain the inlined exit sequence: | 127 // predecessors should contain the inlined exit sequence: |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 inline Zone* zone() const; | 159 inline Zone* zone() const; |
| 161 | 160 |
| 162 #ifdef DEBUG | 161 #ifdef DEBUG |
| 163 void Verify(); | 162 void Verify(); |
| 164 #endif | 163 #endif |
| 165 | 164 |
| 166 protected: | 165 protected: |
| 167 friend class HGraphBuilder; | 166 friend class HGraphBuilder; |
| 168 | 167 |
| 169 HSimulate* CreateSimulate(BailoutId ast_id, RemovableSimulate removable); | 168 HSimulate* CreateSimulate(BailoutId ast_id, RemovableSimulate removable); |
| 170 void Finish(HControlInstruction* last, HSourcePosition position); | 169 void Finish(HControlInstruction* last, SourcePosition position); |
| 171 void FinishExit(HControlInstruction* instruction, HSourcePosition position); | 170 void FinishExit(HControlInstruction* instruction, SourcePosition position); |
| 172 void Goto(HBasicBlock* block, | 171 void Goto(HBasicBlock* block, SourcePosition position, |
| 173 HSourcePosition position, | 172 FunctionState* state = NULL, bool add_simulate = true); |
| 174 FunctionState* state = NULL, | 173 void GotoNoSimulate(HBasicBlock* block, SourcePosition position) { |
| 175 bool add_simulate = true); | |
| 176 void GotoNoSimulate(HBasicBlock* block, HSourcePosition position) { | |
| 177 Goto(block, position, NULL, false); | 174 Goto(block, position, NULL, false); |
| 178 } | 175 } |
| 179 | 176 |
| 180 // Add the inlined function exit sequence, adding an HLeaveInlined | 177 // Add the inlined function exit sequence, adding an HLeaveInlined |
| 181 // instruction and updating the bailout environment. | 178 // instruction and updating the bailout environment. |
| 182 void AddLeaveInlined(HValue* return_value, | 179 void AddLeaveInlined(HValue* return_value, FunctionState* state, |
| 183 FunctionState* state, | 180 SourcePosition position); |
| 184 HSourcePosition position); | |
| 185 | 181 |
| 186 private: | 182 private: |
| 187 void RegisterPredecessor(HBasicBlock* pred); | 183 void RegisterPredecessor(HBasicBlock* pred); |
| 188 void AddDominatedBlock(HBasicBlock* block); | 184 void AddDominatedBlock(HBasicBlock* block); |
| 189 | 185 |
| 190 int block_id_; | 186 int block_id_; |
| 191 HGraph* graph_; | 187 HGraph* graph_; |
| 192 ZoneList<HPhi*> phis_; | 188 ZoneList<HPhi*> phis_; |
| 193 HInstruction* first_; | 189 HInstruction* first_; |
| 194 HInstruction* last_; | 190 HInstruction* last_; |
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 454 } | 450 } |
| 455 | 451 |
| 456 void IncrementInNoSideEffectsScope() { no_side_effects_scope_count_++; } | 452 void IncrementInNoSideEffectsScope() { no_side_effects_scope_count_++; } |
| 457 void DecrementInNoSideEffectsScope() { no_side_effects_scope_count_--; } | 453 void DecrementInNoSideEffectsScope() { no_side_effects_scope_count_--; } |
| 458 bool IsInsideNoSideEffectsScope() { return no_side_effects_scope_count_ > 0; } | 454 bool IsInsideNoSideEffectsScope() { return no_side_effects_scope_count_ > 0; } |
| 459 | 455 |
| 460 // If we are tracking source positions then this function assigns a unique | 456 // If we are tracking source positions then this function assigns a unique |
| 461 // identifier to each inlining and dumps function source if it was inlined | 457 // identifier to each inlining and dumps function source if it was inlined |
| 462 // for the first time during the current optimization. | 458 // for the first time during the current optimization. |
| 463 int TraceInlinedFunction(Handle<SharedFunctionInfo> shared, | 459 int TraceInlinedFunction(Handle<SharedFunctionInfo> shared, |
| 464 HSourcePosition position); | 460 SourcePosition position); |
| 465 | 461 |
| 466 // Converts given HSourcePosition to the absolute offset from the start of | 462 // Converts given SourcePosition to the absolute offset from the start of |
| 467 // the corresponding script. | 463 // the corresponding script. |
| 468 int SourcePositionToScriptPosition(HSourcePosition position); | 464 int SourcePositionToScriptPosition(SourcePosition position); |
| 469 | 465 |
| 470 private: | 466 private: |
| 471 HConstant* ReinsertConstantIfNecessary(HConstant* constant); | 467 HConstant* ReinsertConstantIfNecessary(HConstant* constant); |
| 472 HConstant* GetConstant(SetOncePointer<HConstant>* pointer, | 468 HConstant* GetConstant(SetOncePointer<HConstant>* pointer, |
| 473 int32_t integer_value); | 469 int32_t integer_value); |
| 474 | 470 |
| 475 template<class Phase> | 471 template<class Phase> |
| 476 void Run() { | 472 void Run() { |
| 477 Phase phase(this); | 473 Phase phase(this); |
| 478 phase.Run(); | 474 phase.Run(); |
| (...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 934 TestContext* test_context_; | 930 TestContext* test_context_; |
| 935 | 931 |
| 936 // When inlining HEnterInlined instruction corresponding to the function | 932 // When inlining HEnterInlined instruction corresponding to the function |
| 937 // entry. | 933 // entry. |
| 938 HEnterInlined* entry_; | 934 HEnterInlined* entry_; |
| 939 | 935 |
| 940 HArgumentsObject* arguments_object_; | 936 HArgumentsObject* arguments_object_; |
| 941 HArgumentsElements* arguments_elements_; | 937 HArgumentsElements* arguments_elements_; |
| 942 | 938 |
| 943 int inlining_id_; | 939 int inlining_id_; |
| 944 HSourcePosition outer_source_position_; | 940 SourcePosition outer_source_position_; |
| 945 | 941 |
| 946 FunctionState* outer_; | 942 FunctionState* outer_; |
| 947 }; | 943 }; |
| 948 | 944 |
| 949 | 945 |
| 950 class HIfContinuation FINAL { | 946 class HIfContinuation FINAL { |
| 951 public: | 947 public: |
| 952 HIfContinuation() | 948 HIfContinuation() |
| 953 : continuation_captured_(false), | 949 : continuation_captured_(false), |
| 954 true_branch_(NULL), | 950 true_branch_(NULL), |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1022 }; | 1018 }; |
| 1023 | 1019 |
| 1024 | 1020 |
| 1025 class HGraphBuilder { | 1021 class HGraphBuilder { |
| 1026 public: | 1022 public: |
| 1027 explicit HGraphBuilder(CompilationInfo* info) | 1023 explicit HGraphBuilder(CompilationInfo* info) |
| 1028 : info_(info), | 1024 : info_(info), |
| 1029 graph_(NULL), | 1025 graph_(NULL), |
| 1030 current_block_(NULL), | 1026 current_block_(NULL), |
| 1031 scope_(info->scope()), | 1027 scope_(info->scope()), |
| 1032 position_(HSourcePosition::Unknown()), | 1028 position_(SourcePosition::Unknown()), |
| 1033 start_position_(0) {} | 1029 start_position_(0) {} |
| 1034 virtual ~HGraphBuilder() {} | 1030 virtual ~HGraphBuilder() {} |
| 1035 | 1031 |
| 1036 Scope* scope() const { return scope_; } | 1032 Scope* scope() const { return scope_; } |
| 1037 void set_scope(Scope* scope) { scope_ = scope; } | 1033 void set_scope(Scope* scope) { scope_ = scope; } |
| 1038 | 1034 |
| 1039 HBasicBlock* current_block() const { return current_block_; } | 1035 HBasicBlock* current_block() const { return current_block_; } |
| 1040 void set_current_block(HBasicBlock* block) { current_block_ = block; } | 1036 void set_current_block(HBasicBlock* block) { current_block_ = block; } |
| 1041 HEnvironment* environment() const { | 1037 HEnvironment* environment() const { |
| 1042 return current_block()->last_environment(); | 1038 return current_block()->last_environment(); |
| (...skipping 835 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1878 } | 1874 } |
| 1879 | 1875 |
| 1880 void EnterInlinedSource(int start_position, int id) { | 1876 void EnterInlinedSource(int start_position, int id) { |
| 1881 if (FLAG_hydrogen_track_positions) { | 1877 if (FLAG_hydrogen_track_positions) { |
| 1882 start_position_ = start_position; | 1878 start_position_ = start_position; |
| 1883 position_.set_inlining_id(id); | 1879 position_.set_inlining_id(id); |
| 1884 } | 1880 } |
| 1885 } | 1881 } |
| 1886 | 1882 |
| 1887 // Convert the given absolute offset from the start of the script to | 1883 // Convert the given absolute offset from the start of the script to |
| 1888 // the HSourcePosition assuming that this position corresponds to the | 1884 // the SourcePosition assuming that this position corresponds to the |
| 1889 // same function as current position_. | 1885 // same function as current position_. |
| 1890 HSourcePosition ScriptPositionToSourcePosition(int position) { | 1886 SourcePosition ScriptPositionToSourcePosition(int position) { |
| 1891 HSourcePosition pos = position_; | 1887 SourcePosition pos = position_; |
| 1892 pos.set_position(position - start_position_); | 1888 pos.set_position(position - start_position_); |
| 1893 return pos; | 1889 return pos; |
| 1894 } | 1890 } |
| 1895 | 1891 |
| 1896 HSourcePosition source_position() { return position_; } | 1892 SourcePosition source_position() { return position_; } |
| 1897 void set_source_position(HSourcePosition position) { | 1893 void set_source_position(SourcePosition position) { position_ = position; } |
| 1898 position_ = position; | |
| 1899 } | |
| 1900 | 1894 |
| 1901 template <typename ViewClass> | 1895 template <typename ViewClass> |
| 1902 void BuildArrayBufferViewInitialization(HValue* obj, | 1896 void BuildArrayBufferViewInitialization(HValue* obj, |
| 1903 HValue* buffer, | 1897 HValue* buffer, |
| 1904 HValue* byte_offset, | 1898 HValue* byte_offset, |
| 1905 HValue* byte_length); | 1899 HValue* byte_length); |
| 1906 | 1900 |
| 1907 private: | 1901 private: |
| 1908 HGraphBuilder(); | 1902 HGraphBuilder(); |
| 1909 | 1903 |
| 1910 template <class I> | 1904 template <class I> |
| 1911 I* AddInstructionTyped(I* instr) { | 1905 I* AddInstructionTyped(I* instr) { |
| 1912 return I::cast(AddInstruction(instr)); | 1906 return I::cast(AddInstruction(instr)); |
| 1913 } | 1907 } |
| 1914 | 1908 |
| 1915 CompilationInfo* info_; | 1909 CompilationInfo* info_; |
| 1916 HGraph* graph_; | 1910 HGraph* graph_; |
| 1917 HBasicBlock* current_block_; | 1911 HBasicBlock* current_block_; |
| 1918 Scope* scope_; | 1912 Scope* scope_; |
| 1919 HSourcePosition position_; | 1913 SourcePosition position_; |
| 1920 int start_position_; | 1914 int start_position_; |
| 1921 }; | 1915 }; |
| 1922 | 1916 |
| 1923 | 1917 |
| 1924 template <> | 1918 template <> |
| 1925 inline HDeoptimize* HGraphBuilder::Add<HDeoptimize>( | 1919 inline HDeoptimize* HGraphBuilder::Add<HDeoptimize>( |
| 1926 Deoptimizer::DeoptReason reason, Deoptimizer::BailoutType type) { | 1920 Deoptimizer::DeoptReason reason, Deoptimizer::BailoutType type) { |
| 1927 if (type == Deoptimizer::SOFT) { | 1921 if (type == Deoptimizer::SOFT) { |
| 1928 isolate()->counters()->soft_deopts_requested()->Increment(); | 1922 isolate()->counters()->soft_deopts_requested()->Increment(); |
| 1929 if (FLAG_always_opt) return NULL; | 1923 if (FLAG_always_opt) return NULL; |
| (...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2318 enum ArrayIndexOfMode { kFirstIndexOf, kLastIndexOf }; | 2312 enum ArrayIndexOfMode { kFirstIndexOf, kLastIndexOf }; |
| 2319 HValue* BuildArrayIndexOf(HValue* receiver, | 2313 HValue* BuildArrayIndexOf(HValue* receiver, |
| 2320 HValue* search_element, | 2314 HValue* search_element, |
| 2321 ElementsKind kind, | 2315 ElementsKind kind, |
| 2322 ArrayIndexOfMode mode); | 2316 ArrayIndexOfMode mode); |
| 2323 | 2317 |
| 2324 HValue* ImplicitReceiverFor(HValue* function, | 2318 HValue* ImplicitReceiverFor(HValue* function, |
| 2325 Handle<JSFunction> target); | 2319 Handle<JSFunction> target); |
| 2326 | 2320 |
| 2327 int InliningAstSize(Handle<JSFunction> target); | 2321 int InliningAstSize(Handle<JSFunction> target); |
| 2328 bool TryInline(Handle<JSFunction> target, | 2322 bool TryInline(Handle<JSFunction> target, int arguments_count, |
| 2329 int arguments_count, | 2323 HValue* implicit_return_value, BailoutId ast_id, |
| 2330 HValue* implicit_return_value, | 2324 BailoutId return_id, InliningKind inlining_kind, |
| 2331 BailoutId ast_id, | 2325 SourcePosition position); |
| 2332 BailoutId return_id, | |
| 2333 InliningKind inlining_kind, | |
| 2334 HSourcePosition position); | |
| 2335 | 2326 |
| 2336 bool TryInlineCall(Call* expr); | 2327 bool TryInlineCall(Call* expr); |
| 2337 bool TryInlineConstruct(CallNew* expr, HValue* implicit_return_value); | 2328 bool TryInlineConstruct(CallNew* expr, HValue* implicit_return_value); |
| 2338 bool TryInlineGetter(Handle<JSFunction> getter, | 2329 bool TryInlineGetter(Handle<JSFunction> getter, |
| 2339 Handle<Map> receiver_map, | 2330 Handle<Map> receiver_map, |
| 2340 BailoutId ast_id, | 2331 BailoutId ast_id, |
| 2341 BailoutId return_id); | 2332 BailoutId return_id); |
| 2342 bool TryInlineSetter(Handle<JSFunction> setter, | 2333 bool TryInlineSetter(Handle<JSFunction> setter, |
| 2343 Handle<Map> receiver_map, | 2334 Handle<Map> receiver_map, |
| 2344 BailoutId id, | 2335 BailoutId id, |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2590 void HandleLiteralCompareNil(CompareOperation* expr, | 2581 void HandleLiteralCompareNil(CompareOperation* expr, |
| 2591 Expression* sub_expr, | 2582 Expression* sub_expr, |
| 2592 NilValue nil); | 2583 NilValue nil); |
| 2593 | 2584 |
| 2594 enum PushBeforeSimulateBehavior { | 2585 enum PushBeforeSimulateBehavior { |
| 2595 PUSH_BEFORE_SIMULATE, | 2586 PUSH_BEFORE_SIMULATE, |
| 2596 NO_PUSH_BEFORE_SIMULATE | 2587 NO_PUSH_BEFORE_SIMULATE |
| 2597 }; | 2588 }; |
| 2598 | 2589 |
| 2599 HControlInstruction* BuildCompareInstruction( | 2590 HControlInstruction* BuildCompareInstruction( |
| 2600 Token::Value op, | 2591 Token::Value op, HValue* left, HValue* right, Type* left_type, |
| 2601 HValue* left, | 2592 Type* right_type, Type* combined_type, SourcePosition left_position, |
| 2602 HValue* right, | 2593 SourcePosition right_position, PushBeforeSimulateBehavior push_sim_result, |
| 2603 Type* left_type, | |
| 2604 Type* right_type, | |
| 2605 Type* combined_type, | |
| 2606 HSourcePosition left_position, | |
| 2607 HSourcePosition right_position, | |
| 2608 PushBeforeSimulateBehavior push_sim_result, | |
| 2609 BailoutId bailout_id); | 2594 BailoutId bailout_id); |
| 2610 | 2595 |
| 2611 HInstruction* BuildStringCharCodeAt(HValue* string, | 2596 HInstruction* BuildStringCharCodeAt(HValue* string, |
| 2612 HValue* index); | 2597 HValue* index); |
| 2613 | 2598 |
| 2614 HValue* BuildBinaryOperation( | 2599 HValue* BuildBinaryOperation( |
| 2615 BinaryOperation* expr, | 2600 BinaryOperation* expr, |
| 2616 HValue* left, | 2601 HValue* left, |
| 2617 HValue* right, | 2602 HValue* right, |
| 2618 PushBeforeSimulateBehavior push_sim_result); | 2603 PushBeforeSimulateBehavior push_sim_result); |
| (...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2930 } | 2915 } |
| 2931 | 2916 |
| 2932 private: | 2917 private: |
| 2933 HGraphBuilder* builder_; | 2918 HGraphBuilder* builder_; |
| 2934 }; | 2919 }; |
| 2935 | 2920 |
| 2936 | 2921 |
| 2937 } } // namespace v8::internal | 2922 } } // namespace v8::internal |
| 2938 | 2923 |
| 2939 #endif // V8_HYDROGEN_H_ | 2924 #endif // V8_HYDROGEN_H_ |
| OLD | NEW |