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

Side by Side Diff: src/hydrogen.cc

Issue 166503002: Test and fix for polymorphic named call deoptimization. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | test/mjsunit/regress/number-named-call-deopt.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 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 5620 matching lines...) Expand 10 before | Expand all | Expand 10 after
5631 5631
5632 if (count == 0) { 5632 if (count == 0) {
5633 join = graph()->CreateBasicBlock(); 5633 join = graph()->CreateBasicBlock();
5634 if (handle_smi) { 5634 if (handle_smi) {
5635 HBasicBlock* empty_smi_block = graph()->CreateBasicBlock(); 5635 HBasicBlock* empty_smi_block = graph()->CreateBasicBlock();
5636 HBasicBlock* not_smi_block = graph()->CreateBasicBlock(); 5636 HBasicBlock* not_smi_block = graph()->CreateBasicBlock();
5637 number_block = graph()->CreateBasicBlock(); 5637 number_block = graph()->CreateBasicBlock();
5638 smi_check = New<HIsSmiAndBranch>( 5638 smi_check = New<HIsSmiAndBranch>(
5639 object, empty_smi_block, not_smi_block); 5639 object, empty_smi_block, not_smi_block);
5640 FinishCurrentBlock(smi_check); 5640 FinishCurrentBlock(smi_check);
5641 Goto(empty_smi_block, number_block); 5641 GotoNoSimulate(empty_smi_block, number_block);
5642 set_current_block(not_smi_block); 5642 set_current_block(not_smi_block);
5643 } else { 5643 } else {
5644 BuildCheckHeapObject(object); 5644 BuildCheckHeapObject(object);
5645 } 5645 }
5646 } 5646 }
5647 ++count; 5647 ++count;
5648 HBasicBlock* if_true = graph()->CreateBasicBlock(); 5648 HBasicBlock* if_true = graph()->CreateBasicBlock();
5649 HBasicBlock* if_false = graph()->CreateBasicBlock(); 5649 HBasicBlock* if_false = graph()->CreateBasicBlock();
5650 HUnaryControlInstruction* compare; 5650 HUnaryControlInstruction* compare;
5651 5651
5652 HValue* dependency; 5652 HValue* dependency;
5653 if (info.type()->Is(Type::Number())) { 5653 if (info.type()->Is(Type::Number())) {
5654 Handle<Map> heap_number_map = isolate()->factory()->heap_number_map(); 5654 Handle<Map> heap_number_map = isolate()->factory()->heap_number_map();
5655 compare = New<HCompareMap>(object, heap_number_map, top_info(), 5655 compare = New<HCompareMap>(object, heap_number_map, top_info(),
5656 if_true, if_false); 5656 if_true, if_false);
5657 dependency = smi_check; 5657 dependency = smi_check;
5658 } else if (info.type()->Is(Type::String())) { 5658 } else if (info.type()->Is(Type::String())) {
5659 compare = New<HIsStringAndBranch>(object, if_true, if_false); 5659 compare = New<HIsStringAndBranch>(object, if_true, if_false);
5660 dependency = compare; 5660 dependency = compare;
5661 } else { 5661 } else {
5662 compare = New<HCompareMap>(object, info.map(), top_info(), 5662 compare = New<HCompareMap>(object, info.map(), top_info(),
5663 if_true, if_false); 5663 if_true, if_false);
5664 dependency = compare; 5664 dependency = compare;
5665 } 5665 }
5666 FinishCurrentBlock(compare); 5666 FinishCurrentBlock(compare);
5667 5667
5668 if (info.type()->Is(Type::Number())) { 5668 if (info.type()->Is(Type::Number())) {
5669 Goto(if_true, number_block); 5669 GotoNoSimulate(if_true, number_block);
5670 if_true = number_block; 5670 if_true = number_block;
5671 number_block->SetJoinId(ast_id);
5672 } 5671 }
5673 5672
5674 set_current_block(if_true); 5673 set_current_block(if_true);
5675 5674
5676 HInstruction* access = BuildMonomorphicAccess( 5675 HInstruction* access = BuildMonomorphicAccess(
5677 &info, object, dependency, value, ast_id, 5676 &info, object, dependency, value, ast_id,
5678 return_id, FLAG_polymorphic_inlining); 5677 return_id, FLAG_polymorphic_inlining);
5679 5678
5680 HValue* result = NULL; 5679 HValue* result = NULL;
5681 switch (access_type) { 5680 switch (access_type) {
(...skipping 1155 matching lines...) Expand 10 before | Expand all | Expand 10 after
6837 expr->set_target(target); 6836 expr->set_target(target);
6838 if (count == 0) { 6837 if (count == 0) {
6839 // Only needed once. 6838 // Only needed once.
6840 join = graph()->CreateBasicBlock(); 6839 join = graph()->CreateBasicBlock();
6841 if (handle_smi) { 6840 if (handle_smi) {
6842 HBasicBlock* empty_smi_block = graph()->CreateBasicBlock(); 6841 HBasicBlock* empty_smi_block = graph()->CreateBasicBlock();
6843 HBasicBlock* not_smi_block = graph()->CreateBasicBlock(); 6842 HBasicBlock* not_smi_block = graph()->CreateBasicBlock();
6844 number_block = graph()->CreateBasicBlock(); 6843 number_block = graph()->CreateBasicBlock();
6845 FinishCurrentBlock(New<HIsSmiAndBranch>( 6844 FinishCurrentBlock(New<HIsSmiAndBranch>(
6846 receiver, empty_smi_block, not_smi_block)); 6845 receiver, empty_smi_block, not_smi_block));
6847 Goto(empty_smi_block, number_block); 6846 GotoNoSimulate(empty_smi_block, number_block);
6848 set_current_block(not_smi_block); 6847 set_current_block(not_smi_block);
6849 } else { 6848 } else {
6850 BuildCheckHeapObject(receiver); 6849 BuildCheckHeapObject(receiver);
6851 } 6850 }
6852 } 6851 }
6853 ++count; 6852 ++count;
6854 HBasicBlock* if_true = graph()->CreateBasicBlock(); 6853 HBasicBlock* if_true = graph()->CreateBasicBlock();
6855 HBasicBlock* if_false = graph()->CreateBasicBlock(); 6854 HBasicBlock* if_false = graph()->CreateBasicBlock();
6856 HUnaryControlInstruction* compare; 6855 HUnaryControlInstruction* compare;
6857 6856
6858 Handle<Map> map = info.map(); 6857 Handle<Map> map = info.map();
6859 if (info.type()->Is(Type::Number())) { 6858 if (info.type()->Is(Type::Number())) {
6860 Handle<Map> heap_number_map = isolate()->factory()->heap_number_map(); 6859 Handle<Map> heap_number_map = isolate()->factory()->heap_number_map();
6861 compare = New<HCompareMap>(receiver, heap_number_map, top_info(), 6860 compare = New<HCompareMap>(receiver, heap_number_map, top_info(),
6862 if_true, if_false); 6861 if_true, if_false);
6863 } else if (info.type()->Is(Type::String())) { 6862 } else if (info.type()->Is(Type::String())) {
6864 compare = New<HIsStringAndBranch>(receiver, if_true, if_false); 6863 compare = New<HIsStringAndBranch>(receiver, if_true, if_false);
6865 } else { 6864 } else {
6866 compare = New<HCompareMap>(receiver, map, top_info(), 6865 compare = New<HCompareMap>(receiver, map, top_info(),
6867 if_true, if_false); 6866 if_true, if_false);
6868 } 6867 }
6869 FinishCurrentBlock(compare); 6868 FinishCurrentBlock(compare);
6870 6869
6871 if (info.type()->Is(Type::Number())) { 6870 if (info.type()->Is(Type::Number())) {
6872 Goto(if_true, number_block); 6871 GotoNoSimulate(if_true, number_block);
6873 if_true = number_block; 6872 if_true = number_block;
6874 number_block->SetJoinId(expr->id());
6875 } 6873 }
6876 6874
6877 set_current_block(if_true); 6875 set_current_block(if_true);
6878 6876
6879 AddCheckPrototypeMaps(info.holder(), map); 6877 AddCheckPrototypeMaps(info.holder(), map);
6880 6878
6881 HValue* function = Add<HConstant>(expr->target()); 6879 HValue* function = Add<HConstant>(expr->target());
6882 environment()->SetExpressionStackAt(0, function); 6880 environment()->SetExpressionStackAt(0, function);
6883 Push(receiver); 6881 Push(receiver);
6884 CHECK_ALIVE(VisitExpressions(expr->arguments())); 6882 CHECK_ALIVE(VisitExpressions(expr->arguments()));
(...skipping 4302 matching lines...) Expand 10 before | Expand all | Expand 10 after
11187 if (ShouldProduceTraceOutput()) { 11185 if (ShouldProduceTraceOutput()) {
11188 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 11186 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
11189 } 11187 }
11190 11188
11191 #ifdef DEBUG 11189 #ifdef DEBUG
11192 graph_->Verify(false); // No full verify. 11190 graph_->Verify(false); // No full verify.
11193 #endif 11191 #endif
11194 } 11192 }
11195 11193
11196 } } // namespace v8::internal 11194 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/regress/number-named-call-deopt.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698