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

Side by Side Diff: runtime/vm/compiler.cc

Issue 1414933006: Copy ICData descriptors when starting background compilation, so that they do not change while comp… (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: j Created 5 years, 1 month 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 | runtime/vm/object.h » ('j') | runtime/vm/object.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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/compiler.h" 5 #include "vm/compiler.h"
6 6
7 #include "vm/assembler.h" 7 #include "vm/assembler.h"
8 8
9 #include "vm/ast_printer.h" 9 #include "vm/ast_printer.h"
10 #include "vm/block_scheduler.h" 10 #include "vm/block_scheduler.h"
(...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after
420 // LongJump. 420 // LongJump.
421 { 421 {
422 CSTAT_TIMER_SCOPE(thread, graphbuilder_timer); 422 CSTAT_TIMER_SCOPE(thread, graphbuilder_timer);
423 ZoneGrowableArray<const ICData*>* ic_data_array = 423 ZoneGrowableArray<const ICData*>* ic_data_array =
424 new(zone) ZoneGrowableArray<const ICData*>(); 424 new(zone) ZoneGrowableArray<const ICData*>();
425 if (optimized) { 425 if (optimized) {
426 // Extract type feedback before the graph is built, as the graph 426 // Extract type feedback before the graph is built, as the graph
427 // builder uses it to attach it to nodes. 427 // builder uses it to attach it to nodes.
428 ASSERT(function.deoptimization_counter() < 428 ASSERT(function.deoptimization_counter() <
429 FLAG_deoptimization_counter_threshold); 429 FLAG_deoptimization_counter_threshold);
430 function.RestoreICDataMap(ic_data_array); 430 if ((osr_id == Compiler::kNoOSRDeoptId) &&
431 FLAG_background_compilation && optimized) {
432 ASSERT(!Thread::Current()->IsMutatorThread());
siva 2015/10/27 23:36:45 ASSERT(!thread->IsMutatorThread());
srdjan 2015/10/28 16:54:43 Done.
433 // This 'freezes' ICData so that it does not change while compiling.
434 function.CopyICDataMap(ic_data_array);
435 } else {
436 ASSERT(Thread::Current()->IsMutatorThread());
siva 2015/10/27 23:36:45 Ditto.
srdjan 2015/10/28 16:54:43 Done.
437 function.RestoreICDataMap(ic_data_array);
438 }
431 if (FLAG_print_ic_data_map) { 439 if (FLAG_print_ic_data_map) {
432 for (intptr_t i = 0; i < ic_data_array->length(); i++) { 440 for (intptr_t i = 0; i < ic_data_array->length(); i++) {
433 if ((*ic_data_array)[i] != NULL) { 441 if ((*ic_data_array)[i] != NULL) {
434 THR_Print("%" Pd " ", i); 442 THR_Print("%" Pd " ", i);
435 FlowGraphPrinter::PrintICData(*(*ic_data_array)[i]); 443 FlowGraphPrinter::PrintICData(*(*ic_data_array)[i]);
436 } 444 }
437 } 445 }
438 } 446 }
439 } 447 }
440 448
(...skipping 1089 matching lines...) Expand 10 before | Expand all | Expand 10 after
1530 function, 1538 function,
1531 Compiler::kNoOSRDeoptId, 1539 Compiler::kNoOSRDeoptId,
1532 &code)); 1540 &code));
1533 // TODO(srdjan): We do not expect errors while compiling optimized 1541 // TODO(srdjan): We do not expect errors while compiling optimized
1534 // code, any errors should have been caught when compiling 1542 // code, any errors should have been caught when compiling
1535 // unoptimized code. 1543 // unoptimized code.
1536 // If it still happens mark function as not optimizable. 1544 // If it still happens mark function as not optimizable.
1537 ASSERT(error.IsNull()); 1545 ASSERT(error.IsNull());
1538 temp_function = RemoveFunctionOrNull(); 1546 temp_function = RemoveFunctionOrNull();
1539 ASSERT(temp_function.raw() == function.raw()); 1547 ASSERT(temp_function.raw() == function.raw());
1540 // Reset to 0 so that it can be recompiled if needed.
1541 function.set_usage_counter(0);
1542 function = LastFunctionOrNull(); 1548 function = LastFunctionOrNull();
1549 ASSERT(!code.IsNull());
1543 AddCode(code); 1550 AddCode(code);
1544 } 1551 }
1545 } 1552 }
1546 Thread::ExitIsolateAsHelper(); 1553 Thread::ExitIsolateAsHelper();
1547 { 1554 {
1548 // Wait to be notified when the work queue is not empty. 1555 // Wait to be notified when the work queue is not empty.
1549 MonitorLocker ml(queue_monitor_); 1556 MonitorLocker ml(queue_monitor_);
1550 while ((function_queue_length() == 0) && running_) { 1557 while ((function_queue_length() == 0) && running_) {
1551 ml.Wait(); 1558 ml.Wait();
1552 } 1559 }
(...skipping 15 matching lines...) Expand all
1568 1575
1569 void BackgroundCompiler::InstallGeneratedCode() { 1576 void BackgroundCompiler::InstallGeneratedCode() {
1570 MonitorLocker ml(queue_monitor_); 1577 MonitorLocker ml(queue_monitor_);
1571 CompilationWorkQueue queue(CodesQueue()); 1578 CompilationWorkQueue queue(CodesQueue());
1572 Code& code = Code::Handle(); 1579 Code& code = Code::Handle();
1573 Object& owner = Object::Handle(); 1580 Object& owner = Object::Handle();
1574 for (intptr_t i = 0; i < queue.Length(); i++) { 1581 for (intptr_t i = 0; i < queue.Length(); i++) {
1575 code = queue.PopBackCode(); 1582 code = queue.PopBackCode();
1576 if (code.IsDisabled()) continue; 1583 if (code.IsDisabled()) continue;
1577 owner = code.owner(); 1584 owner = code.owner();
1578 ASSERT(owner.IsFunction()); 1585 const Function& function = Function::Cast(owner);
1579 Function::Cast(owner).InstallOptimizedCode(code, false /* not OSR */); 1586 function.InstallOptimizedCode(code, false /* not OSR */);
1587 if (function.usage_counter() < 0) {
1588 // Reset to 0 so that it can be recompiled if needed.
1589 function.set_usage_counter(0);
1590 }
1580 } 1591 }
1581 } 1592 }
1582 1593
1583 1594
1584 GrowableObjectArray* BackgroundCompiler::FunctionsQueue() const { 1595 GrowableObjectArray* BackgroundCompiler::FunctionsQueue() const {
1585 return 1596 return
1586 &GrowableObjectArray::ZoneHandle(isolate_->compilation_function_queue()); 1597 &GrowableObjectArray::ZoneHandle(isolate_->compilation_function_queue());
1587 } 1598 }
1588 1599
1589 1600
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
1670 thread->zone(), GrowableObjectArray::New())); 1681 thread->zone(), GrowableObjectArray::New()));
1671 start_task = true; 1682 start_task = true;
1672 } 1683 }
1673 } 1684 }
1674 if (start_task) { 1685 if (start_task) {
1675 Dart::thread_pool()->Run(isolate->background_compiler()); 1686 Dart::thread_pool()->Run(isolate->background_compiler());
1676 } 1687 }
1677 } 1688 }
1678 1689
1679 } // namespace dart 1690 } // namespace dart
OLDNEW
« no previous file with comments | « no previous file | runtime/vm/object.h » ('j') | runtime/vm/object.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698