diff options
| -rw-r--r-- | compiler/optimizing/code_sinking.cc | 5 | ||||
| -rw-r--r-- | test/680-sink-regression/expected.txt | 1 | ||||
| -rw-r--r-- | test/680-sink-regression/info.txt | 1 | ||||
| -rw-r--r-- | test/680-sink-regression/src/Main.java | 87 |
4 files changed, 94 insertions, 0 deletions
diff --git a/compiler/optimizing/code_sinking.cc b/compiler/optimizing/code_sinking.cc index f4760d661f..2e31d35584 100644 --- a/compiler/optimizing/code_sinking.cc +++ b/compiler/optimizing/code_sinking.cc @@ -214,6 +214,11 @@ static HInstruction* FindIdealPosition(HInstruction* instruction, DCHECK(target_block != nullptr); } + // Bail if the instruction can throw and we are about to move into a catch block. + if (instruction->CanThrow() && target_block->GetTryCatchInformation() != nullptr) { + return nullptr; + } + // Find insertion position. No need to filter anymore, as we have found a // target block. HInstruction* insert_pos = nullptr; diff --git a/test/680-sink-regression/expected.txt b/test/680-sink-regression/expected.txt new file mode 100644 index 0000000000..b0aad4deb5 --- /dev/null +++ b/test/680-sink-regression/expected.txt @@ -0,0 +1 @@ +passed diff --git a/test/680-sink-regression/info.txt b/test/680-sink-regression/info.txt new file mode 100644 index 0000000000..547e3b801a --- /dev/null +++ b/test/680-sink-regression/info.txt @@ -0,0 +1 @@ +Regression test for code sinking with exceptions (b/75971227). diff --git a/test/680-sink-regression/src/Main.java b/test/680-sink-regression/src/Main.java new file mode 100644 index 0000000000..642c3abdf4 --- /dev/null +++ b/test/680-sink-regression/src/Main.java @@ -0,0 +1,87 @@ +/* + * Copyright (C) 2018 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. + */ + +import java.io.*; + +/** + * Regression test for b/75971227 (code sinking with exceptions). + */ +public class Main { + + public static class N { + int x; + } + + private int f; + + public int doit(N n1) throws FileNotFoundException { + int x = 1; + N n3 = new N(); + try { + if (n1.x == 0) { + f = 11; + x = 3; + } else { + f = x; + } + throw new FileNotFoundException("n3" + n3.x); + } catch (NullPointerException e) { + } + return x; + } + + + public static void main(String[] args) { + N n = new N(); + Main t = new Main(); + int x = 0; + + // Main 1, null pointer argument. + t.f = 0; + try { + x = t.doit(null); + } catch (FileNotFoundException e) { + x = -1; + } + if (x != 1 || t.f != 0) { + throw new Error("Main 1: x=" + x + " f=" + t.f); + } + + // Main 2, n.x is 0. + n.x = 0; + try { + x = t.doit(n); + } catch (FileNotFoundException e) { + x = -1; + } + if (x != -1 || t.f != 11) { + throw new Error("Main 2: x=" + x + " f=" + t.f); + } + + // Main 3, n.x is not 0. + n.x = 1; + try { + x = t.doit(n); + } catch (FileNotFoundException e) { + x = -1; + } + if (x != -1 || t.f != 1) { + throw new Error("Main 3: x=" + x + " f=" + t.f); + } + + System.out.println("passed"); + } +} |