summaryrefslogtreecommitdiff
path: root/compiler/optimizing/nodes.cc
diff options
context:
space:
mode:
author Nicolas Geoffray <ngeoffray@google.com> 2018-07-03 09:39:07 +0100
committer Nicolas Geoffray <ngeoffray@google.com> 2018-07-03 11:22:34 +0100
commit8a62a4c9570b345b715a022d33d443413a634392 (patch)
tree4b34426f14301f230e9d6b5f23486a038cf6e548 /compiler/optimizing/nodes.cc
parentb5271dd44a30f498689e503340d3c8d01bf31f07 (diff)
Handle String.<init> with a phi input.
We wrongly assumed only irreducible loops could lead to this situation, but any loop can actually be in between a String NewInstance and a String.<init>. bug: 109666561 Test: 563-checker-fakestring Change-Id: I018a22f7e22c15e140252544415f51d544f7cc13
Diffstat (limited to 'compiler/optimizing/nodes.cc')
-rw-r--r--compiler/optimizing/nodes.cc13
1 files changed, 13 insertions, 0 deletions
diff --git a/compiler/optimizing/nodes.cc b/compiler/optimizing/nodes.cc
index 661f66a34c..d243331dbe 100644
--- a/compiler/optimizing/nodes.cc
+++ b/compiler/optimizing/nodes.cc
@@ -1305,6 +1305,19 @@ void HInstruction::ReplaceUsesDominatedBy(HInstruction* dominator, HInstruction*
}
}
+void HInstruction::ReplaceEnvUsesDominatedBy(HInstruction* dominator, HInstruction* replacement) {
+ const HUseList<HEnvironment*>& uses = GetEnvUses();
+ for (auto it = uses.begin(), end = uses.end(); it != end; /* ++it below */) {
+ HEnvironment* user = it->GetUser();
+ size_t index = it->GetIndex();
+ // Increment `it` now because `*it` may disappear thanks to user->ReplaceInput().
+ ++it;
+ if (dominator->StrictlyDominates(user->GetHolder())) {
+ user->ReplaceInput(replacement, index);
+ }
+ }
+}
+
void HInstruction::ReplaceInput(HInstruction* replacement, size_t index) {
HUserRecord<HInstruction*> input_use = InputRecordAt(index);
if (input_use.GetInstruction() == replacement) {