1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 // Add a class that will be the first entry in the dex cache, to 18 // avoid having the OtherDex and Main classes share the same cache index. 19 class AAA { 20 } 21 22 public class Main { 23 24 // CHECK-START: void Main.inlineEmptyMethod() inliner (before) 25 // CHECK-DAG: [[Invoke:v\d+]] InvokeStaticOrDirect 26 // CHECK-DAG: ReturnVoid 27 28 // CHECK-START: void Main.inlineEmptyMethod() inliner (after) 29 // CHECK-NOT: InvokeStaticOrDirect 30 inlineEmptyMethod()31 public static void inlineEmptyMethod() { 32 OtherDex.emptyMethod(); 33 } 34 35 // CHECK-START: int Main.inlineReturnIntMethod() inliner (before) 36 // CHECK-DAG: [[Invoke:i\d+]] InvokeStaticOrDirect 37 // CHECK-DAG: Return [ [[Invoke]] ] 38 39 // CHECK-START: int Main.inlineReturnIntMethod() inliner (after) 40 // CHECK-NOT: InvokeStaticOrDirect 41 42 // CHECK-START: int Main.inlineReturnIntMethod() inliner (after) 43 // CHECK-DAG: [[Const38:i\d+]] IntConstant 38 44 // CHECK-DAG: Return [ [[Const38]] ] 45 inlineReturnIntMethod()46 public static int inlineReturnIntMethod() { 47 return OtherDex.returnIntMethod(); 48 } 49 50 // CHECK-START: int Main.dontInlineOtherDexStatic() inliner (before) 51 // CHECK-DAG: [[Invoke:i\d+]] InvokeStaticOrDirect 52 // CHECK-DAG: Return [ [[Invoke]] ] 53 54 // CHECK-START: int Main.dontInlineOtherDexStatic() inliner (after) 55 // CHECK-DAG: [[Invoke:i\d+]] InvokeStaticOrDirect 56 // CHECK-DAG: Return [ [[Invoke]] ] 57 dontInlineOtherDexStatic()58 public static int dontInlineOtherDexStatic() { 59 return OtherDex.returnOtherDexStatic(); 60 } 61 62 // CHECK-START: int Main.inlineMainStatic() inliner (before) 63 // CHECK-DAG: [[Invoke:i\d+]] InvokeStaticOrDirect 64 // CHECK-DAG: Return [ [[Invoke]] ] 65 66 // CHECK-START: int Main.inlineMainStatic() inliner (after) 67 // CHECK-NOT: InvokeStaticOrDirect 68 69 // CHECK-START: int Main.inlineMainStatic() inliner (after) 70 // CHECK-DAG: [[Static:i\d+]] StaticFieldGet 71 // CHECK-DAG: Return [ [[Static]] ] 72 inlineMainStatic()73 public static int inlineMainStatic() { 74 return OtherDex.returnMainStatic(); 75 } 76 77 // CHECK-START: int Main.dontInlineRecursiveCall() inliner (before) 78 // CHECK-DAG: [[Invoke:i\d+]] InvokeStaticOrDirect 79 // CHECK-DAG: Return [ [[Invoke]] ] 80 81 // CHECK-START: int Main.dontInlineRecursiveCall() inliner (after) 82 // CHECK-DAG: [[Invoke:i\d+]] InvokeStaticOrDirect 83 // CHECK-DAG: Return [ [[Invoke]] ] 84 dontInlineRecursiveCall()85 public static int dontInlineRecursiveCall() { 86 return OtherDex.recursiveCall(); 87 } 88 89 // CHECK-START: java.lang.String Main.dontInlineReturnString() inliner (before) 90 // CHECK-DAG: [[Invoke:l\d+]] InvokeStaticOrDirect 91 // CHECK-DAG: Return [ [[Invoke]] ] 92 93 // CHECK-START: java.lang.String Main.dontInlineReturnString() inliner (after) 94 // CHECK-DAG: [[Invoke:l\d+]] InvokeStaticOrDirect 95 // CHECK-DAG: Return [ [[Invoke]] ] 96 dontInlineReturnString()97 public static String dontInlineReturnString() { 98 return OtherDex.returnString(); 99 } 100 101 // CHECK-START: java.lang.Class Main.dontInlineOtherDexClass() inliner (before) 102 // CHECK-DAG: [[Invoke:l\d+]] InvokeStaticOrDirect 103 // CHECK-DAG: Return [ [[Invoke]] ] 104 105 // CHECK-START: java.lang.Class Main.dontInlineOtherDexClass() inliner (after) 106 // CHECK-DAG: [[Invoke:l\d+]] InvokeStaticOrDirect 107 // CHECK-DAG: Return [ [[Invoke]] ] 108 dontInlineOtherDexClass()109 public static Class dontInlineOtherDexClass() { 110 return OtherDex.returnOtherDexClass(); 111 } 112 113 // CHECK-START: java.lang.Class Main.inlineMainClass() inliner (before) 114 // CHECK-DAG: [[Invoke:l\d+]] InvokeStaticOrDirect 115 // CHECK-DAG: Return [ [[Invoke]] ] 116 117 // CHECK-START: java.lang.Class Main.inlineMainClass() inliner (after) 118 // CHECK-NOT: InvokeStaticOrDirect 119 120 // CHECK-START: java.lang.Class Main.inlineMainClass() inliner (after) 121 // CHECK-DAG: [[Class:l\d+]] LoadClass 122 // CHECK-DAG: Return [ [[Class]] ] 123 inlineMainClass()124 public static Class inlineMainClass() { 125 return OtherDex.returnMainClass(); 126 } 127 128 // CHECK-START: java.lang.Class Main.dontInlineOtherDexClassStaticCall() inliner (before) 129 // CHECK-DAG: [[Invoke:l\d+]] InvokeStaticOrDirect 130 // CHECK-DAG: Return [ [[Invoke]] ] 131 132 // CHECK-START: java.lang.Class Main.dontInlineOtherDexClassStaticCall() inliner (after) 133 // CHECK-DAG: [[Invoke:l\d+]] InvokeStaticOrDirect 134 // CHECK-DAG: Return [ [[Invoke]] ] 135 dontInlineOtherDexClassStaticCall()136 public static Class dontInlineOtherDexClassStaticCall() { 137 return OtherDex.returnOtherDexClassStaticCall(); 138 } 139 140 // CHECK-START: java.lang.Class Main.inlineOtherDexCallingMain() inliner (before) 141 // CHECK-DAG: [[Invoke:l\d+]] InvokeStaticOrDirect 142 // CHECK-DAG: Return [ [[Invoke]] ] 143 144 // CHECK-START: java.lang.Class Main.inlineOtherDexCallingMain() inliner (after) 145 // CHECK-NOT: InvokeStaticOrDirect 146 147 // CHECK-START: java.lang.Class Main.inlineOtherDexCallingMain() inliner (after) 148 // CHECK-DAG: [[Class:l\d+]] LoadClass 149 // CHECK-DAG: Return [ [[Class]] ] 150 inlineOtherDexCallingMain()151 public static Class inlineOtherDexCallingMain() { 152 return OtherDex.returnOtherDexCallingMain(); 153 } 154 getOtherClass()155 public static Class getOtherClass() { 156 return Main.class; 157 } 158 main(String[] args)159 public static void main(String[] args) { 160 inlineEmptyMethod(); 161 if (inlineReturnIntMethod() != 38) { 162 throw new Error("Expected 38"); 163 } 164 165 if (dontInlineOtherDexStatic() != 1) { 166 throw new Error("Expected 1"); 167 } 168 169 if (inlineMainStatic() != 42) { 170 throw new Error("Expected 42"); 171 } 172 173 if (dontInlineReturnString() != "OtherDex") { 174 throw new Error("Expected OtherDex"); 175 } 176 177 if (dontInlineOtherDexClass() != OtherDex.class) { 178 throw new Error("Expected " + OtherDex.class); 179 } 180 181 if (dontInlineOtherDexClassStaticCall() != OtherDex.class) { 182 throw new Error("Expected " + OtherDex.class); 183 } 184 185 if (inlineMainClass() != Main.class) { 186 throw new Error("Expected " + Main.class); 187 } 188 189 if (inlineOtherDexCallingMain() != Main.class) { 190 throw new Error("Expected " + Main.class); 191 } 192 } 193 194 // Reference the AAA class to ensure it is in the dex cache. 195 public static Class<?> cls = AAA.class; 196 197 // Add a field that will be the first entry in the dex cache, to 198 // avoid having the OtherDex.myStatic and Main.myStatic fields 199 // share the same cache index. 200 public static int aaa = 32; 201 public static int myStatic = 42; 202 } 203