summaryrefslogtreecommitdiff
path: root/compiler/optimizing/builder.cc
diff options
context:
space:
mode:
author Santiago Aboy Solanes <solanes@google.com> 2022-10-12 17:35:58 +0100
committer Treehugger Robot <treehugger-gerrit@google.com> 2022-10-13 15:54:36 +0000
commit07c7d430d72cdb07b8b5f20b6335fd236aab6fc1 (patch)
treef9c0780a9ff25aa97370b4ae762849a7b3fa0f5a /compiler/optimizing/builder.cc
parent28fb3a98c57cef6e6a72e72f67d89fb63eda6223 (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.cc20
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.