diff options
author | 2016-08-30 10:23:01 -0700 | |
---|---|---|
committer | 2016-10-24 10:48:23 -0700 | |
commit | 1ceb37c75544c5285fb87f27e1d9fa7261ced60c (patch) | |
tree | a2c672170bb8424a148298706c6fd71d892a1b6e /test/621-checker-new-instance/src/Main.java | |
parent | 3667e26de4856cccf24bcbab54ad3349a05267c0 (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.java | 53 |
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"; + } +} |