diff options
author | 2022-10-12 17:35:58 +0100 | |
---|---|---|
committer | 2022-10-13 15:54:36 +0000 | |
commit | 07c7d430d72cdb07b8b5f20b6335fd236aab6fc1 (patch) | |
tree | f9c0780a9ff25aa97370b4ae762849a7b3fa0f5a /compiler/optimizing/builder.cc | |
parent | 28fb3a98c57cef6e6a72e72f67d89fb63eda6223 (diff) |
Update MaybeAddExtraGotoBlocks to bail for irreducible loops
We may have graphs with irreducible loops at this point and
recomputing the loop information is not supported.
Bug: 253242440
Test: dex2oat compiling the apps in the bug
Change-Id: I181b4fb9d9812ba2f14cd21602cf0e5a4e1fd18e
Diffstat (limited to 'compiler/optimizing/builder.cc')
-rw-r--r-- | compiler/optimizing/builder.cc | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/compiler/optimizing/builder.cc b/compiler/optimizing/builder.cc index b28c2d9592..fbec52d88f 100644 --- a/compiler/optimizing/builder.cc +++ b/compiler/optimizing/builder.cc @@ -113,8 +113,10 @@ static bool NeedsExtraGotoBlock(HBasicBlock* block) { return !last_instruction->IsThrow(); } -void HGraphBuilder::MaybeAddExtraGotoBlocks() { - if (graph_->GetExitBlock() == nullptr) return; +bool HGraphBuilder::MaybeAddExtraGotoBlocks() { + if (graph_->GetExitBlock() == nullptr) { + return true; + } bool added_block = false; for (size_t pred = 0, size = graph_->GetExitBlock()->GetPredecessors().size(); pred < size; @@ -130,13 +132,17 @@ void HGraphBuilder::MaybeAddExtraGotoBlocks() { // TODO(solanes): Avoid recomputing the full dominator tree by manually updating the relevant // information (loop information, dominance, try catch information). if (added_block) { - DCHECK(!graph_->HasIrreducibleLoops()) - << "Recomputing loop information in graphs with irreducible loops " - << "is unsupported, as it could lead to loop header changes"; + if (graph_->HasIrreducibleLoops()) { + // Recomputing loop information in graphs with irreducible loops is unsupported, as it could + // lead to loop header changes. In this case it is safe to abort since we don't inline graphs + // with irreducible loops anyway. + return false; + } graph_->ClearLoopInformation(); graph_->ClearDominanceInformation(); graph_->BuildDominatorTree(); } + return true; } GraphAnalysisResult HGraphBuilder::BuildGraph(bool build_for_inline) { @@ -193,7 +199,9 @@ GraphAnalysisResult HGraphBuilder::BuildGraph(bool build_for_inline) { // 5) When inlining, we want to add a Goto block if we have Return/ReturnVoid->TryBoundary->Exit // since we will have Return/ReturnVoid->TryBoundary->`continue to normal execution` once inlined. if (build_for_inline) { - MaybeAddExtraGotoBlocks(); + if (!MaybeAddExtraGotoBlocks()) { + return kAnalysisFailInliningIrreducibleLoop; + } } // 6) Type the graph and eliminate dead/redundant phis. |