diff options
Diffstat (limited to 'compiler/optimizing/ssa_builder.cc')
-rw-r--r-- | compiler/optimizing/ssa_builder.cc | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/compiler/optimizing/ssa_builder.cc b/compiler/optimizing/ssa_builder.cc index 0d0e1ecf1f..a5e8ff65a9 100644 --- a/compiler/optimizing/ssa_builder.cc +++ b/compiler/optimizing/ssa_builder.cc @@ -496,6 +496,22 @@ void SsaBuilder::RemoveRedundantUninitializedStrings() { } } +static bool HasPhiEquivalentAtLoopEntry(HGraph* graph) { + // Phi equivalents for a dex register do not work with OSR, as the phis will + // receive two different stack slots but only one is recorded in the stack + // map. + for (HBasicBlock* block : graph->GetReversePostOrder()) { + if (block->IsLoopHeader()) { + for (HInstructionIterator it(block->GetPhis()); !it.Done(); it.Advance()) { + if (it.Current()->AsPhi()->HasEquivalentPhi()) { + return true; + } + } + } + } + return false; +} + GraphAnalysisResult SsaBuilder::BuildSsa() { DCHECK(!graph_->IsInSsaForm()); @@ -574,6 +590,10 @@ GraphAnalysisResult SsaBuilder::BuildSsa() { // other optimizations. RemoveRedundantUninitializedStrings(); + if (graph_->IsCompilingOsr() && HasPhiEquivalentAtLoopEntry(graph_)) { + return kAnalysisFailPhiEquivalentInOsr; + } + graph_->SetInSsaForm(); return kAnalysisSuccess; } |