summaryrefslogtreecommitdiffstats
path: root/compiler/optimizing
diff options
context:
space:
mode:
authorNicolas Geoffray <ngeoffray@google.com>2014-10-07 14:14:27 +0100
committerNicolas Geoffray <ngeoffray@google.com>2014-10-07 16:26:48 +0100
commit191c4b1372aef7c0272f8fa3985b55513029e728 (patch)
treeea8a2eb84a64b6f808f782ada9ea66ef69e8e764 /compiler/optimizing
parent41abdb6ec97978df7c6d79abce4efb664c994ce8 (diff)
downloadart-191c4b1372aef7c0272f8fa3985b55513029e728.zip
art-191c4b1372aef7c0272f8fa3985b55513029e728.tar.gz
art-191c4b1372aef7c0272f8fa3985b55513029e728.tar.bz2
Inserting a node must also update its inputs users.
Change-Id: I55357564b81efcc0cf52fffdf23289696fe27dd1
Diffstat (limited to 'compiler/optimizing')
-rw-r--r--compiler/optimizing/nodes.cc13
-rw-r--r--compiler/optimizing/nodes_test.cc51
2 files changed, 61 insertions, 3 deletions
diff --git a/compiler/optimizing/nodes.cc b/compiler/optimizing/nodes.cc
index 5c4ab8e..4cac319 100644
--- a/compiler/optimizing/nodes.cc
+++ b/compiler/optimizing/nodes.cc
@@ -308,6 +308,14 @@ bool HBasicBlock::Dominates(HBasicBlock* other) const {
return false;
}
+static void UpdateInputsUsers(HInstruction* instruction) {
+ for (size_t i = 0, e = instruction->InputCount(); i < e; ++i) {
+ instruction->InputAt(i)->AddUseAt(instruction, i);
+ }
+ // Environment should be created later.
+ DCHECK(!instruction->HasEnvironment());
+}
+
void HBasicBlock::InsertInstructionBefore(HInstruction* instruction, HInstruction* cursor) {
DCHECK(cursor->AsPhi() == nullptr);
DCHECK(instruction->AsPhi() == nullptr);
@@ -325,6 +333,7 @@ void HBasicBlock::InsertInstructionBefore(HInstruction* instruction, HInstructio
}
instruction->SetBlock(this);
instruction->SetId(GetGraph()->GetNextInstructionId());
+ UpdateInputsUsers(instruction);
}
void HBasicBlock::ReplaceAndRemoveInstructionWith(HInstruction* initial,
@@ -342,6 +351,7 @@ static void Add(HInstructionList* instruction_list,
DCHECK_EQ(instruction->GetId(), -1);
instruction->SetBlock(block);
instruction->SetId(block->GetGraph()->GetNextInstructionId());
+ UpdateInputsUsers(instruction);
instruction_list->AddInstruction(instruction);
}
@@ -421,9 +431,6 @@ void HInstructionList::AddInstruction(HInstruction* instruction) {
instruction->previous_ = last_instruction_;
last_instruction_ = instruction;
}
- for (size_t i = 0; i < instruction->InputCount(); i++) {
- instruction->InputAt(i)->AddUseAt(instruction, i);
- }
}
void HInstructionList::RemoveInstruction(HInstruction* instruction) {
diff --git a/compiler/optimizing/nodes_test.cc b/compiler/optimizing/nodes_test.cc
index b75bacb..70dd8d7 100644
--- a/compiler/optimizing/nodes_test.cc
+++ b/compiler/optimizing/nodes_test.cc
@@ -63,4 +63,55 @@ TEST(Node, RemoveInstruction) {
ASSERT_FALSE(parameter->HasUses());
}
+/**
+ * Test that inserting an instruction in the graph updates user lists.
+ */
+TEST(Node, InsertInstruction) {
+ ArenaPool pool;
+ ArenaAllocator allocator(&pool);
+
+ HGraph* graph = new (&allocator) HGraph(&allocator);
+ HBasicBlock* entry = new (&allocator) HBasicBlock(graph);
+ graph->AddBlock(entry);
+ graph->SetEntryBlock(entry);
+ HInstruction* parameter1 = new (&allocator) HParameterValue(0, Primitive::kPrimNot);
+ HInstruction* parameter2 = new (&allocator) HParameterValue(0, Primitive::kPrimNot);
+ entry->AddInstruction(parameter1);
+ entry->AddInstruction(parameter2);
+ entry->AddInstruction(new (&allocator) HExit());
+
+ ASSERT_FALSE(parameter1->HasUses());
+ ASSERT_EQ(parameter1->NumberOfUses(), 0u);
+
+ HInstruction* to_insert = new (&allocator) HNullCheck(parameter1, 0);
+ entry->InsertInstructionBefore(to_insert, parameter2);
+
+ ASSERT_TRUE(parameter1->HasUses());
+ ASSERT_EQ(parameter1->NumberOfUses(), 1u);
+}
+
+/**
+ * Test that adding an instruction in the graph updates user lists.
+ */
+TEST(Node, AddInstruction) {
+ ArenaPool pool;
+ ArenaAllocator allocator(&pool);
+
+ HGraph* graph = new (&allocator) HGraph(&allocator);
+ HBasicBlock* entry = new (&allocator) HBasicBlock(graph);
+ graph->AddBlock(entry);
+ graph->SetEntryBlock(entry);
+ HInstruction* parameter = new (&allocator) HParameterValue(0, Primitive::kPrimNot);
+ entry->AddInstruction(parameter);
+
+ ASSERT_FALSE(parameter->HasUses());
+ ASSERT_EQ(parameter->NumberOfUses(), 0u);
+
+ HInstruction* to_add = new (&allocator) HNullCheck(parameter, 0);
+ entry->AddInstruction(to_add);
+
+ ASSERT_TRUE(parameter->HasUses());
+ ASSERT_EQ(parameter->NumberOfUses(), 1u);
+}
+
} // namespace art