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

Unified Diff: runtime/vm/flow_graph_builder.cc

Issue 678763004: Make CTX allocatable by the register allocator. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: incorporated latest comments Created 6 years, 2 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_builder.cc
===================================================================
--- runtime/vm/flow_graph_builder.cc (revision 41393)
+++ runtime/vm/flow_graph_builder.cc (working copy)
@@ -759,7 +759,7 @@
intptr_t delta =
owner()->context_level() - local.owner()->context_level();
ASSERT(delta >= 0);
- Value* context = Bind(new(I) CurrentContextInstr());
+ Value* context = Bind(BuildCurrentContext());
while (delta-- > 0) {
context = Bind(new(I) LoadFieldInstr(
context, Context::parent_offset(), Type::ZoneHandle(I, Type::null()),
@@ -787,7 +787,7 @@
intptr_t delta =
owner()->context_level() - local.owner()->context_level();
ASSERT(delta >= 0);
- Value* context = Bind(new(I) CurrentContextInstr());
+ Value* context = Bind(BuildCurrentContext());
while (delta-- > 0) {
context = Bind(new(I) LoadFieldInstr(
context, Context::parent_offset(), Type::ZoneHandle(I, Type::null()),
@@ -805,7 +805,7 @@
// Stores current context into the 'variable'
void EffectGraphVisitor::BuildSaveContext(const LocalVariable& variable) {
- Value* context = Bind(new(I) CurrentContextInstr());
+ Value* context = Bind(BuildCurrentContext());
Do(BuildStoreLocal(variable, context));
}
@@ -813,10 +813,22 @@
// Loads context saved in 'context_variable' into the current context.
void EffectGraphVisitor::BuildRestoreContext(const LocalVariable& variable) {
Value* load_saved_context = Bind(BuildLoadLocal(variable));
- AddInstruction(new(I) StoreContextInstr(load_saved_context));
+ Do(BuildStoreContext(load_saved_context));
}
+Definition* EffectGraphVisitor::BuildStoreContext(Value* value) {
+ return new(I) StoreLocalInstr(
+ *owner()->parsed_function()->current_context_var(), value);
+}
+
+
+Definition* EffectGraphVisitor::BuildCurrentContext() {
+ return new(I) LoadLocalInstr(
+ *owner()->parsed_function()->current_context_var());
+}
+
+
void TestGraphVisitor::ConnectBranchesTo(
const GrowableArray<TargetEntryInstr**>& branches,
JoinEntryInstr* join) const {
@@ -1268,12 +1280,12 @@
const String& name = String::ZoneHandle(I, Symbols::New(node->TokenName()));
const intptr_t kNumArgsChecked = 2;
InstanceCallInstr* call = new(I) InstanceCallInstr(node->token_pos(),
- name,
- node->kind(),
- arguments,
- Object::null_array(),
- kNumArgsChecked,
- owner()->ic_data_array());
+ name,
+ node->kind(),
+ arguments,
+ Object::null_array(),
+ kNumArgsChecked,
+ owner()->ic_data_array());
ReturnDefinition(call);
}
@@ -1366,12 +1378,12 @@
arguments->Add(push_mask);
const intptr_t kNumArgsChecked = 2;
InstanceCallInstr* call = new(I) InstanceCallInstr(node->token_pos(),
- BinaryOpAndMaskName(node),
- Token::kILLEGAL,
- arguments,
- Object::null_array(),
- kNumArgsChecked,
- owner()->ic_data_array());
+ BinaryOpAndMaskName(node),
+ Token::kILLEGAL,
+ arguments,
+ Object::null_array(),
+ kNumArgsChecked,
+ owner()->ic_data_array());
ReturnDefinition(call);
}
@@ -1496,7 +1508,7 @@
intptr_t delta = old_ctx_level -
continuation_result->owner()->context_level();
ASSERT(delta >= 0);
- Value* context = Bind(new(I) CurrentContextInstr());
+ Value* context = Bind(BuildCurrentContext());
while (delta-- > 0) {
context = Bind(new(I) LoadFieldInstr(
context, Context::parent_offset(), Type::ZoneHandle(I, Type::null()),
@@ -1744,14 +1756,14 @@
PushArgumentInstr* push_right = PushArgument(for_right_value.value());
arguments->Add(push_right);
- Definition* result =
- new(I) InstanceCallInstr(node->token_pos(),
- Symbols::EqualOperator(),
- Token::kEQ, // Result is negated later for kNE.
- arguments,
- Object::null_array(),
- 2,
- owner()->ic_data_array());
+ Definition* result = new(I) InstanceCallInstr(
+ node->token_pos(),
+ Symbols::EqualOperator(),
+ Token::kEQ, // Result is negated later for kNE.
+ arguments,
+ Object::null_array(),
+ 2,
+ owner()->ic_data_array());
if (node->kind() == Token::kNE) {
if (FLAG_enable_type_checks) {
Value* value = Bind(result);
@@ -1780,15 +1792,14 @@
arguments->Add(push_right);
ASSERT(Token::IsRelationalOperator(node->kind()));
- InstanceCallInstr* comp =
- new(I) InstanceCallInstr(node->token_pos(),
- String::ZoneHandle(
- I, Symbols::New(node->TokenName())),
- node->kind(),
- arguments,
- Object::null_array(),
- 2,
- owner()->ic_data_array());
+ InstanceCallInstr* comp = new(I) InstanceCallInstr(
+ node->token_pos(),
+ String::ZoneHandle(I, Symbols::New(node->TokenName())),
+ node->kind(),
+ arguments,
+ Object::null_array(),
+ 2,
+ owner()->ic_data_array());
ReturnDefinition(comp);
}
@@ -1816,15 +1827,14 @@
ZoneGrowableArray<PushArgumentInstr*>* arguments =
new(I) ZoneGrowableArray<PushArgumentInstr*>(1);
arguments->Add(push_value);
- InstanceCallInstr* call =
- new(I) InstanceCallInstr(node->token_pos(),
- String::ZoneHandle(
- I, Symbols::New(node->TokenName())),
- node->kind(),
- arguments,
- Object::null_array(),
- 1,
- owner()->ic_data_array());
+ InstanceCallInstr* call = new(I) InstanceCallInstr(
+ node->token_pos(),
+ String::ZoneHandle(I, Symbols::New(node->TokenName())),
+ node->kind(),
+ arguments,
+ Object::null_array(),
+ 1,
+ owner()->ic_data_array());
ReturnDefinition(call);
}
@@ -2525,7 +2535,7 @@
} else {
// Store current context in closure.
closure_tmp_val = Bind(new(I) LoadLocalInstr(*closure_tmp_var));
- Value* context = Bind(new(I) CurrentContextInstr());
+ Value* context = Bind(BuildCurrentContext());
Do(new(I) StoreInstanceFieldInstr(Closure::context_offset(),
closure_tmp_val,
context,
@@ -2611,10 +2621,10 @@
BuildPushArguments(*node->arguments(), arguments);
StaticCallInstr* call =
new(I) StaticCallInstr(node->token_pos(),
- node->function(),
- node->arguments()->names(),
- arguments,
- owner()->ic_data_array());
+ node->function(),
+ node->arguments()->names(),
+ arguments,
+ owner()->ic_data_array());
if (node->function().is_native()) {
const intptr_t result_cid = GetResultCidOfNativeFactory(node->function());
if (result_cid != kDynamicCid) {
@@ -2641,19 +2651,7 @@
arguments->Add(push_closure);
BuildPushArguments(*node->arguments(), arguments);
- // Save context around the call.
- ASSERT(owner()->parsed_function()->saved_current_context_var() != NULL);
- BuildSaveContext(*owner()->parsed_function()->saved_current_context_var());
closure_val = Bind(new(I) LoadLocalInstr(*tmp_var));
- LoadFieldInstr* context_load = new(I) LoadFieldInstr(
- closure_val,
- Closure::context_offset(),
- AbstractType::ZoneHandle(I, AbstractType::null()),
- node->token_pos());
- context_load->set_is_immutable(true);
- Value* context_val = Bind(context_load);
- AddInstruction(new(I) StoreContextInstr(context_val));
- closure_val = Bind(new(I) LoadLocalInstr(*tmp_var));
LoadFieldInstr* function_load = new(I) LoadFieldInstr(
closure_val,
Closure::function_offset(),
@@ -2661,22 +2659,16 @@
node->token_pos());
function_load->set_is_immutable(true);
Value* function_val = Bind(function_load);
+
Definition* closure_call =
new(I) ClosureCallInstr(function_val, node, arguments);
if (result_needed) {
Value* result = Bind(closure_call);
Do(new(I) StoreLocalInstr(*tmp_var, result));
- // Restore context from temp.
- BuildRestoreContext(
- *owner()->parsed_function()->saved_current_context_var());
- ReturnDefinition(ExitTempLocalScope(tmp_var));
} else {
Do(closure_call);
- // Restore context from saved location.
- BuildRestoreContext(
- *owner()->parsed_function()->saved_current_context_var());
- Do(ExitTempLocalScope(tmp_var));
}
+ ReturnDefinition(ExitTempLocalScope(tmp_var));
}
@@ -2697,9 +2689,9 @@
void EffectGraphVisitor::VisitCloneContextNode(CloneContextNode* node) {
- Value* context = Bind(new(I) CurrentContextInstr());
+ Value* context = Bind(BuildCurrentContext());
Value* clone = Bind(new(I) CloneContextInstr(node->token_pos(), context));
- AddInstruction(new(I) StoreContextInstr(clone));
+ Do(BuildStoreContext(clone));
}
@@ -2739,10 +2731,10 @@
BuildPushArguments(*node->arguments(), arguments);
Do(new(I) StaticCallInstr(node->token_pos(),
- node->constructor(),
- node->arguments()->names(),
- arguments,
- owner()->ic_data_array()));
+ node->constructor(),
+ node->arguments()->names(),
+ arguments,
+ owner()->ic_data_array()));
}
@@ -2782,10 +2774,10 @@
BuildPushArguments(*node->arguments(), arguments);
StaticCallInstr* call =
new(I) StaticCallInstr(node->token_pos(),
- node->constructor(),
- node->arguments()->names(),
- arguments,
- owner()->ic_data_array());
+ node->constructor(),
+ node->arguments()->names(),
+ arguments,
+ owner()->ic_data_array());
const intptr_t result_cid = GetResultCidOfListFactory(node);
if (result_cid != kDynamicCid) {
call->set_result_cid(result_cid);
@@ -3536,21 +3528,22 @@
if (super_function != NULL) {
// Generate static call to super operator.
StaticCallInstr* load = new(I) StaticCallInstr(node->token_pos(),
- *super_function,
- Object::null_array(),
- arguments,
- owner()->ic_data_array());
+ *super_function,
+ Object::null_array(),
+ arguments,
+ owner()->ic_data_array());
ReturnDefinition(load);
} else {
// Generate dynamic call to index operator.
const intptr_t checked_argument_count = 1;
- InstanceCallInstr* load = new(I) InstanceCallInstr(node->token_pos(),
- Symbols::IndexToken(),
- Token::kINDEX,
- arguments,
- Object::null_array(),
- checked_argument_count,
- owner()->ic_data_array());
+ InstanceCallInstr* load = new(I) InstanceCallInstr(
+ node->token_pos(),
+ Symbols::IndexToken(),
+ Token::kINDEX,
+ arguments,
+ Object::null_array(),
+ checked_argument_count,
+ owner()->ic_data_array());
ReturnDefinition(load);
}
}
@@ -3617,10 +3610,10 @@
StaticCallInstr* store =
new(I) StaticCallInstr(node->token_pos(),
- *super_function,
- Object::null_array(),
- arguments,
- owner()->ic_data_array());
+ *super_function,
+ Object::null_array(),
+ arguments,
+ owner()->ic_data_array());
if (result_is_needed) {
Do(store);
return BuildLoadExprTemp();
@@ -3634,12 +3627,12 @@
String::ZoneHandle(I, Symbols::New(Token::Str(Token::kASSIGN_INDEX)));
InstanceCallInstr* store =
new(I) InstanceCallInstr(node->token_pos(),
- name,
- Token::kASSIGN_INDEX,
- arguments,
- Object::null_array(),
- checked_argument_count,
- owner()->ic_data_array());
+ name,
+ Token::kASSIGN_INDEX,
+ arguments,
+ Object::null_array(),
+ checked_argument_count,
+ owner()->ic_data_array());
if (result_is_needed) {
Do(store);
return BuildLoadExprTemp();
@@ -3668,7 +3661,7 @@
void EffectGraphVisitor::UnchainContexts(intptr_t n) {
if (n > 0) {
- Value* context = Bind(new(I) CurrentContextInstr());
+ Value* context = Bind(BuildCurrentContext());
while (n-- > 0) {
context = Bind(
new(I) LoadFieldInstr(context,
@@ -3677,7 +3670,7 @@
Type::ZoneHandle(I, Type::null()),
Scanner::kNoSourcePos));
}
- AddInstruction(new(I) StoreContextInstr(context));
+ Do(BuildStoreContext(context));
}
}
@@ -3697,7 +3690,7 @@
if (num_context_variables > 0) {
// The loop local scope declares variables that are captured.
// Allocate and chain a new context.
- // Allocate context computation (uses current CTX)
+ // Allocate context computation (uses current context)
Value* allocated_context =
Bind(new(I) AllocateContextInstr(node->token_pos(),
num_context_variables));
@@ -3716,15 +3709,14 @@
parent_context = Bind(
new(I) ConstantInstr(Object::ZoneHandle(I, Object::null())));
} else {
- parent_context = Bind(new(I) CurrentContextInstr());
+ parent_context = Bind(BuildCurrentContext());
}
Do(new(I) StoreInstanceFieldInstr(Context::parent_offset(),
tmp_val,
parent_context,
kEmitStoreBarrier,
Scanner::kNoSourcePos));
- AddInstruction(
- new(I) StoreContextInstr(Bind(ExitTempLocalScope(tmp_var))));
+ Do(BuildStoreContext(Bind(ExitTempLocalScope(tmp_var))));
}
// If this node_sequence is the body of the function being compiled, copy
@@ -3772,9 +3764,8 @@
// object.
BuildSaveContext(
*owner()->parsed_function()->saved_entry_context_var());
- AddInstruction(
- new(I) StoreContextInstr(Bind(new(I) ConstantInstr(Object::ZoneHandle(
- I, I->object_store()->empty_context())))));
+ Do(BuildStoreContext(Bind(new(I) ConstantInstr(Object::ZoneHandle(
+ I, I->object_store()->empty_context())))));
}
// This check may be deleted if the generated code is leaf.
@@ -3943,7 +3934,7 @@
void EffectGraphVisitor::VisitCatchClauseNode(CatchClauseNode* node) {
InlineBailout("EffectGraphVisitor::VisitCatchClauseNode (exception)");
- // Restores CTX from local variable ':saved_context'.
+ // Restores current context from local variable ':saved_context'.
BuildRestoreContext(node->context_var());
EffectGraphVisitor for_catch(owner());
@@ -3959,7 +3950,7 @@
ASSERT(try_handler_index != original_handler_index);
owner()->set_try_index(try_handler_index);
- // Preserve CTX into local variable '%saved_context'.
+ // Preserve current context into local variable '%saved_context'.
BuildSaveContext(node->context_var());
EffectGraphVisitor for_try(owner());

Powered by Google App Engine
This is Rietveld 408576698