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

Unified Diff: runtime/vm/intermediate_language.cc

Issue 12091091: Move recording of definition used from the value to the definition. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 7 years, 11 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
« no previous file with comments | « runtime/vm/intermediate_language.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/intermediate_language.cc
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index d7880ff0829c986d417d00837d9b057bbb0e2a41..03269994f5dca1aa340dac5733b9a3d279294a22 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -626,58 +626,67 @@ void Instruction::RecordAssignedVars(BitVector* assigned_vars,
}
-void Value::AddToInputUseList() {
- Value* next = definition()->input_use_list();
- definition()->set_input_use_list(this);
- set_next_use(next);
- set_previous_use(NULL);
- if (next != NULL) next->set_previous_use(this);
+void Value::AddToList(Value* value, Value** list) {
+ Value* next = *list;
+ *list = value;
+ value->set_next_use(next);
+ value->set_previous_use(NULL);
+ if (next != NULL) next->set_previous_use(value);
}
-void Value::AddToEnvUseList() {
- Value* next = definition()->env_use_list();
- definition()->set_env_use_list(this);
- set_next_use(next);
- set_previous_use(NULL);
- if (next != NULL) next->set_previous_use(this);
-}
-
-
-void Value::RemoveFromInputUseList() {
- Value* previous = previous_use();
- Value* next = next_use();
+void Value::RemoveFromList(Value* value, Value** list) {
+ Value* previous = value->previous_use();
+ Value* next = value->next_use();
if (previous == NULL) {
- definition()->set_input_use_list(next);
+ *list = next;
} else {
previous->set_next_use(next);
}
if (next != NULL) next->set_previous_use(previous);
- set_definition(NULL);
+ value->set_previous_use(NULL);
+ value->set_next_use(NULL);
+ value->set_definition(NULL);
}
void Definition::ReplaceUsesWith(Definition* other) {
ASSERT(other != NULL);
ASSERT(this != other);
+
+ Value* current = NULL;
Value* next = input_use_list();
- while (next != NULL) {
- Value* current = next;
- next = current->next_use();
- current->set_definition(other);
- current->AddToInputUseList();
+ if (next != NULL) {
+ // Change all the definitions.
+ while (next != NULL) {
+ current = next;
+ current->set_definition(other);
+ next = current->next_use();
+ }
+
+ // Concatenate the lists.
+ next = other->input_use_list();
+ current->set_next_use(next);
+ if (next != NULL) next->set_previous_use(current);
+ other->set_input_use_list(input_use_list());
+ set_input_use_list(NULL);
}
+ // Repeat for environment uses.
+ current = NULL;
next = env_use_list();
- while (next != NULL) {
- Value* current = next;
- next = current->next_use();
- current->set_definition(other);
- current->AddToEnvUseList();
+ if (next != NULL) {
+ while (next != NULL) {
+ current = next;
+ current->set_definition(other);
+ next = current->next_use();
+ }
+ next = other->env_use_list();
+ current->set_next_use(next);
+ if (next != NULL) next->set_previous_use(current);
+ other->set_env_use_list(env_use_list());
+ set_env_use_list(NULL);
}
-
- set_input_use_list(NULL);
- set_env_use_list(NULL);
}
@@ -1712,9 +1721,9 @@ Definition* AssertAssignableInstr::Canonicalize(FlowGraphOptimizer* optimizer) {
// It is ok to insert instructions before the current during
// forward iteration.
optimizer->InsertBefore(this, null_constant, NULL, Definition::kValue);
- instantiator_type_arguments()->RemoveFromInputUseList();
+ constant_type_args->RemoveInputUse(instantiator_type_arguments());
instantiator_type_arguments()->set_definition(null_constant);
- instantiator_type_arguments()->AddToInputUseList();
+ null_constant->AddInputUse(instantiator_type_arguments());
Kevin Millikin (Google) 2013/01/31 16:37:13 These three lines are going to get combined someho
}
return this;
}
@@ -2067,7 +2076,7 @@ void Environment::DeepCopyTo(Instruction* instr) const {
Value* value = it.CurrentValue();
value->set_instruction(instr);
value->set_use_index(use_index++);
- value->AddToEnvUseList();
+ value->definition()->AddEnvUse(value);
}
instr->set_env(copy);
}
@@ -2093,7 +2102,7 @@ void Environment::DeepCopyToOuter(Instruction* instr) const {
Value* value = it.CurrentValue();
value->set_instruction(instr);
value->set_use_index(use_index++);
- value->AddToEnvUseList();
+ value->definition()->AddEnvUse(value);
}
instr->env()->outer_ = copy;
}
« no previous file with comments | « runtime/vm/intermediate_language.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698