summaryrefslogtreecommitdiff
path: root/test/621-checker-new-instance/src/Main.java
diff options
context:
space:
mode:
author Mathieu Chartier <mathieuc@google.com> 2016-08-30 10:23:01 -0700
committer Mathieu Chartier <mathieuc@google.com> 2016-10-24 10:48:23 -0700
commit1ceb37c75544c5285fb87f27e1d9fa7261ced60c (patch)
treea2c672170bb8424a148298706c6fd71d892a1b6e /test/621-checker-new-instance/src/Main.java
parent3667e26de4856cccf24bcbab54ad3349a05267c0 (diff)
Remove unnecessary load class for new instance
Remove the load class for new instance if the load class has only one use and can not throw. Previously many were not removed due to MarkInDexCache nulling out the environment of the HLoadClass and causing CanMoveClinitCheck to fail. Also keep track of initialized HLoadClass and always remove clinit checks for these. Added checker regression test. Code size savings: ARM64 CC boot.oat: 47896936 -> 47642488 (-0.53%) Savings from IsInitialized optimization: 65984 bytes Performance unmeasured, probably faster due to removing unnecessary work. Test: test-art-host with CC baker Bug: 29516974 Change-Id: I43358762ffb380ebe7e6518d0d440a5e1cc03b61
Diffstat (limited to 'test/621-checker-new-instance/src/Main.java')
-rw-r--r--test/621-checker-new-instance/src/Main.java53
1 files changed, 53 insertions, 0 deletions
diff --git a/test/621-checker-new-instance/src/Main.java b/test/621-checker-new-instance/src/Main.java
new file mode 100644
index 0000000000..68a46449f0
--- /dev/null
+++ b/test/621-checker-new-instance/src/Main.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright (C) 2016 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.
+ */
+
+public class Main {
+ /// CHECK-START: java.lang.Object Main.newObject() prepare_for_register_allocation (before)
+ /// CHECK: LoadClass
+ /// CHECK: NewInstance
+
+ /// CHECK-START: java.lang.Object Main.newObject() prepare_for_register_allocation (after)
+ /// CHECK-NOT: LoadClass
+ /// CHECK: NewInstance
+ public static Object newObject() {
+ return new Object();
+ }
+
+ /// CHECK-START: java.lang.Object Main.newFinalizableMayThrow() prepare_for_register_allocation (after)
+ /// CHECK: LoadClass
+ /// CHECK: NewInstance
+ public static Object newFinalizableMayThrow() {
+ return $inline$newFinalizableMayThrow();
+ }
+
+ public static Object $inline$newFinalizableMayThrow() {
+ return new FinalizableMayThrow();
+ }
+
+ public static void main(String[] args) {
+ newFinalizableMayThrow();
+ newObject();
+ }
+}
+
+class FinalizableMayThrow {
+ // clinit may throw OOME.
+ static Object o = new Object();
+ static String s;
+ public void finalize() {
+ s = "Test";
+ }
+}