summaryrefslogtreecommitdiffstats
path: root/compiler/optimizing
diff options
context:
space:
mode:
authorRoland Levillain <rpl@google.com>2014-10-13 16:10:27 +0100
committerRoland Levillain <rpl@google.com>2014-10-17 17:11:44 +0100
commit6c82d40eb142771086f5531998de2273ba5cc08c (patch)
tree31eb699ae915d2c58603417eff8a4b71f585070a /compiler/optimizing
parent75be28332b278cff9039b54bfb228ac72f539ccc (diff)
downloadart-6c82d40eb142771086f5531998de2273ba5cc08c.zip
art-6c82d40eb142771086f5531998de2273ba5cc08c.tar.gz
art-6c82d40eb142771086f5531998de2273ba5cc08c.tar.bz2
Have HInstruction::StrictlyDominates compute strict dominance.
Change-Id: I3a4fa133268615fb4ce54a0bcb43e0c2458cc865
Diffstat (limited to 'compiler/optimizing')
-rw-r--r--compiler/optimizing/graph_checker.cc4
-rw-r--r--compiler/optimizing/nodes.cc6
-rw-r--r--compiler/optimizing/nodes.h7
3 files changed, 11 insertions, 6 deletions
diff --git a/compiler/optimizing/graph_checker.cc b/compiler/optimizing/graph_checker.cc
index 9f40297..743ffc4 100644
--- a/compiler/optimizing/graph_checker.cc
+++ b/compiler/optimizing/graph_checker.cc
@@ -268,7 +268,7 @@ void SSAChecker::VisitInstruction(HInstruction* instruction) {
for (HUseIterator<HInstruction> use_it(instruction->GetUses());
!use_it.Done(); use_it.Advance()) {
HInstruction* use = use_it.Current()->GetUser();
- if (!use->IsPhi() && !instruction->Dominates(use)) {
+ if (!use->IsPhi() && !instruction->StrictlyDominates(use)) {
std::stringstream error;
error << "Instruction " << instruction->GetId()
<< " in block " << current_block_->GetBlockId()
@@ -285,7 +285,7 @@ void SSAChecker::VisitInstruction(HInstruction* instruction) {
for (size_t i = 0, e = environment->Size(); i < e; ++i) {
HInstruction* env_instruction = environment->GetInstructionAt(i);
if (env_instruction != nullptr
- && !env_instruction->Dominates(instruction)) {
+ && !env_instruction->StrictlyDominates(instruction)) {
std::stringstream error;
error << "Instruction " << env_instruction->GetId()
<< " in environment of instruction " << instruction->GetId()
diff --git a/compiler/optimizing/nodes.cc b/compiler/optimizing/nodes.cc
index aee2177..10c6014 100644
--- a/compiler/optimizing/nodes.cc
+++ b/compiler/optimizing/nodes.cc
@@ -472,7 +472,11 @@ bool HInstructionList::FoundBefore(const HInstruction* instruction1,
return true;
}
-bool HInstruction::Dominates(HInstruction* other_instruction) const {
+bool HInstruction::StrictlyDominates(HInstruction* other_instruction) const {
+ if (other_instruction == this) {
+ // An instruction does not strictly dominate itself.
+ return false;
+ }
HBasicBlock* block = GetBlock();
HBasicBlock* other_block = other_instruction->GetBlock();
if (block != other_block) {
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h
index ec26c4a..7bb71b6 100644
--- a/compiler/optimizing/nodes.h
+++ b/compiler/optimizing/nodes.h
@@ -684,9 +684,10 @@ class HInstruction : public ArenaObject {
return result;
}
- // Does this instruction dominate `other_instruction`? Aborts if
- // this instruction and `other_instruction` are both phis.
- bool Dominates(HInstruction* other_instruction) const;
+ // Does this instruction strictly dominate `other_instruction`?
+ // Returns false if this instruction and `other_instruction` are the same.
+ // Aborts if this instruction and `other_instruction` are both phis.
+ bool StrictlyDominates(HInstruction* other_instruction) const;
int GetId() const { return id_; }
void SetId(int id) { id_ = id; }