OLD | NEW |
---|---|
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/flow_graph_inliner.h" | 5 #include "vm/flow_graph_inliner.h" |
6 | 6 |
7 #include "vm/block_scheduler.h" | 7 #include "vm/block_scheduler.h" |
8 #include "vm/compiler.h" | 8 #include "vm/compiler.h" |
9 #include "vm/flags.h" | 9 #include "vm/flags.h" |
10 #include "vm/flow_graph.h" | 10 #include "vm/flow_graph.h" |
(...skipping 908 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
919 // Replace remaining constants with uses by constants in the caller's | 919 // Replace remaining constants with uses by constants in the caller's |
920 // initial definitions. | 920 // initial definitions. |
921 GrowableArray<Definition*>* defns = | 921 GrowableArray<Definition*>* defns = |
922 callee_graph->graph_entry()->initial_definitions(); | 922 callee_graph->graph_entry()->initial_definitions(); |
923 for (intptr_t i = 0; i < defns->length(); ++i) { | 923 for (intptr_t i = 0; i < defns->length(); ++i) { |
924 ConstantInstr* constant = (*defns)[i]->AsConstant(); | 924 ConstantInstr* constant = (*defns)[i]->AsConstant(); |
925 if ((constant != NULL) && constant->HasUses()) { | 925 if ((constant != NULL) && constant->HasUses()) { |
926 constant->ReplaceUsesWith( | 926 constant->ReplaceUsesWith( |
927 caller_graph_->GetConstant(constant->value())); | 927 caller_graph_->GetConstant(constant->value())); |
928 } | 928 } |
929 CurrentContextInstr* context = (*defns)[i]->AsCurrentContext(); | |
930 if ((context != NULL) && context->HasUses()) { | |
931 if (call->IsClosureCall()) { | |
932 context->ReplaceUsesWith( | |
933 call->AsClosureCall()->context()->definition()); | |
934 } else { | |
935 context->ReplaceUsesWith(caller_graph_->CurrentContext(call->env())); | |
Vyacheslav Egorov (Google)
2014/10/28 13:44:58
Just use the empty one here. If it's not a closure
Florian Schneider
2014/10/28 19:04:31
Done.
| |
936 } | |
937 } | |
929 } | 938 } |
930 | 939 |
931 // Check that inlining maintains use lists. | 940 // Check that inlining maintains use lists. |
932 DEBUG_ASSERT(!FLAG_verify_compiler || caller_graph_->VerifyUseLists()); | 941 DEBUG_ASSERT(!FLAG_verify_compiler || caller_graph_->VerifyUseLists()); |
933 } | 942 } |
934 | 943 |
935 static intptr_t CountConstants(const GrowableArray<Value*>& arguments) { | 944 static intptr_t CountConstants(const GrowableArray<Value*>& arguments) { |
936 intptr_t count = 0; | 945 intptr_t count = 0; |
937 for (intptr_t i = 0; i < arguments.length(); i++) { | 946 for (intptr_t i = 0; i < arguments.length(); i++) { |
938 if (arguments[i]->BindsToConstant()) count++; | 947 if (arguments[i]->BindsToConstant()) count++; |
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1328 } | 1337 } |
1329 } | 1338 } |
1330 GrowableArray<Definition*>* defns = | 1339 GrowableArray<Definition*>* defns = |
1331 callee_graph->graph_entry()->initial_definitions(); | 1340 callee_graph->graph_entry()->initial_definitions(); |
1332 for (intptr_t i = 0; i < defns->length(); ++i) { | 1341 for (intptr_t i = 0; i < defns->length(); ++i) { |
1333 ConstantInstr* constant = (*defns)[i]->AsConstant(); | 1342 ConstantInstr* constant = (*defns)[i]->AsConstant(); |
1334 if ((constant != NULL) && constant->HasUses()) { | 1343 if ((constant != NULL) && constant->HasUses()) { |
1335 constant->ReplaceUsesWith( | 1344 constant->ReplaceUsesWith( |
1336 owner_->caller_graph()->GetConstant(constant->value())); | 1345 owner_->caller_graph()->GetConstant(constant->value())); |
1337 } | 1346 } |
1347 CurrentContextInstr* context = (*defns)[i]->AsCurrentContext(); | |
1348 if ((context != NULL) && context->HasUses()) { | |
1349 if (call_data.call->IsClosureCall()) { | |
1350 context->ReplaceUsesWith( | |
1351 call_data.call->AsClosureCall()->context()->definition()); | |
1352 } else { | |
1353 context->ReplaceUsesWith( | |
1354 owner_->caller_graph()->CurrentContext(call_data.call->env())); | |
Vyacheslav Egorov (Google)
2014/10/28 13:44:58
Ditto.
Florian Schneider
2014/10/28 19:04:31
Done.
| |
1355 } | |
1356 } | |
1338 } | 1357 } |
1339 return true; | 1358 return true; |
1340 } | 1359 } |
1341 | 1360 |
1342 | 1361 |
1343 static Instruction* AppendInstruction(Instruction* first, | 1362 static Instruction* AppendInstruction(Instruction* first, |
1344 Instruction* second) { | 1363 Instruction* second) { |
1345 for (intptr_t i = second->InputCount() - 1; i >= 0; --i) { | 1364 for (intptr_t i = second->InputCount() - 1; i >= 0; --i) { |
1346 Value* input = second->InputAt(i); | 1365 Value* input = second->InputAt(i); |
1347 input->definition()->AddInputUse(input); | 1366 input->definition()->AddInputUse(input); |
(...skipping 355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1703 OS::Print("After Inlining of %s\n", flow_graph_-> | 1722 OS::Print("After Inlining of %s\n", flow_graph_-> |
1704 parsed_function().function().ToFullyQualifiedCString()); | 1723 parsed_function().function().ToFullyQualifiedCString()); |
1705 FlowGraphPrinter printer(*flow_graph_); | 1724 FlowGraphPrinter printer(*flow_graph_); |
1706 printer.PrintBlocks(); | 1725 printer.PrintBlocks(); |
1707 } | 1726 } |
1708 } | 1727 } |
1709 } | 1728 } |
1710 } | 1729 } |
1711 | 1730 |
1712 } // namespace dart | 1731 } // namespace dart |
OLD | NEW |