; 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/()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