blob: d5563b85b34cb651f165c38aee0d42914491e295 [file] [log] [blame]
Nicolas Geoffray9437b782015-03-25 10:08:51 +00001/*
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.
19class AAA {
20}
21
22public 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
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
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
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
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
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
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
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
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
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
151 public static Class inlineOtherDexCallingMain() {
152 return OtherDex.returnOtherDexCallingMain();
153 }
154
155 public static Class getOtherClass() {
156 return Main.class;
157 }
158
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}