diff options
author | Nicolas Geoffray <ngeoffray@google.com> | 2021-08-29 16:51:55 +0100 |
---|---|---|
committer | Nicolas Geoffray <ngeoffray@google.com> | 2021-09-13 13:56:42 +0000 |
commit | 9c70cdb384578e5c37b828cf4f629c929d743d1f (patch) | |
tree | 51fcf85a576098dd865da4f03b52835d092a14d9 | |
parent | 4667b35dbf14877ced91b77375e1acd922b02bbf (diff) |
Partial LSE: handle all kinds of infinite loops.
A subgraph could also have an infinite loop.
Test: 826-inifinite-loop
Bug: 196246395
Merged-In: Ifd1e1ae0f42dfe2cc156386fc166101c20748fc9
(cherry picked from commit 96dadefd24331f6808cb287048269ba772423c33)
Change-Id: I410ec26aefbc42629ba7dbe5a19a87399cefe396
(cherry picked from commit 1c7eeae26429bf76c47a1eaf6eddf514c000ba71)
-rw-r--r-- | compiler/optimizing/execution_subgraph.cc | 13 | ||||
-rw-r--r-- | test/826-infinite-loop/expected-stderr.txt | 0 | ||||
-rw-r--r-- | test/826-infinite-loop/expected-stdout.txt | 0 | ||||
-rw-r--r-- | test/826-infinite-loop/info.txt | 2 | ||||
-rw-r--r-- | test/826-infinite-loop/src/Main.java | 26 |
5 files changed, 33 insertions, 8 deletions
diff --git a/compiler/optimizing/execution_subgraph.cc b/compiler/optimizing/execution_subgraph.cc index 6d105668c0..66fdfcda5b 100644 --- a/compiler/optimizing/execution_subgraph.cc +++ b/compiler/optimizing/execution_subgraph.cc @@ -86,12 +86,6 @@ void ExecutionSubgraph::Prune() { ScopedArenaVector<std::bitset<kMaxFilterableSuccessors>> results( graph_->GetBlocks().size(), temporaries.Adapter(kArenaAllocLSA)); unreachable_blocks_.ClearAllBits(); - // TODO We should support infinite loops as well. - if (UNLIKELY(graph_->GetExitBlock() == nullptr)) { - // Infinite loop - valid_ = false; - return; - } // Fills up the 'results' map with what we need to add to update // allowed_successors in order to prune sink nodes. bool start_reaches_end = false; @@ -170,8 +164,11 @@ void ExecutionSubgraph::Prune() { << "current path size: " << current_path.size() << " cur_block id: " << cur_block->GetBlockId() << " entry id " << graph_->GetEntryBlock()->GetBlockId(); - DCHECK(!visiting.IsBitSet(id)) - << "Somehow ended up in a loop! This should have been caught before now! " << id; + if (visiting.IsBitSet(id)) { + // TODO We should support infinite loops as well. + start_reaches_end = false; + break; + } std::bitset<kMaxFilterableSuccessors>& result = results[id]; if (cur_block == graph_->GetExitBlock()) { start_reaches_end = true; diff --git a/test/826-infinite-loop/expected-stderr.txt b/test/826-infinite-loop/expected-stderr.txt new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/test/826-infinite-loop/expected-stderr.txt diff --git a/test/826-infinite-loop/expected-stdout.txt b/test/826-infinite-loop/expected-stdout.txt new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/test/826-infinite-loop/expected-stdout.txt diff --git a/test/826-infinite-loop/info.txt b/test/826-infinite-loop/info.txt new file mode 100644 index 0000000000..13a89d8ca2 --- /dev/null +++ b/test/826-infinite-loop/info.txt @@ -0,0 +1,2 @@ +Regression test for partial escape elimination, which used to crash when +visiting an infinite loop. diff --git a/test/826-infinite-loop/src/Main.java b/test/826-infinite-loop/src/Main.java new file mode 100644 index 0000000000..85bcb28baf --- /dev/null +++ b/test/826-infinite-loop/src/Main.java @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +final class Main { + public static void main(String[] args) { + Object o = new Object(); + if (args.length == 0) { + while (true) { + System.out.println(new Object()); + } + } + } +} |