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

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

Issue 1650493002: [crankshaft] Make the for-in slow path compatible with the other compilers. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 10 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
« no previous file with comments | « no previous file | test/mjsunit/regress/regress-4715.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 5359 matching lines...) Expand 10 before | Expand all | Expand 10 after
5370 } 5370 }
5371 } 5371 }
5372 5372
5373 Push(graph()->GetConstant0()); 5373 Push(graph()->GetConstant0());
5374 5374
5375 HBasicBlock* loop_entry = BuildLoopEntry(stmt); 5375 HBasicBlock* loop_entry = BuildLoopEntry(stmt);
5376 5376
5377 // Reload the values to ensure we have up-to-date values inside of the loop. 5377 // Reload the values to ensure we have up-to-date values inside of the loop.
5378 // This is relevant especially for OSR where the values don't come from the 5378 // This is relevant especially for OSR where the values don't come from the
5379 // computation above, but from the OSR entry block. 5379 // computation above, but from the OSR entry block.
5380 enumerable = environment()->ExpressionStackAt(4);
5381 HValue* index = environment()->ExpressionStackAt(0); 5380 HValue* index = environment()->ExpressionStackAt(0);
5382 HValue* limit = environment()->ExpressionStackAt(1); 5381 HValue* limit = environment()->ExpressionStackAt(1);
5382 HValue* array = environment()->ExpressionStackAt(2);
5383 HValue* type = environment()->ExpressionStackAt(3);
5384 enumerable = environment()->ExpressionStackAt(4);
5383 5385
5384 // Check that we still have more keys. 5386 // Check that we still have more keys.
5385 HCompareNumericAndBranch* compare_index = 5387 HCompareNumericAndBranch* compare_index =
5386 New<HCompareNumericAndBranch>(index, limit, Token::LT); 5388 New<HCompareNumericAndBranch>(index, limit, Token::LT);
5387 compare_index->set_observed_input_representation( 5389 compare_index->set_observed_input_representation(
5388 Representation::Smi(), Representation::Smi()); 5390 Representation::Smi(), Representation::Smi());
5389 5391
5390 HBasicBlock* loop_body = graph()->CreateBasicBlock(); 5392 HBasicBlock* loop_body = graph()->CreateBasicBlock();
5391 HBasicBlock* loop_successor = graph()->CreateBasicBlock(); 5393 HBasicBlock* loop_successor = graph()->CreateBasicBlock();
5392 5394
5393 compare_index->SetSuccessorAt(0, loop_body); 5395 compare_index->SetSuccessorAt(0, loop_body);
5394 compare_index->SetSuccessorAt(1, loop_successor); 5396 compare_index->SetSuccessorAt(1, loop_successor);
5395 FinishCurrentBlock(compare_index); 5397 FinishCurrentBlock(compare_index);
5396 5398
5397 set_current_block(loop_successor); 5399 set_current_block(loop_successor);
5398 Drop(5); 5400 Drop(5);
5399 5401
5400 set_current_block(loop_body); 5402 set_current_block(loop_body);
5401 5403
5402 HValue* key = 5404 HValue* key = Add<HLoadKeyed>(array, index, index, nullptr, FAST_ELEMENTS);
5403 Add<HLoadKeyed>(environment()->ExpressionStackAt(2), // Enum cache.
5404 index, index, nullptr, FAST_ELEMENTS);
5405 5405
5406 if (fast) { 5406 if (fast) {
5407 // Check if the expected map still matches that of the enumerable. 5407 // Check if the expected map still matches that of the enumerable.
5408 // If not just deoptimize. 5408 // If not just deoptimize.
5409 Add<HCheckMapValue>(enumerable, environment()->ExpressionStackAt(3)); 5409 Add<HCheckMapValue>(enumerable, type);
5410 Bind(each_var, key); 5410 Bind(each_var, key);
5411 } else { 5411 } else {
5412 Add<HPushArguments>(enumerable, key); 5412 HValue* enumerable_map =
5413 Runtime::FunctionId function_id = Runtime::kForInFilter; 5413 Add<HLoadNamedField>(enumerable, nullptr, HObjectAccess::ForMap());
5414 key = Add<HCallRuntime>(Runtime::FunctionForId(function_id), 2); 5414 IfBuilder if_fast(this);
5415 Push(key); 5415 if_fast.If<HCompareObjectEqAndBranch>(enumerable_map, type);
5416 Add<HSimulate>(stmt->FilterId()); 5416 if_fast.Then();
5417 {
5418 Push(key);
5419 Add<HSimulate>(stmt->FilterId());
5420 }
5421 if_fast.Else();
5422 {
5423 Add<HPushArguments>(enumerable, key);
5424 Runtime::FunctionId function_id = Runtime::kForInFilter;
5425 Push(Add<HCallRuntime>(Runtime::FunctionForId(function_id), 2));
5426 Add<HSimulate>(stmt->FilterId());
5427 }
5428 if_fast.End();
5417 key = Pop(); 5429 key = Pop();
5418 Bind(each_var, key); 5430 Bind(each_var, key);
5419 IfBuilder if_undefined(this); 5431 IfBuilder if_undefined(this);
5420 if_undefined.If<HCompareObjectEqAndBranch>(key, 5432 if_undefined.If<HCompareObjectEqAndBranch>(key,
5421 graph()->GetConstantUndefined()); 5433 graph()->GetConstantUndefined());
5422 if_undefined.ThenDeopt(Deoptimizer::kUndefined); 5434 if_undefined.ThenDeopt(Deoptimizer::kUndefined);
5423 if_undefined.End(); 5435 if_undefined.End();
5424 Add<HSimulate>(stmt->AssignmentId()); 5436 Add<HSimulate>(stmt->AssignmentId());
5425 } 5437 }
5426 5438
(...skipping 8200 matching lines...) Expand 10 before | Expand all | Expand 10 after
13627 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 13639 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
13628 } 13640 }
13629 13641
13630 #ifdef DEBUG 13642 #ifdef DEBUG
13631 graph_->Verify(false); // No full verify. 13643 graph_->Verify(false); // No full verify.
13632 #endif 13644 #endif
13633 } 13645 }
13634 13646
13635 } // namespace internal 13647 } // namespace internal
13636 } // namespace v8 13648 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/regress/regress-4715.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698