Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(21)

Side by Side Diff: src/crankshaft/hydrogen.cc

Issue 1968383002: Remove Expression::bounds_, in order to conserve memory during parsing. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Remove Expression::bounds_ Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/crankshaft/hydrogen.h" 5 #include "src/crankshaft/hydrogen.h"
6 6
7 #include <sstream> 7 #include <sstream>
8 8
9 #include "src/allocation-site-scopes.h" 9 #include "src/allocation-site-scopes.h"
10 #include "src/ast/ast-numbering.h" 10 #include "src/ast/ast-numbering.h"
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
160 160
161 if (IsGeneratorFunction(info()->shared_info()->kind())) { 161 if (IsGeneratorFunction(info()->shared_info()->kind())) {
162 // Crankshaft does not support generators. 162 // Crankshaft does not support generators.
163 return AbortOptimization(kGenerator); 163 return AbortOptimization(kGenerator);
164 } 164 }
165 165
166 if (FLAG_trace_hydrogen) { 166 if (FLAG_trace_hydrogen) {
167 isolate()->GetHTracer()->TraceCompilation(info()); 167 isolate()->GetHTracer()->TraceCompilation(info());
168 } 168 }
169 169
170 // Type-check the function.
171 AstTyper(info()->isolate(), info()->zone(), info()->closure(),
172 info()->scope(), info()->osr_ast_id(), info()->literal())
173 .Run();
174
175 // Optimization could have been disabled by the parser. Note that this check 170 // Optimization could have been disabled by the parser. Note that this check
176 // is only needed because the Hydrogen graph builder is missing some bailouts. 171 // is only needed because the Hydrogen graph builder is missing some bailouts.
177 if (info()->shared_info()->optimization_disabled()) { 172 if (info()->shared_info()->optimization_disabled()) {
178 return AbortOptimization( 173 return AbortOptimization(
179 info()->shared_info()->disable_optimization_reason()); 174 info()->shared_info()->disable_optimization_reason());
180 } 175 }
181 176
182 HOptimizedGraphBuilder* graph_builder = 177 HOptimizedGraphBuilder* graph_builder =
183 (info()->is_tracking_positions() || FLAG_trace_ic) 178 (info()->is_tracking_positions() || FLAG_trace_ic)
184 ? new (info()->zone()) HOptimizedGraphBuilderWithPositions(info()) 179 ? new (info()->zone()) HOptimizedGraphBuilderWithPositions(info())
185 : new (info()->zone()) HOptimizedGraphBuilder(info()); 180 : new (info()->zone()) HOptimizedGraphBuilder(info());
186 181
182 // Type-check the function.
183 AstTyper(info()->isolate(), info()->zone(), info()->closure(),
184 info()->scope(), info()->osr_ast_id(), info()->literal(),
185 graph_builder->bounds())
186 .Run();
187
187 graph_ = graph_builder->CreateGraph(); 188 graph_ = graph_builder->CreateGraph();
188 189
189 if (isolate()->has_pending_exception()) { 190 if (isolate()->has_pending_exception()) {
190 return FAILED; 191 return FAILED;
191 } 192 }
192 193
193 if (graph_ == NULL) return FAILED; 194 if (graph_ == NULL) return FAILED;
194 195
195 if (info()->dependencies()->HasAborted()) { 196 if (info()->dependencies()->HasAborted()) {
196 // Dependency has changed during graph creation. Let's try again later. 197 // Dependency has changed during graph creation. Let's try again later.
(...skipping 3479 matching lines...) Expand 10 before | Expand all | Expand 10 after
3676 3677
3677 HOptimizedGraphBuilder::HOptimizedGraphBuilder(CompilationInfo* info) 3678 HOptimizedGraphBuilder::HOptimizedGraphBuilder(CompilationInfo* info)
3678 : HGraphBuilder(info, CallInterfaceDescriptor()), 3679 : HGraphBuilder(info, CallInterfaceDescriptor()),
3679 function_state_(NULL), 3680 function_state_(NULL),
3680 initial_function_state_(this, info, NORMAL_RETURN, 0, 3681 initial_function_state_(this, info, NORMAL_RETURN, 0,
3681 TailCallMode::kAllow), 3682 TailCallMode::kAllow),
3682 ast_context_(NULL), 3683 ast_context_(NULL),
3683 break_scope_(NULL), 3684 break_scope_(NULL),
3684 inlined_count_(0), 3685 inlined_count_(0),
3685 globals_(10, info->zone()), 3686 globals_(10, info->zone()),
3686 osr_(new (info->zone()) HOsrBuilder(this)) { 3687 osr_(new (info->zone()) HOsrBuilder(this)),
3688 bounds_(info->zone()) {
3687 // This is not initialized in the initializer list because the 3689 // This is not initialized in the initializer list because the
3688 // constructor for the initial state relies on function_state_ == NULL 3690 // constructor for the initial state relies on function_state_ == NULL
3689 // to know it's the initial state. 3691 // to know it's the initial state.
3690 function_state_ = &initial_function_state_; 3692 function_state_ = &initial_function_state_;
3691 InitializeAstVisitor(info->isolate()); 3693 InitializeAstVisitor(info->isolate());
3692 if (top_info()->is_tracking_positions()) { 3694 if (top_info()->is_tracking_positions()) {
3693 SetSourcePosition(info->shared_info()->start_position()); 3695 SetSourcePosition(info->shared_info()->start_position());
3694 } 3696 }
3695 } 3697 }
3696 3698
(...skipping 1468 matching lines...) Expand 10 before | Expand all | Expand 10 after
5165 DCHECK(current_block() != NULL); 5167 DCHECK(current_block() != NULL);
5166 DCHECK(current_block()->HasPredecessor()); 5168 DCHECK(current_block()->HasPredecessor());
5167 5169
5168 ZoneList<CaseClause*>* clauses = stmt->cases(); 5170 ZoneList<CaseClause*>* clauses = stmt->cases();
5169 int clause_count = clauses->length(); 5171 int clause_count = clauses->length();
5170 ZoneList<HBasicBlock*> body_blocks(clause_count, zone()); 5172 ZoneList<HBasicBlock*> body_blocks(clause_count, zone());
5171 5173
5172 CHECK_ALIVE(VisitForValue(stmt->tag())); 5174 CHECK_ALIVE(VisitForValue(stmt->tag()));
5173 Add<HSimulate>(stmt->EntryId()); 5175 Add<HSimulate>(stmt->EntryId());
5174 HValue* tag_value = Top(); 5176 HValue* tag_value = Top();
5175 Type* tag_type = stmt->tag()->bounds().lower; 5177 Type* tag_type = bounds_.get(stmt->tag()).lower;
5176 5178
5177 // 1. Build all the tests, with dangling true branches 5179 // 1. Build all the tests, with dangling true branches
5178 BailoutId default_id = BailoutId::None(); 5180 BailoutId default_id = BailoutId::None();
5179 for (int i = 0; i < clause_count; ++i) { 5181 for (int i = 0; i < clause_count; ++i) {
5180 CaseClause* clause = clauses->at(i); 5182 CaseClause* clause = clauses->at(i);
5181 if (clause->is_default()) { 5183 if (clause->is_default()) {
5182 body_blocks.Add(NULL, zone()); 5184 body_blocks.Add(NULL, zone());
5183 if (default_id.IsNone()) default_id = clause->EntryId(); 5185 if (default_id.IsNone()) default_id = clause->EntryId();
5184 continue; 5186 continue;
5185 } 5187 }
5186 5188
5187 // Generate a compare and branch. 5189 // Generate a compare and branch.
5188 CHECK_BAILOUT(VisitForValue(clause->label())); 5190 CHECK_BAILOUT(VisitForValue(clause->label()));
5189 if (current_block() == NULL) return Bailout(kUnsupportedSwitchStatement); 5191 if (current_block() == NULL) return Bailout(kUnsupportedSwitchStatement);
5190 HValue* label_value = Pop(); 5192 HValue* label_value = Pop();
5191 5193
5192 Type* label_type = clause->label()->bounds().lower; 5194 Type* label_type = bounds_.get(clause->label()).lower;
5193 Type* combined_type = clause->compare_type(); 5195 Type* combined_type = clause->compare_type();
5194 HControlInstruction* compare = BuildCompareInstruction( 5196 HControlInstruction* compare = BuildCompareInstruction(
5195 Token::EQ_STRICT, tag_value, label_value, tag_type, label_type, 5197 Token::EQ_STRICT, tag_value, label_value, tag_type, label_type,
5196 combined_type, 5198 combined_type,
5197 ScriptPositionToSourcePosition(stmt->tag()->position()), 5199 ScriptPositionToSourcePosition(stmt->tag()->position()),
5198 ScriptPositionToSourcePosition(clause->label()->position()), 5200 ScriptPositionToSourcePosition(clause->label()->position()),
5199 PUSH_BEFORE_SIMULATE, clause->id()); 5201 PUSH_BEFORE_SIMULATE, clause->id());
5200 5202
5201 HBasicBlock* next_test_block = graph()->CreateBasicBlock(); 5203 HBasicBlock* next_test_block = graph()->CreateBasicBlock();
5202 HBasicBlock* body_block = graph()->CreateBasicBlock(); 5204 HBasicBlock* body_block = graph()->CreateBasicBlock();
(...skipping 3443 matching lines...) Expand 10 before | Expand all | Expand 10 after
8646 // does not remove the code with the deoptimization support. 8648 // does not remove the code with the deoptimization support.
8647 top_info()->AddInlinedFunction(target_info.shared_info()); 8649 top_info()->AddInlinedFunction(target_info.shared_info());
8648 8650
8649 // ---------------------------------------------------------------- 8651 // ----------------------------------------------------------------
8650 // After this point, we've made a decision to inline this function (so 8652 // After this point, we've made a decision to inline this function (so
8651 // TryInline should always return true). 8653 // TryInline should always return true).
8652 8654
8653 // Type-check the inlined function. 8655 // Type-check the inlined function.
8654 DCHECK(target_shared->has_deoptimization_support()); 8656 DCHECK(target_shared->has_deoptimization_support());
8655 AstTyper(target_info.isolate(), target_info.zone(), target_info.closure(), 8657 AstTyper(target_info.isolate(), target_info.zone(), target_info.closure(),
8656 target_info.scope(), target_info.osr_ast_id(), target_info.literal()) 8658 target_info.scope(), target_info.osr_ast_id(), target_info.literal(),
8659 &bounds_)
8657 .Run(); 8660 .Run();
8658 8661
8659 int inlining_id = 0; 8662 int inlining_id = 0;
8660 if (top_info()->is_tracking_positions()) { 8663 if (top_info()->is_tracking_positions()) {
8661 inlining_id = TraceInlinedFunction(target_shared, source_position(), 8664 inlining_id = TraceInlinedFunction(target_shared, source_position(),
8662 function_state()->inlining_id()); 8665 function_state()->inlining_id());
8663 } 8666 }
8664 8667
8665 // Save the pending call context. Set up new one for the inlined function. 8668 // Save the pending call context. Set up new one for the inlined function.
8666 // The function state is new-allocated because we need to delete it 8669 // The function state is new-allocated because we need to delete it
(...skipping 2453 matching lines...) Expand 10 before | Expand all | Expand 10 after
11120 11123
11121 return value; 11124 return value;
11122 } 11125 }
11123 11126
11124 11127
11125 HValue* HOptimizedGraphBuilder::BuildBinaryOperation( 11128 HValue* HOptimizedGraphBuilder::BuildBinaryOperation(
11126 BinaryOperation* expr, 11129 BinaryOperation* expr,
11127 HValue* left, 11130 HValue* left,
11128 HValue* right, 11131 HValue* right,
11129 PushBeforeSimulateBehavior push_sim_result) { 11132 PushBeforeSimulateBehavior push_sim_result) {
11130 Type* left_type = expr->left()->bounds().lower; 11133 Type* left_type = bounds_.get(expr->left()).lower;
11131 Type* right_type = expr->right()->bounds().lower; 11134 Type* right_type = bounds_.get(expr->right()).lower;
11132 Type* result_type = expr->bounds().lower; 11135 Type* result_type = bounds_.get(expr).lower;
11133 Maybe<int> fixed_right_arg = expr->fixed_right_arg(); 11136 Maybe<int> fixed_right_arg = expr->fixed_right_arg();
11134 Handle<AllocationSite> allocation_site = expr->allocation_site(); 11137 Handle<AllocationSite> allocation_site = expr->allocation_site();
11135 11138
11136 HAllocationMode allocation_mode; 11139 HAllocationMode allocation_mode;
11137 if (FLAG_allocation_site_pretenuring && !allocation_site.is_null()) { 11140 if (FLAG_allocation_site_pretenuring && !allocation_site.is_null()) {
11138 allocation_mode = HAllocationMode(allocation_site); 11141 allocation_mode = HAllocationMode(allocation_site);
11139 } 11142 }
11140 HValue* result = HGraphBuilder::BuildBinaryOperation( 11143 HValue* result = HGraphBuilder::BuildBinaryOperation(
11141 expr->op(), left, right, left_type, right_type, result_type, 11144 expr->op(), left, right, left_type, right_type, result_type,
11142 fixed_right_arg, allocation_mode, expr->id()); 11145 fixed_right_arg, allocation_mode, expr->id());
(...skipping 514 matching lines...) Expand 10 before | Expand all | Expand 10 after
11657 CallRuntime* call = expr->left()->AsCallRuntime(); 11660 CallRuntime* call = expr->left()->AsCallRuntime();
11658 DCHECK(call->arguments()->length() == 1); 11661 DCHECK(call->arguments()->length() == 1);
11659 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); 11662 CHECK_ALIVE(VisitForValue(call->arguments()->at(0)));
11660 HValue* value = Pop(); 11663 HValue* value = Pop();
11661 Literal* literal = expr->right()->AsLiteral(); 11664 Literal* literal = expr->right()->AsLiteral();
11662 Handle<String> rhs = Handle<String>::cast(literal->value()); 11665 Handle<String> rhs = Handle<String>::cast(literal->value());
11663 HClassOfTestAndBranch* instr = New<HClassOfTestAndBranch>(value, rhs); 11666 HClassOfTestAndBranch* instr = New<HClassOfTestAndBranch>(value, rhs);
11664 return ast_context()->ReturnControl(instr, expr->id()); 11667 return ast_context()->ReturnControl(instr, expr->id());
11665 } 11668 }
11666 11669
11667 Type* left_type = expr->left()->bounds().lower; 11670 Type* left_type = bounds_.get(expr->left()).lower;
11668 Type* right_type = expr->right()->bounds().lower; 11671 Type* right_type = bounds_.get(expr->right()).lower;
11669 Type* combined_type = expr->combined_type(); 11672 Type* combined_type = expr->combined_type();
11670 11673
11671 CHECK_ALIVE(VisitForValue(expr->left())); 11674 CHECK_ALIVE(VisitForValue(expr->left()));
11672 CHECK_ALIVE(VisitForValue(expr->right())); 11675 CHECK_ALIVE(VisitForValue(expr->right()));
11673 11676
11674 HValue* right = Pop(); 11677 HValue* right = Pop();
11675 HValue* left = Pop(); 11678 HValue* left = Pop();
11676 Token::Value op = expr->op(); 11679 Token::Value op = expr->op();
11677 11680
11678 if (IsLiteralCompareBool(isolate(), left, op, right)) { 11681 if (IsLiteralCompareBool(isolate(), left, op, right)) {
(...skipping 2066 matching lines...) Expand 10 before | Expand all | Expand 10 after
13745 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 13748 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
13746 } 13749 }
13747 13750
13748 #ifdef DEBUG 13751 #ifdef DEBUG
13749 graph_->Verify(false); // No full verify. 13752 graph_->Verify(false); // No full verify.
13750 #endif 13753 #endif
13751 } 13754 }
13752 13755
13753 } // namespace internal 13756 } // namespace internal
13754 } // namespace v8 13757 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698