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

Unified Diff: runtime/vm/flow_graph_compiler_x64.cc

Issue 10831261: Build and use stack maps in the SSA compiler. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 4 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 side-by-side diff with in-line comments
Download patch
Index: runtime/vm/flow_graph_compiler_x64.cc
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index 771f3823facd9faf6f3975176b763ecf93181791..ebf2cba41ba22794f12c9af2f3e5a1104926ed7b 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -459,7 +459,8 @@ void FlowGraphCompiler::GenerateInstanceOf(intptr_t deopt_id,
intptr_t token_pos,
intptr_t try_index,
const AbstractType& type,
- bool negate_result) {
+ bool negate_result,
+ BitmapBuilder* stack_bitmap) {
ASSERT(type.IsFinalized() && !type.IsMalformed());
const Immediate raw_null =
@@ -500,7 +501,7 @@ void FlowGraphCompiler::GenerateInstanceOf(intptr_t deopt_id,
__ LoadObject(RAX, test_cache);
__ pushq(RAX);
GenerateCallRuntime(deopt_id, token_pos, try_index,
- kInstanceofRuntimeEntry);
+ kInstanceofRuntimeEntry, stack_bitmap);
// Pop the parameters supplied to the runtime entry. The result of the
// instanceof runtime call will be left as the result of the operation.
__ Drop(5);
@@ -543,7 +544,8 @@ void FlowGraphCompiler::GenerateAssertAssignable(intptr_t deopt_id,
intptr_t token_pos,
intptr_t try_index,
const AbstractType& dst_type,
- const String& dst_name) {
+ const String& dst_name,
+ BitmapBuilder* stack_bitmap) {
ASSERT(token_pos >= 0);
ASSERT(!dst_type.IsNull());
ASSERT(dst_type.IsFinalized());
@@ -571,7 +573,8 @@ void FlowGraphCompiler::GenerateAssertAssignable(intptr_t deopt_id,
GenerateCallRuntime(deopt_id,
token_pos,
try_index,
- kMalformedTypeErrorRuntimeEntry);
+ kMalformedTypeErrorRuntimeEntry,
+ stack_bitmap);
// We should never return here.
__ int3();
@@ -600,7 +603,8 @@ void FlowGraphCompiler::GenerateAssertAssignable(intptr_t deopt_id,
GenerateCallRuntime(deopt_id,
token_pos,
try_index,
- kTypeCheckRuntimeEntry);
+ kTypeCheckRuntimeEntry,
+ stack_bitmap);
// Pop the parameters supplied to the runtime entry. The result of the
// type check runtime call is the checked value.
__ Drop(6);
@@ -782,7 +786,8 @@ void FlowGraphCompiler::CopyParameters() {
GenerateCallRuntime(Isolate::kNoDeoptId,
0,
CatchClauseNode::kInvalidTryIndex,
- kClosureArgumentMismatchRuntimeEntry);
+ kClosureArgumentMismatchRuntimeEntry,
+ NULL);
Vyacheslav Egorov (Google) 2012/08/13 12:54:46 This NULL looks suspicious to me because we alread
} else {
ASSERT(!IsLeaf());
// Invoke noSuchMethod function.
@@ -809,7 +814,8 @@ void FlowGraphCompiler::CopyParameters() {
GenerateCallRuntime(Isolate::kNoDeoptId,
0,
CatchClauseNode::kInvalidTryIndex,
- kTraceFunctionExitRuntimeEntry);
+ kTraceFunctionExitRuntimeEntry,
+ NULL);
Vyacheslav Egorov (Google) 2012/08/13 12:54:46 This NULL looks suspicious to me because we alread
__ popq(RAX); // Remove argument.
__ popq(RAX); // Restore result.
}
@@ -903,7 +909,7 @@ void FlowGraphCompiler::CompileGraph() {
const Function& function = parsed_function().function();
const int parameter_count = function.num_fixed_parameters();
- const int num_copied_params = parsed_function().copied_parameter_count();
+ const int copied_parameter_count = parsed_function().copied_parameter_count();
const int local_count = parsed_function().stack_local_count();
__ Comment("Enter frame");
if (IsLeaf()) {
@@ -915,7 +921,7 @@ void FlowGraphCompiler::CompileGraph() {
// the presence of optional named parameters.
// No such checking code is generated if only fixed parameters are declared,
// unless we are debug mode or unless we are compiling a closure.
- if (num_copied_params == 0) {
+ if (copied_parameter_count == 0) {
#ifdef DEBUG
const bool check_arguments = true;
#else
@@ -933,7 +939,8 @@ void FlowGraphCompiler::CompileGraph() {
GenerateCallRuntime(Isolate::kNoDeoptId,
function.token_pos(),
CatchClauseNode::kInvalidTryIndex,
- kClosureArgumentMismatchRuntimeEntry);
+ kClosureArgumentMismatchRuntimeEntry,
+ NULL);
Vyacheslav Egorov (Google) 2012/08/13 12:54:46 This NULL looks suspicious to me because we alread
} else {
__ Stop("Wrong number of arguments");
}
@@ -943,21 +950,26 @@ void FlowGraphCompiler::CompileGraph() {
CopyParameters();
}
+ // Initialize (non-argument) stack allocated slots to null.
+ //
// TODO(vegorov): introduce stack maps and stop initializing all spill slots
// with null.
- const intptr_t stack_slot_count =
- is_ssa_ ? block_order_[0]->AsGraphEntry()->spill_slot_count()
- : local_count;
-
+ intptr_t uninitialized_slot_count;
+ if (is_ssa_) {
+ GraphEntryInstr* entry = block_order_[0]->AsGraphEntry();
+ uninitialized_slot_count =
+ entry->spill_slot_count() - copied_parameter_count;
+ } else {
+ uninitialized_slot_count = local_count;
+ }
const intptr_t slot_base = parsed_function().first_stack_local_index();
- // Initialize (non-argument) stack allocated locals to null.
- if (stack_slot_count > 0) {
+ if (uninitialized_slot_count > 0) {
__ Comment("Initialize spill slots");
const Immediate raw_null =
Immediate(reinterpret_cast<intptr_t>(Object::null()));
__ movq(RAX, raw_null);
- for (intptr_t i = 0; i < stack_slot_count; ++i) {
+ for (intptr_t i = 0; i < uninitialized_slot_count; ++i) {
// Subtract index i (locals lie at lower addresses than RBP).
__ movq(Address(RBP, (slot_base - i) * kWordSize), RAX);
}
@@ -991,10 +1003,14 @@ void FlowGraphCompiler::CompileGraph() {
void FlowGraphCompiler::GenerateCall(intptr_t token_pos,
intptr_t try_index,
const ExternalLabel* label,
- PcDescriptors::Kind kind) {
+ PcDescriptors::Kind kind,
+ BitmapBuilder* stack_bitmap) {
ASSERT(!IsLeaf());
ASSERT(frame_register_allocator()->IsSpilled());
__ call(label);
+ if (is_ssa() && (stack_bitmap != NULL)) {
Vyacheslav Egorov (Google) 2012/08/13 12:54:46 I would prefer to have stack_bitmap always not equ
Kevin Millikin (Google) 2012/08/13 15:10:37 I agree completely. With this change we fall back
+ stackmap_table_builder_->AddEntry(assembler()->CodeSize(), stack_bitmap);
+ }
AddCurrentDescriptor(kind, Isolate::kNoDeoptId, token_pos, try_index);
}
@@ -1002,10 +1018,14 @@ void FlowGraphCompiler::GenerateCall(intptr_t token_pos,
void FlowGraphCompiler::GenerateCallRuntime(intptr_t deopt_id,
intptr_t token_pos,
intptr_t try_index,
- const RuntimeEntry& entry) {
+ const RuntimeEntry& entry,
+ BitmapBuilder* stack_bitmap) {
ASSERT(!IsLeaf());
ASSERT(frame_register_allocator()->IsSpilled());
__ CallRuntime(entry);
+ if (is_ssa() && (stack_bitmap != NULL)) {
+ stackmap_table_builder_->AddEntry(assembler()->CodeSize(), stack_bitmap);
+ }
AddCurrentDescriptor(PcDescriptors::kOther, deopt_id, token_pos, try_index);
}

Powered by Google App Engine
This is Rietveld 408576698