140 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| ; 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
 |