diff options
-rw-r--r-- | compiler/optimizing/nodes.h | 2 | ||||
-rw-r--r-- | test/465-checker-clinit-gvn/expected.txt | 0 | ||||
-rw-r--r-- | test/465-checker-clinit-gvn/info.txt | 1 | ||||
-rw-r--r-- | test/465-checker-clinit-gvn/src/Main.java | 78 |
4 files changed, 80 insertions, 1 deletions
diff --git a/compiler/optimizing/nodes.h b/compiler/optimizing/nodes.h index c4e2798ab3..21ed3504f1 100644 --- a/compiler/optimizing/nodes.h +++ b/compiler/optimizing/nodes.h @@ -3115,7 +3115,7 @@ class HLoadString : public HExpression<0> { class HClinitCheck : public HExpression<1> { public: explicit HClinitCheck(HLoadClass* constant, uint32_t dex_pc) - : HExpression(Primitive::kPrimNot, SideEffects::All()), + : HExpression(Primitive::kPrimNot, SideEffects::ChangesSomething()), dex_pc_(dex_pc) { SetRawInputAt(0, constant); } diff --git a/test/465-checker-clinit-gvn/expected.txt b/test/465-checker-clinit-gvn/expected.txt new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/test/465-checker-clinit-gvn/expected.txt diff --git a/test/465-checker-clinit-gvn/info.txt b/test/465-checker-clinit-gvn/info.txt new file mode 100644 index 0000000000..ac28a8ff45 --- /dev/null +++ b/test/465-checker-clinit-gvn/info.txt @@ -0,0 +1 @@ +Check that we GVN HClinitCheck instructions. diff --git a/test/465-checker-clinit-gvn/src/Main.java b/test/465-checker-clinit-gvn/src/Main.java new file mode 100644 index 0000000000..dcaef6fcfe --- /dev/null +++ b/test/465-checker-clinit-gvn/src/Main.java @@ -0,0 +1,78 @@ +/* +* Copyright (C) 2015 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. +*/ + +class OtherClass { + static { + a = 42; + b = 54; + } + + static int a; + static int b; +} + +public final class Main { + + // CHECK-START: int Main.accessTwoStatics() GVN (before) + // CHECK-DAG: [[Class1:l\d+]] LoadClass + // CHECK-DAG: ClinitCheck [ [[Class1]] ] + // CHECK-DAG: [[Class2:l\d+]] LoadClass + // CHECK-DAG: ClinitCheck [ [[Class2]] ] + + // CHECK-START: int Main.accessTwoStatics() GVN (after) + // CHECK-DAG: [[Class:l\d+]] LoadClass + // CHECK-DAG: ClinitCheck [ [[Class]] ] + // CHECK-NOT: ClinitCheck + + public static int accessTwoStatics() { + return OtherClass.b - OtherClass.a; + } + + // CHECK-START: int Main.accessTwoStaticsCallInBetween() GVN (before) + // CHECK-DAG: [[Class1:l\d+]] LoadClass + // CHECK-DAG: ClinitCheck [ [[Class1]] ] + // CHECK-DAG: [[Class2:l\d+]] LoadClass + // CHECK-DAG: ClinitCheck [ [[Class2]] ] + + // CHECK-START: int Main.accessTwoStaticsCallInBetween() GVN (after) + // CHECK-DAG: [[Class:l\d+]] LoadClass + // CHECK-DAG: ClinitCheck [ [[Class]] ] + // CHECK-NOT: ClinitCheck + + public static int accessTwoStaticsCallInBetween() { + int b = OtherClass.b; + foo(); + return b - OtherClass.a; + } + + public static void foo() { + try { + Thread.sleep(0); + } catch (Exception e) { + throw new Error(e); + } + } + + public static void main(String[] args) { + if (accessTwoStatics() != 12) { + throw new Error("Expected 12"); + } + + if (accessTwoStaticsCallInBetween() != 12) { + throw new Error("Expected 12"); + } + } +} |