You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
3.3 KiB
140 lines
3.3 KiB
; 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.
|
|
|
|
.class public Main
|
|
.super java/lang/Object
|
|
|
|
; Just do simple check that we remove the instance-of. Well formedness
|
|
; checks will be done in gtests.
|
|
;; CHECK-START: int Main.$noinline$test(boolean) instruction_simplifier (before)
|
|
;; CHECK-DAG: LoadClass
|
|
;; CHECK-DAG: LoadClass
|
|
;; CHECK-DAG: InstanceOf
|
|
;
|
|
;; CHECK-START: int Main.$noinline$test(boolean) instruction_simplifier (after)
|
|
;; CHECK-DAG: LoadClass
|
|
;; CHECK-DAG: LoadClass
|
|
;
|
|
;; CHECK-START: int Main.$noinline$test(boolean) instruction_simplifier (after)
|
|
;; CHECK-NOT: InstanceOf
|
|
;
|
|
;; CHECK-START: int Main.$noinline$test(boolean) instruction_simplifier$before_codegen (after)
|
|
;; CHECK-NOT: InstanceFieldSet
|
|
;; CHECK-NOT: InstanceFieldGet
|
|
;; CHECK-NOT: PredicatedInstanceFieldGet
|
|
|
|
; public static int $noinline$test(boolean escape) {
|
|
; Foo f = new Foo();
|
|
; f.intField = 7
|
|
; if (escape) {
|
|
; if (f instanceof Bar) {
|
|
; $noinline$escape(f);
|
|
; }
|
|
; }
|
|
; return f.intField;
|
|
; }
|
|
.method public static $noinline$test(Z)I
|
|
.limit stack 3
|
|
new Foo
|
|
; Stack: [f]
|
|
dup
|
|
; Stack: [f, f]
|
|
invokespecial Foo/<init>()V
|
|
; Stack: [f]
|
|
dup
|
|
; Stack: [f, f]
|
|
ldc 7
|
|
; Stack: [f, f, 7]
|
|
putfield Foo/intField I
|
|
; Stack: [f]
|
|
iload_0
|
|
; Stack: [f, escape]
|
|
ifeq finish
|
|
; Stack: [f]
|
|
dup
|
|
; Stack: [f, f]
|
|
; NB Baz does not exist
|
|
instanceof Baz
|
|
; Stack: [f, is_instance]
|
|
ifeq finish
|
|
; Stack: [f]
|
|
dup
|
|
; Stack: [f, f]
|
|
invokestatic Main/$noinline$escape(Ljava/lang/Object;)V
|
|
; Stack: [f]
|
|
finish: ; Stack: [f]
|
|
getfield Foo/intField I
|
|
; Stack: [f.intField]
|
|
ireturn
|
|
.end method
|
|
|
|
.method public static $noinline$escape(Ljava/lang/Object;)V
|
|
.limit stack 0
|
|
return
|
|
.end method
|
|
|
|
; public static void main(String[] args) {
|
|
; PrintStream out = System.out;
|
|
; int i = $noinline$test(false);
|
|
; if (i != 7) {
|
|
; out.print("FAIL! GOT ");
|
|
; out.println(i);
|
|
; }
|
|
; }
|
|
.method public static main([Ljava/lang/String;)V
|
|
.limit stack 5
|
|
; Stack: []
|
|
; locals: [args]
|
|
getstatic java/lang/System/out Ljava/io/PrintStream;
|
|
; Stack: [out]
|
|
; locals: [args]
|
|
astore_0
|
|
; Stack: []
|
|
; locals: [out]
|
|
bipush 0
|
|
; Stack: [0]
|
|
; locals: [out]
|
|
invokestatic Main/$noinline$test(Z)I
|
|
; Stack: [res]
|
|
; locals: [out]
|
|
dup
|
|
; Stack: [res, res]
|
|
; locals: [out]
|
|
bipush 7
|
|
; Stack: [res, res, 7]
|
|
; locals: [out]
|
|
if_icmpeq finish
|
|
; Stack: [res]
|
|
; locals: [out]
|
|
aload_0
|
|
; Stack: [res, out]
|
|
; locals: [out]
|
|
dup2
|
|
; Stack: [res, out, res, out]
|
|
; locals: [out]
|
|
ldc "FAIL! GOT "
|
|
; Stack: [res, out, res, out, "FAIL! GOT "]
|
|
; locals: [out]
|
|
invokevirtual java/io/PrintStream/print(Ljava/lang/String;)V
|
|
; Stack: [res, out, res]
|
|
; locals: [out]
|
|
invokevirtual java/io/PrintStream/println(I)V
|
|
; Stack: [res]
|
|
; locals: [out]
|
|
finish:
|
|
; Stack: [res]
|
|
; locals: [out]
|
|
return
|
|
.end method
|