OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 #include "src/hydrogen.h" | 5 #include "src/hydrogen.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "src/v8.h" | 9 #include "src/v8.h" |
10 | 10 |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 | 122 |
123 void HBasicBlock::RemovePhi(HPhi* phi) { | 123 void HBasicBlock::RemovePhi(HPhi* phi) { |
124 DCHECK(phi->block() == this); | 124 DCHECK(phi->block() == this); |
125 DCHECK(phis_.Contains(phi)); | 125 DCHECK(phis_.Contains(phi)); |
126 phi->Kill(); | 126 phi->Kill(); |
127 phis_.RemoveElement(phi); | 127 phis_.RemoveElement(phi); |
128 phi->SetBlock(NULL); | 128 phi->SetBlock(NULL); |
129 } | 129 } |
130 | 130 |
131 | 131 |
132 void HBasicBlock::AddInstruction(HInstruction* instr, | 132 void HBasicBlock::AddInstruction(HInstruction* instr, SourcePosition position) { |
133 HSourcePosition position) { | |
134 DCHECK(!IsStartBlock() || !IsFinished()); | 133 DCHECK(!IsStartBlock() || !IsFinished()); |
135 DCHECK(!instr->IsLinked()); | 134 DCHECK(!instr->IsLinked()); |
136 DCHECK(!IsFinished()); | 135 DCHECK(!IsFinished()); |
137 | 136 |
138 if (!position.IsUnknown()) { | 137 if (!position.IsUnknown()) { |
139 instr->set_position(position); | 138 instr->set_position(position); |
140 } | 139 } |
141 if (first_ == NULL) { | 140 if (first_ == NULL) { |
142 DCHECK(last_environment() != NULL); | 141 DCHECK(last_environment() != NULL); |
143 DCHECK(!last_environment()->ast_id().IsNone()); | 142 DCHECK(!last_environment()->ast_id().IsNone()); |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 !it.Done(); | 191 !it.Done(); |
193 it.Advance()) { | 192 it.Advance()) { |
194 int index = it.Current(); | 193 int index = it.Current(); |
195 instr->AddAssignedValue(index, environment->Lookup(index)); | 194 instr->AddAssignedValue(index, environment->Lookup(index)); |
196 } | 195 } |
197 environment->ClearHistory(); | 196 environment->ClearHistory(); |
198 return instr; | 197 return instr; |
199 } | 198 } |
200 | 199 |
201 | 200 |
202 void HBasicBlock::Finish(HControlInstruction* end, HSourcePosition position) { | 201 void HBasicBlock::Finish(HControlInstruction* end, SourcePosition position) { |
203 DCHECK(!IsFinished()); | 202 DCHECK(!IsFinished()); |
204 AddInstruction(end, position); | 203 AddInstruction(end, position); |
205 end_ = end; | 204 end_ = end; |
206 for (HSuccessorIterator it(end); !it.Done(); it.Advance()) { | 205 for (HSuccessorIterator it(end); !it.Done(); it.Advance()) { |
207 it.Current()->RegisterPredecessor(this); | 206 it.Current()->RegisterPredecessor(this); |
208 } | 207 } |
209 } | 208 } |
210 | 209 |
211 | 210 |
212 void HBasicBlock::Goto(HBasicBlock* block, | 211 void HBasicBlock::Goto(HBasicBlock* block, SourcePosition position, |
213 HSourcePosition position, | 212 FunctionState* state, bool add_simulate) { |
214 FunctionState* state, | |
215 bool add_simulate) { | |
216 bool drop_extra = state != NULL && | 213 bool drop_extra = state != NULL && |
217 state->inlining_kind() == NORMAL_RETURN; | 214 state->inlining_kind() == NORMAL_RETURN; |
218 | 215 |
219 if (block->IsInlineReturnTarget()) { | 216 if (block->IsInlineReturnTarget()) { |
220 HEnvironment* env = last_environment(); | 217 HEnvironment* env = last_environment(); |
221 int argument_count = env->arguments_environment()->parameter_count(); | 218 int argument_count = env->arguments_environment()->parameter_count(); |
222 AddInstruction(new(zone()) | 219 AddInstruction(new(zone()) |
223 HLeaveInlined(state->entry(), argument_count), | 220 HLeaveInlined(state->entry(), argument_count), |
224 position); | 221 position); |
225 UpdateEnvironment(last_environment()->DiscardInlined(drop_extra)); | 222 UpdateEnvironment(last_environment()->DiscardInlined(drop_extra)); |
226 } | 223 } |
227 | 224 |
228 if (add_simulate) AddNewSimulate(BailoutId::None(), position); | 225 if (add_simulate) AddNewSimulate(BailoutId::None(), position); |
229 HGoto* instr = new(zone()) HGoto(block); | 226 HGoto* instr = new(zone()) HGoto(block); |
230 Finish(instr, position); | 227 Finish(instr, position); |
231 } | 228 } |
232 | 229 |
233 | 230 |
234 void HBasicBlock::AddLeaveInlined(HValue* return_value, | 231 void HBasicBlock::AddLeaveInlined(HValue* return_value, FunctionState* state, |
235 FunctionState* state, | 232 SourcePosition position) { |
236 HSourcePosition position) { | |
237 HBasicBlock* target = state->function_return(); | 233 HBasicBlock* target = state->function_return(); |
238 bool drop_extra = state->inlining_kind() == NORMAL_RETURN; | 234 bool drop_extra = state->inlining_kind() == NORMAL_RETURN; |
239 | 235 |
240 DCHECK(target->IsInlineReturnTarget()); | 236 DCHECK(target->IsInlineReturnTarget()); |
241 DCHECK(return_value != NULL); | 237 DCHECK(return_value != NULL); |
242 HEnvironment* env = last_environment(); | 238 HEnvironment* env = last_environment(); |
243 int argument_count = env->arguments_environment()->parameter_count(); | 239 int argument_count = env->arguments_environment()->parameter_count(); |
244 AddInstruction(new(zone()) HLeaveInlined(state->entry(), argument_count), | 240 AddInstruction(new(zone()) HLeaveInlined(state->entry(), argument_count), |
245 position); | 241 position); |
246 UpdateEnvironment(last_environment()->DiscardInlined(drop_extra)); | 242 UpdateEnvironment(last_environment()->DiscardInlined(drop_extra)); |
(...skipping 775 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1022 } | 1018 } |
1023 current = current->next_; | 1019 current = current->next_; |
1024 } | 1020 } |
1025 | 1021 |
1026 // Merge deopt blocks, padding when necessary. | 1022 // Merge deopt blocks, padding when necessary. |
1027 current = merge_at_join_blocks_; | 1023 current = merge_at_join_blocks_; |
1028 while (current != NULL) { | 1024 while (current != NULL) { |
1029 if (current->deopt_ && current->block_ != NULL) { | 1025 if (current->deopt_ && current->block_ != NULL) { |
1030 current->block_->FinishExit( | 1026 current->block_->FinishExit( |
1031 HAbnormalExit::New(builder()->isolate(), builder()->zone(), NULL), | 1027 HAbnormalExit::New(builder()->isolate(), builder()->zone(), NULL), |
1032 HSourcePosition::Unknown()); | 1028 SourcePosition::Unknown()); |
1033 } | 1029 } |
1034 current = current->next_; | 1030 current = current->next_; |
1035 } | 1031 } |
1036 builder()->set_current_block(merge_block); | 1032 builder()->set_current_block(merge_block); |
1037 } | 1033 } |
1038 | 1034 |
1039 | 1035 |
1040 HGraphBuilder::LoopBuilder::LoopBuilder(HGraphBuilder* builder) { | 1036 HGraphBuilder::LoopBuilder::LoopBuilder(HGraphBuilder* builder) { |
1041 Initialize(builder, NULL, kWhileTrue, NULL); | 1037 Initialize(builder, NULL, kWhileTrue, NULL); |
1042 } | 1038 } |
(...skipping 2372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3415 HBasicBlock* HOptimizedGraphBuilder::BuildLoopEntry( | 3411 HBasicBlock* HOptimizedGraphBuilder::BuildLoopEntry( |
3416 IterationStatement* statement) { | 3412 IterationStatement* statement) { |
3417 HBasicBlock* loop_entry = osr()->HasOsrEntryAt(statement) | 3413 HBasicBlock* loop_entry = osr()->HasOsrEntryAt(statement) |
3418 ? osr()->BuildOsrLoopEntry(statement) | 3414 ? osr()->BuildOsrLoopEntry(statement) |
3419 : BuildLoopEntry(); | 3415 : BuildLoopEntry(); |
3420 return loop_entry; | 3416 return loop_entry; |
3421 } | 3417 } |
3422 | 3418 |
3423 | 3419 |
3424 void HBasicBlock::FinishExit(HControlInstruction* instruction, | 3420 void HBasicBlock::FinishExit(HControlInstruction* instruction, |
3425 HSourcePosition position) { | 3421 SourcePosition position) { |
3426 Finish(instruction, position); | 3422 Finish(instruction, position); |
3427 ClearEnvironment(); | 3423 ClearEnvironment(); |
3428 } | 3424 } |
3429 | 3425 |
3430 | 3426 |
3431 std::ostream& operator<<(std::ostream& os, const HBasicBlock& b) { | 3427 std::ostream& operator<<(std::ostream& os, const HBasicBlock& b) { |
3432 return os << "B" << b.block_id(); | 3428 return os << "B" << b.block_id(); |
3433 } | 3429 } |
3434 | 3430 |
3435 | 3431 |
(...skipping 14 matching lines...) Expand all Loading... |
3450 type_change_checksum_(0), | 3446 type_change_checksum_(0), |
3451 maximum_environment_size_(0), | 3447 maximum_environment_size_(0), |
3452 no_side_effects_scope_count_(0), | 3448 no_side_effects_scope_count_(0), |
3453 disallow_adding_new_values_(false) { | 3449 disallow_adding_new_values_(false) { |
3454 if (info->IsStub()) { | 3450 if (info->IsStub()) { |
3455 CallInterfaceDescriptor descriptor = | 3451 CallInterfaceDescriptor descriptor = |
3456 info->code_stub()->GetCallInterfaceDescriptor(); | 3452 info->code_stub()->GetCallInterfaceDescriptor(); |
3457 start_environment_ = new (zone_) | 3453 start_environment_ = new (zone_) |
3458 HEnvironment(zone_, descriptor.GetEnvironmentParameterCount()); | 3454 HEnvironment(zone_, descriptor.GetEnvironmentParameterCount()); |
3459 } else { | 3455 } else { |
3460 info->TraceInlinedFunction(info->shared_info(), | 3456 info->TraceInlinedFunction(info->shared_info(), SourcePosition::Unknown()); |
3461 HSourcePosition::Unknown().raw()); | |
3462 start_environment_ = | 3457 start_environment_ = |
3463 new(zone_) HEnvironment(NULL, info->scope(), info->closure(), zone_); | 3458 new(zone_) HEnvironment(NULL, info->scope(), info->closure(), zone_); |
3464 } | 3459 } |
3465 start_environment_->set_ast_id(BailoutId::FunctionEntry()); | 3460 start_environment_->set_ast_id(BailoutId::FunctionEntry()); |
3466 entry_block_ = CreateBasicBlock(); | 3461 entry_block_ = CreateBasicBlock(); |
3467 entry_block_->SetInitialEnvironment(start_environment_); | 3462 entry_block_->SetInitialEnvironment(start_environment_); |
3468 } | 3463 } |
3469 | 3464 |
3470 | 3465 |
3471 HBasicBlock* HGraph::CreateBasicBlock() { | 3466 HBasicBlock* HGraph::CreateBasicBlock() { |
3472 HBasicBlock* result = new(zone()) HBasicBlock(this); | 3467 HBasicBlock* result = new(zone()) HBasicBlock(this); |
3473 blocks_.Add(result, zone()); | 3468 blocks_.Add(result, zone()); |
3474 return result; | 3469 return result; |
3475 } | 3470 } |
3476 | 3471 |
3477 | 3472 |
3478 void HGraph::FinalizeUniqueness() { | 3473 void HGraph::FinalizeUniqueness() { |
3479 DisallowHeapAllocation no_gc; | 3474 DisallowHeapAllocation no_gc; |
3480 DCHECK(!OptimizingCompilerThread::IsOptimizerThread(isolate())); | 3475 DCHECK(!OptimizingCompilerThread::IsOptimizerThread(isolate())); |
3481 for (int i = 0; i < blocks()->length(); ++i) { | 3476 for (int i = 0; i < blocks()->length(); ++i) { |
3482 for (HInstructionIterator it(blocks()->at(i)); !it.Done(); it.Advance()) { | 3477 for (HInstructionIterator it(blocks()->at(i)); !it.Done(); it.Advance()) { |
3483 it.Current()->FinalizeUniqueness(); | 3478 it.Current()->FinalizeUniqueness(); |
3484 } | 3479 } |
3485 } | 3480 } |
3486 } | 3481 } |
3487 | 3482 |
3488 | 3483 |
3489 int HGraph::SourcePositionToScriptPosition(HSourcePosition pos) { | 3484 int HGraph::SourcePositionToScriptPosition(SourcePosition pos) { |
3490 if (!FLAG_hydrogen_track_positions || pos.IsUnknown()) { | 3485 if (!FLAG_hydrogen_track_positions || pos.IsUnknown()) { |
3491 return pos.raw(); | 3486 return pos.raw(); |
3492 } | 3487 } |
3493 | 3488 |
3494 const int id = info()->inlining_id_to_function_id()->at(pos.inlining_id()); | 3489 const int id = info()->inlining_id_to_function_id()->at(pos.inlining_id()); |
3495 return info()->inlined_function_infos()->at(id).start_position() + | 3490 return info()->inlined_function_infos()->at(id).start_position() + |
3496 pos.position(); | 3491 pos.position(); |
3497 } | 3492 } |
3498 | 3493 |
3499 | 3494 |
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3873 HPhi* phi = blocks_[i]->phis()->at(j); | 3868 HPhi* phi = blocks_[i]->phis()->at(j); |
3874 phi_list_->Add(phi, zone()); | 3869 phi_list_->Add(phi, zone()); |
3875 } | 3870 } |
3876 } | 3871 } |
3877 } | 3872 } |
3878 | 3873 |
3879 | 3874 |
3880 // Implementation of utility class to encapsulate the translation state for | 3875 // Implementation of utility class to encapsulate the translation state for |
3881 // a (possibly inlined) function. | 3876 // a (possibly inlined) function. |
3882 FunctionState::FunctionState(HOptimizedGraphBuilder* owner, | 3877 FunctionState::FunctionState(HOptimizedGraphBuilder* owner, |
3883 CompilationInfo* info, | 3878 CompilationInfo* info, InliningKind inlining_kind, |
3884 InliningKind inlining_kind, | |
3885 int inlining_id) | 3879 int inlining_id) |
3886 : owner_(owner), | 3880 : owner_(owner), |
3887 compilation_info_(info), | 3881 compilation_info_(info), |
3888 call_context_(NULL), | 3882 call_context_(NULL), |
3889 inlining_kind_(inlining_kind), | 3883 inlining_kind_(inlining_kind), |
3890 function_return_(NULL), | 3884 function_return_(NULL), |
3891 test_context_(NULL), | 3885 test_context_(NULL), |
3892 entry_(NULL), | 3886 entry_(NULL), |
3893 arguments_object_(NULL), | 3887 arguments_object_(NULL), |
3894 arguments_elements_(NULL), | 3888 arguments_elements_(NULL), |
3895 inlining_id_(inlining_id), | 3889 inlining_id_(inlining_id), |
3896 outer_source_position_(HSourcePosition::Unknown()), | 3890 outer_source_position_(SourcePosition::Unknown()), |
3897 outer_(owner->function_state()) { | 3891 outer_(owner->function_state()) { |
3898 if (outer_ != NULL) { | 3892 if (outer_ != NULL) { |
3899 // State for an inline function. | 3893 // State for an inline function. |
3900 if (owner->ast_context()->IsTest()) { | 3894 if (owner->ast_context()->IsTest()) { |
3901 HBasicBlock* if_true = owner->graph()->CreateBasicBlock(); | 3895 HBasicBlock* if_true = owner->graph()->CreateBasicBlock(); |
3902 HBasicBlock* if_false = owner->graph()->CreateBasicBlock(); | 3896 HBasicBlock* if_false = owner->graph()->CreateBasicBlock(); |
3903 if_true->MarkAsInlineReturnTarget(owner->current_block()); | 3897 if_true->MarkAsInlineReturnTarget(owner->current_block()); |
3904 if_false->MarkAsInlineReturnTarget(owner->current_block()); | 3898 if_false->MarkAsInlineReturnTarget(owner->current_block()); |
3905 TestContext* outer_test_context = TestContext::cast(owner->ast_context()); | 3899 TestContext* outer_test_context = TestContext::cast(owner->ast_context()); |
3906 Expression* cond = outer_test_context->condition(); | 3900 Expression* cond = outer_test_context->condition(); |
(...skipping 3902 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7809 } | 7803 } |
7810 | 7804 |
7811 int nodes_added = target_shared->ast_node_count(); | 7805 int nodes_added = target_shared->ast_node_count(); |
7812 return nodes_added; | 7806 return nodes_added; |
7813 } | 7807 } |
7814 | 7808 |
7815 | 7809 |
7816 bool HOptimizedGraphBuilder::TryInline(Handle<JSFunction> target, | 7810 bool HOptimizedGraphBuilder::TryInline(Handle<JSFunction> target, |
7817 int arguments_count, | 7811 int arguments_count, |
7818 HValue* implicit_return_value, | 7812 HValue* implicit_return_value, |
7819 BailoutId ast_id, | 7813 BailoutId ast_id, BailoutId return_id, |
7820 BailoutId return_id, | |
7821 InliningKind inlining_kind, | 7814 InliningKind inlining_kind, |
7822 HSourcePosition position) { | 7815 SourcePosition position) { |
7823 int nodes_added = InliningAstSize(target); | 7816 int nodes_added = InliningAstSize(target); |
7824 if (nodes_added == kNotInlinable) return false; | 7817 if (nodes_added == kNotInlinable) return false; |
7825 | 7818 |
7826 Handle<JSFunction> caller = current_info()->closure(); | 7819 Handle<JSFunction> caller = current_info()->closure(); |
7827 | 7820 |
7828 if (nodes_added > Min(FLAG_max_inlined_nodes, kUnlimitedMaxInlinedNodes)) { | 7821 if (nodes_added > Min(FLAG_max_inlined_nodes, kUnlimitedMaxInlinedNodes)) { |
7829 TraceInline(target, caller, "target AST is too large [early]"); | 7822 TraceInline(target, caller, "target AST is too large [early]"); |
7830 return false; | 7823 return false; |
7831 } | 7824 } |
7832 | 7825 |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7924 } | 7917 } |
7925 | 7918 |
7926 // ---------------------------------------------------------------- | 7919 // ---------------------------------------------------------------- |
7927 // After this point, we've made a decision to inline this function (so | 7920 // After this point, we've made a decision to inline this function (so |
7928 // TryInline should always return true). | 7921 // TryInline should always return true). |
7929 | 7922 |
7930 // Type-check the inlined function. | 7923 // Type-check the inlined function. |
7931 DCHECK(target_shared->has_deoptimization_support()); | 7924 DCHECK(target_shared->has_deoptimization_support()); |
7932 AstTyper::Run(&target_info); | 7925 AstTyper::Run(&target_info); |
7933 | 7926 |
7934 int function_id = | 7927 int function_id = top_info()->TraceInlinedFunction(target_shared, position); |
7935 top_info()->TraceInlinedFunction(target_shared, position.raw()); | |
7936 | 7928 |
7937 // Save the pending call context. Set up new one for the inlined function. | 7929 // Save the pending call context. Set up new one for the inlined function. |
7938 // The function state is new-allocated because we need to delete it | 7930 // The function state is new-allocated because we need to delete it |
7939 // in two different places. | 7931 // in two different places. |
7940 FunctionState* target_state = new FunctionState( | 7932 FunctionState* target_state = new FunctionState( |
7941 this, &target_info, inlining_kind, function_id); | 7933 this, &target_info, inlining_kind, function_id); |
7942 | 7934 |
7943 HConstant* undefined = graph()->GetConstantUndefined(); | 7935 HConstant* undefined = graph()->GetConstantUndefined(); |
7944 | 7936 |
7945 HEnvironment* inner_env = | 7937 HEnvironment* inner_env = |
(...skipping 2986 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10932 op, left, right, left_type, right_type, combined_type, | 10924 op, left, right, left_type, right_type, combined_type, |
10933 ScriptPositionToSourcePosition(expr->left()->position()), | 10925 ScriptPositionToSourcePosition(expr->left()->position()), |
10934 ScriptPositionToSourcePosition(expr->right()->position()), | 10926 ScriptPositionToSourcePosition(expr->right()->position()), |
10935 push_behavior, expr->id()); | 10927 push_behavior, expr->id()); |
10936 if (compare == NULL) return; // Bailed out. | 10928 if (compare == NULL) return; // Bailed out. |
10937 return ast_context()->ReturnControl(compare, expr->id()); | 10929 return ast_context()->ReturnControl(compare, expr->id()); |
10938 } | 10930 } |
10939 | 10931 |
10940 | 10932 |
10941 HControlInstruction* HOptimizedGraphBuilder::BuildCompareInstruction( | 10933 HControlInstruction* HOptimizedGraphBuilder::BuildCompareInstruction( |
10942 Token::Value op, | 10934 Token::Value op, HValue* left, HValue* right, Type* left_type, |
10943 HValue* left, | 10935 Type* right_type, Type* combined_type, SourcePosition left_position, |
10944 HValue* right, | 10936 SourcePosition right_position, PushBeforeSimulateBehavior push_sim_result, |
10945 Type* left_type, | |
10946 Type* right_type, | |
10947 Type* combined_type, | |
10948 HSourcePosition left_position, | |
10949 HSourcePosition right_position, | |
10950 PushBeforeSimulateBehavior push_sim_result, | |
10951 BailoutId bailout_id) { | 10937 BailoutId bailout_id) { |
10952 // Cases handled below depend on collected type feedback. They should | 10938 // Cases handled below depend on collected type feedback. They should |
10953 // soft deoptimize when there is no type feedback. | 10939 // soft deoptimize when there is no type feedback. |
10954 if (!combined_type->IsInhabited()) { | 10940 if (!combined_type->IsInhabited()) { |
10955 Add<HDeoptimize>( | 10941 Add<HDeoptimize>( |
10956 Deoptimizer::kInsufficientTypeFeedbackForCombinedTypeOfBinaryOperation, | 10942 Deoptimizer::kInsufficientTypeFeedbackForCombinedTypeOfBinaryOperation, |
10957 Deoptimizer::SOFT); | 10943 Deoptimizer::SOFT); |
10958 combined_type = left_type = right_type = Type::Any(zone()); | 10944 combined_type = left_type = right_type = Type::Any(zone()); |
10959 } | 10945 } |
10960 | 10946 |
(...skipping 2288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13249 Tag HIR_tag(this, "HIR"); | 13235 Tag HIR_tag(this, "HIR"); |
13250 for (HInstructionIterator it(current); !it.Done(); it.Advance()) { | 13236 for (HInstructionIterator it(current); !it.Done(); it.Advance()) { |
13251 HInstruction* instruction = it.Current(); | 13237 HInstruction* instruction = it.Current(); |
13252 int uses = instruction->UseCount(); | 13238 int uses = instruction->UseCount(); |
13253 PrintIndent(); | 13239 PrintIndent(); |
13254 std::ostringstream os; | 13240 std::ostringstream os; |
13255 os << "0 " << uses << " " << NameOf(instruction) << " " << *instruction; | 13241 os << "0 " << uses << " " << NameOf(instruction) << " " << *instruction; |
13256 if (FLAG_hydrogen_track_positions && | 13242 if (FLAG_hydrogen_track_positions && |
13257 instruction->has_position() && | 13243 instruction->has_position() && |
13258 instruction->position().raw() != 0) { | 13244 instruction->position().raw() != 0) { |
13259 const HSourcePosition pos = instruction->position(); | 13245 const SourcePosition pos = instruction->position(); |
13260 os << " pos:"; | 13246 os << " pos:"; |
13261 if (pos.inlining_id() != 0) os << pos.inlining_id() << "_"; | 13247 if (pos.inlining_id() != 0) os << pos.inlining_id() << "_"; |
13262 os << pos.position(); | 13248 os << pos.position(); |
13263 } | 13249 } |
13264 os << " <|@\n"; | 13250 os << " <|@\n"; |
13265 trace_.Add(os.str().c_str()); | 13251 trace_.Add(os.str().c_str()); |
13266 } | 13252 } |
13267 } | 13253 } |
13268 | 13254 |
13269 | 13255 |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13457 if (ShouldProduceTraceOutput()) { | 13443 if (ShouldProduceTraceOutput()) { |
13458 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 13444 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
13459 } | 13445 } |
13460 | 13446 |
13461 #ifdef DEBUG | 13447 #ifdef DEBUG |
13462 graph_->Verify(false); // No full verify. | 13448 graph_->Verify(false); // No full verify. |
13463 #endif | 13449 #endif |
13464 } | 13450 } |
13465 | 13451 |
13466 } } // namespace v8::internal | 13452 } } // namespace v8::internal |
OLD | NEW |