diff options
author | 2016-01-08 17:37:10 +0000 | |
---|---|---|
committer | 2016-01-14 16:22:13 +0000 | |
commit | 6de1938e562b0d06e462512dd806166e754035ea (patch) | |
tree | f9df086a73860c20768d17ff7bc5be4139567941 /compiler/optimizing/instruction_simplifier.cc | |
parent | f5b84ee14a3bc578f799a39dca1ae512b49356ea (diff) |
ART: Remove incorrect HFakeString optimization
Simplification of HFakeString assumes that it cannot be used until
String.<init> is called which is not true and causes different
behaviour between the compiler and the interpreter. This patch
removes the optimization together with the HFakeString instruction.
Instead, HNewInstance is generated and an empty String allocated
until it is replaced with the result of the StringFactory call. This
is consistent with the behaviour of the interpreter but is too
conservative. A follow-up CL will attempt to optimize out the initial
allocation when possible.
Bug: 26457745
Bug: 26486014
Change-Id: I7139e37ed00a880715bfc234896a930fde670c44
Diffstat (limited to 'compiler/optimizing/instruction_simplifier.cc')
-rw-r--r-- | compiler/optimizing/instruction_simplifier.cc | 43 |
1 files changed, 0 insertions, 43 deletions
diff --git a/compiler/optimizing/instruction_simplifier.cc b/compiler/optimizing/instruction_simplifier.cc index b90afb1d73..49fc8c71b3 100644 --- a/compiler/optimizing/instruction_simplifier.cc +++ b/compiler/optimizing/instruction_simplifier.cc @@ -77,7 +77,6 @@ class InstructionSimplifierVisitor : public HGraphDelegateVisitor { void VisitUShr(HUShr* instruction) OVERRIDE; void VisitXor(HXor* instruction) OVERRIDE; void VisitInstanceOf(HInstanceOf* instruction) OVERRIDE; - void VisitFakeString(HFakeString* fake_string) OVERRIDE; void VisitInvoke(HInvoke* invoke) OVERRIDE; void VisitDeoptimize(HDeoptimize* deoptimize) OVERRIDE; @@ -1179,48 +1178,6 @@ void InstructionSimplifierVisitor::VisitXor(HXor* instruction) { TryReplaceWithRotate(instruction); } -void InstructionSimplifierVisitor::VisitFakeString(HFakeString* instruction) { - HInstruction* actual_string = nullptr; - - // Find the string we need to replace this instruction with. The actual string is - // the return value of a StringFactory call. - for (HUseIterator<HInstruction*> it(instruction->GetUses()); !it.Done(); it.Advance()) { - HInstruction* use = it.Current()->GetUser(); - if (use->IsInvokeStaticOrDirect() - && use->AsInvokeStaticOrDirect()->IsStringFactoryFor(instruction)) { - use->AsInvokeStaticOrDirect()->RemoveFakeStringArgumentAsLastInput(); - actual_string = use; - break; - } - } - - // Check that there is no other instruction that thinks it is the factory for that string. - if (kIsDebugBuild) { - CHECK(actual_string != nullptr); - for (HUseIterator<HInstruction*> it(instruction->GetUses()); !it.Done(); it.Advance()) { - HInstruction* use = it.Current()->GetUser(); - if (use->IsInvokeStaticOrDirect()) { - CHECK(!use->AsInvokeStaticOrDirect()->IsStringFactoryFor(instruction)); - } - } - } - - // We need to remove any environment uses of the fake string that are not dominated by - // `actual_string` to null. - for (HUseIterator<HEnvironment*> it(instruction->GetEnvUses()); !it.Done(); it.Advance()) { - HEnvironment* environment = it.Current()->GetUser(); - if (!actual_string->StrictlyDominates(environment->GetHolder())) { - environment->RemoveAsUserOfInput(it.Current()->GetIndex()); - environment->SetRawEnvAt(it.Current()->GetIndex(), nullptr); - } - } - - // Only uses dominated by `actual_string` must remain. We can safely replace and remove - // `instruction`. - instruction->ReplaceWith(actual_string); - instruction->GetBlock()->RemoveInstruction(instruction); -} - void InstructionSimplifierVisitor::SimplifyStringEquals(HInvoke* instruction) { HInstruction* argument = instruction->InputAt(1); HInstruction* receiver = instruction->InputAt(0); |