blob: 8894d4e5ce898e922b0a5e00ea32e8a22ccb7217 [file] [log] [blame]
David Brazdil68427b12015-01-07 19:22:04 +00001/*
2* Copyright (C) 2014 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
David Brazdil4846d132015-01-15 19:07:08 +000017public class Main {
David Brazdil9a6f20e2014-12-19 11:17:21 +000018
David Brazdil4846d132015-01-15 19:07:08 +000019 // CHECK-START: void Main.InlineVoid() inliner (before)
David Brazdilc2c48ff2015-05-15 14:24:31 +010020 // CHECK-DAG: <<Const42:i\d+>> IntConstant 42
David Brazdilbe0cc082014-12-31 11:49:30 +000021 // CHECK-DAG: InvokeStaticOrDirect
David Brazdilc57397b2015-05-15 16:01:59 +010022 // CHECK-DAG: InvokeStaticOrDirect [<<Const42>>]
David Brazdil9a6f20e2014-12-19 11:17:21 +000023
David Brazdil4846d132015-01-15 19:07:08 +000024 // CHECK-START: void Main.InlineVoid() inliner (after)
David Brazdilbe0cc082014-12-31 11:49:30 +000025 // CHECK-NOT: InvokeStaticOrDirect
David Brazdil9a6f20e2014-12-19 11:17:21 +000026
27 public static void InlineVoid() {
28 returnVoid();
29 returnVoidWithOneParameter(42);
30 }
31
David Brazdil4846d132015-01-15 19:07:08 +000032 // CHECK-START: int Main.InlineParameter(int) inliner (before)
David Brazdilc2c48ff2015-05-15 14:24:31 +010033 // CHECK-DAG: <<Param:i\d+>> ParameterValue
David Brazdilc57397b2015-05-15 16:01:59 +010034 // CHECK-DAG: <<Result:i\d+>> InvokeStaticOrDirect [<<Param>>]
35 // CHECK-DAG: Return [<<Result>>]
David Brazdil9a6f20e2014-12-19 11:17:21 +000036
David Brazdil4846d132015-01-15 19:07:08 +000037 // CHECK-START: int Main.InlineParameter(int) inliner (after)
David Brazdilc2c48ff2015-05-15 14:24:31 +010038 // CHECK-DAG: <<Param:i\d+>> ParameterValue
David Brazdilc57397b2015-05-15 16:01:59 +010039 // CHECK-DAG: Return [<<Param>>]
David Brazdil9a6f20e2014-12-19 11:17:21 +000040
41 public static int InlineParameter(int a) {
42 return returnParameter(a);
43 }
44
David Brazdil4846d132015-01-15 19:07:08 +000045 // CHECK-START: long Main.InlineWideParameter(long) inliner (before)
David Brazdilc2c48ff2015-05-15 14:24:31 +010046 // CHECK-DAG: <<Param:j\d+>> ParameterValue
David Brazdilc57397b2015-05-15 16:01:59 +010047 // CHECK-DAG: <<Result:j\d+>> InvokeStaticOrDirect [<<Param>>]
48 // CHECK-DAG: Return [<<Result>>]
David Brazdil9a6f20e2014-12-19 11:17:21 +000049
David Brazdil4846d132015-01-15 19:07:08 +000050 // CHECK-START: long Main.InlineWideParameter(long) inliner (after)
David Brazdilc2c48ff2015-05-15 14:24:31 +010051 // CHECK-DAG: <<Param:j\d+>> ParameterValue
David Brazdilc57397b2015-05-15 16:01:59 +010052 // CHECK-DAG: Return [<<Param>>]
David Brazdil9a6f20e2014-12-19 11:17:21 +000053
54 public static long InlineWideParameter(long a) {
55 return returnWideParameter(a);
56 }
57
David Brazdil4846d132015-01-15 19:07:08 +000058 // CHECK-START: java.lang.Object Main.InlineReferenceParameter(java.lang.Object) inliner (before)
David Brazdilc2c48ff2015-05-15 14:24:31 +010059 // CHECK-DAG: <<Param:l\d+>> ParameterValue
David Brazdilc57397b2015-05-15 16:01:59 +010060 // CHECK-DAG: <<Result:l\d+>> InvokeStaticOrDirect [<<Param>>]
61 // CHECK-DAG: Return [<<Result>>]
David Brazdil9a6f20e2014-12-19 11:17:21 +000062
David Brazdil4846d132015-01-15 19:07:08 +000063 // CHECK-START: java.lang.Object Main.InlineReferenceParameter(java.lang.Object) inliner (after)
David Brazdilc2c48ff2015-05-15 14:24:31 +010064 // CHECK-DAG: <<Param:l\d+>> ParameterValue
David Brazdilc57397b2015-05-15 16:01:59 +010065 // CHECK-DAG: Return [<<Param>>]
David Brazdil9a6f20e2014-12-19 11:17:21 +000066
67 public static Object InlineReferenceParameter(Object o) {
68 return returnReferenceParameter(o);
69 }
70
David Brazdil4846d132015-01-15 19:07:08 +000071 // CHECK-START: int Main.InlineInt() inliner (before)
David Brazdilc2c48ff2015-05-15 14:24:31 +010072 // CHECK-DAG: <<Result:i\d+>> InvokeStaticOrDirect
David Brazdilc57397b2015-05-15 16:01:59 +010073 // CHECK-DAG: Return [<<Result>>]
David Brazdil9a6f20e2014-12-19 11:17:21 +000074
David Brazdil4846d132015-01-15 19:07:08 +000075 // CHECK-START: int Main.InlineInt() inliner (after)
David Brazdilc2c48ff2015-05-15 14:24:31 +010076 // CHECK-DAG: <<Const4:i\d+>> IntConstant 4
David Brazdilc57397b2015-05-15 16:01:59 +010077 // CHECK-DAG: Return [<<Const4>>]
David Brazdil9a6f20e2014-12-19 11:17:21 +000078
79 public static int InlineInt() {
80 return returnInt();
81 }
82
David Brazdil4846d132015-01-15 19:07:08 +000083 // CHECK-START: long Main.InlineWide() inliner (before)
David Brazdilc2c48ff2015-05-15 14:24:31 +010084 // CHECK-DAG: <<Result:j\d+>> InvokeStaticOrDirect
David Brazdilc57397b2015-05-15 16:01:59 +010085 // CHECK-DAG: Return [<<Result>>]
David Brazdil9a6f20e2014-12-19 11:17:21 +000086
David Brazdil4846d132015-01-15 19:07:08 +000087 // CHECK-START: long Main.InlineWide() inliner (after)
David Brazdilc2c48ff2015-05-15 14:24:31 +010088 // CHECK-DAG: <<Const8:j\d+>> LongConstant 8
David Brazdilc57397b2015-05-15 16:01:59 +010089 // CHECK-DAG: Return [<<Const8>>]
David Brazdil9a6f20e2014-12-19 11:17:21 +000090
91 public static long InlineWide() {
92 return returnWide();
93 }
94
David Brazdil4846d132015-01-15 19:07:08 +000095 // CHECK-START: int Main.InlineAdd() inliner (before)
David Brazdilc2c48ff2015-05-15 14:24:31 +010096 // CHECK-DAG: <<Const3:i\d+>> IntConstant 3
97 // CHECK-DAG: <<Const5:i\d+>> IntConstant 5
98 // CHECK-DAG: <<Result:i\d+>> InvokeStaticOrDirect
David Brazdilc57397b2015-05-15 16:01:59 +010099 // CHECK-DAG: Return [<<Result>>]
David Brazdil9a6f20e2014-12-19 11:17:21 +0000100
David Brazdil4846d132015-01-15 19:07:08 +0000101 // CHECK-START: int Main.InlineAdd() inliner (after)
David Brazdilc2c48ff2015-05-15 14:24:31 +0100102 // CHECK-DAG: <<Const3:i\d+>> IntConstant 3
103 // CHECK-DAG: <<Const5:i\d+>> IntConstant 5
David Brazdilc57397b2015-05-15 16:01:59 +0100104 // CHECK-DAG: <<Add:i\d+>> Add [<<Const3>>,<<Const5>>]
105 // CHECK-DAG: Return [<<Add>>]
David Brazdil9a6f20e2014-12-19 11:17:21 +0000106
107 public static int InlineAdd() {
108 return returnAdd(3, 5);
109 }
110
David Brazdil4846d132015-01-15 19:07:08 +0000111 // CHECK-START: int Main.InlineFieldAccess() inliner (before)
David Brazdilc2c48ff2015-05-15 14:24:31 +0100112 // CHECK-DAG: <<After:i\d+>> InvokeStaticOrDirect
David Brazdilc57397b2015-05-15 16:01:59 +0100113 // CHECK-DAG: Return [<<After>>]
David Brazdil9a6f20e2014-12-19 11:17:21 +0000114
David Brazdil4846d132015-01-15 19:07:08 +0000115 // CHECK-START: int Main.InlineFieldAccess() inliner (after)
David Brazdilc2c48ff2015-05-15 14:24:31 +0100116 // CHECK-DAG: <<Const1:i\d+>> IntConstant 1
117 // CHECK-DAG: <<Before:i\d+>> StaticFieldGet
David Brazdilc57397b2015-05-15 16:01:59 +0100118 // CHECK-DAG: <<After:i\d+>> Add [<<Before>>,<<Const1>>]
119 // CHECK-DAG: StaticFieldSet [{{l\d+}},<<After>>]
120 // CHECK-DAG: Return [<<After>>]
David Brazdil9a6f20e2014-12-19 11:17:21 +0000121
David Brazdil4846d132015-01-15 19:07:08 +0000122 // CHECK-START: int Main.InlineFieldAccess() inliner (after)
David Brazdilbe0cc082014-12-31 11:49:30 +0000123 // CHECK-NOT: InvokeStaticOrDirect
David Brazdil9a6f20e2014-12-19 11:17:21 +0000124
125 public static int InlineFieldAccess() {
126 return incCounter();
127 }
128
David Brazdil4846d132015-01-15 19:07:08 +0000129 // CHECK-START: int Main.InlineWithControlFlow(boolean) inliner (before)
David Brazdilc2c48ff2015-05-15 14:24:31 +0100130 // CHECK-DAG: <<Const1:i\d+>> IntConstant 1
131 // CHECK-DAG: <<Const3:i\d+>> IntConstant 3
132 // CHECK-DAG: <<Const5:i\d+>> IntConstant 5
David Brazdilc57397b2015-05-15 16:01:59 +0100133 // CHECK-DAG: <<Add:i\d+>> InvokeStaticOrDirect [<<Const1>>,<<Const3>>]
134 // CHECK-DAG: <<Sub:i\d+>> InvokeStaticOrDirect [<<Const5>>,<<Const3>>]
135 // CHECK-DAG: <<Phi:i\d+>> Phi [<<Add>>,<<Sub>>]
136 // CHECK-DAG: Return [<<Phi>>]
David Brazdil9a6f20e2014-12-19 11:17:21 +0000137
David Brazdil4846d132015-01-15 19:07:08 +0000138 // CHECK-START: int Main.InlineWithControlFlow(boolean) inliner (after)
David Brazdilc2c48ff2015-05-15 14:24:31 +0100139 // CHECK-DAG: <<Const1:i\d+>> IntConstant 1
140 // CHECK-DAG: <<Const3:i\d+>> IntConstant 3
141 // CHECK-DAG: <<Const5:i\d+>> IntConstant 5
David Brazdilc57397b2015-05-15 16:01:59 +0100142 // CHECK-DAG: <<Add:i\d+>> Add [<<Const1>>,<<Const3>>]
143 // CHECK-DAG: <<Sub:i\d+>> Sub [<<Const5>>,<<Const3>>]
144 // CHECK-DAG: <<Phi:i\d+>> Phi [<<Add>>,<<Sub>>]
145 // CHECK-DAG: Return [<<Phi>>]
David Brazdil9a6f20e2014-12-19 11:17:21 +0000146
147 public static int InlineWithControlFlow(boolean cond) {
148 int x, const1, const3, const5;
149 const1 = 1;
150 const3 = 3;
151 const5 = 5;
152 if (cond) {
153 x = returnAdd(const1, const3);
154 } else {
155 x = returnSub(const5, const3);
156 }
157 return x;
158 }
159
160
161 private static void returnVoid() {
162 return;
163 }
164
165 private static void returnVoidWithOneParameter(int a) {
166 return;
167 }
168
169 private static int returnParameter(int a) {
170 return a;
171 }
172
173 private static long returnWideParameter(long a) {
174 return a;
175 }
176
177 private static Object returnReferenceParameter(Object o) {
178 return o;
179 }
180
181 private static int returnInt() {
182 return 4;
183 }
184
185 private static long returnWide() {
186 return 8L;
187 }
188
189 private static int returnAdd(int a, int b) {
190 return a + b;
191 }
192
193 private static int returnSub(int a, int b) {
194 return a - b;
195 }
196
197 private static int counter = 42;
198
199 private static int incCounter() {
200 return ++counter;
201 }
David Brazdil4846d132015-01-15 19:07:08 +0000202
203 public static void main(String[] args) {
204 InlineVoid();
205
206 if (InlineInt() != 4) {
207 throw new Error();
208 }
209
210 if (InlineWide() != 8L) {
211 throw new Error();
212 }
213
214 if (InlineParameter(42) != 42) {
215 throw new Error();
216 }
217
218 if (InlineWideParameter(0x100000001L) != 0x100000001L) {
219 throw new Error();
220 }
221
222 if (InlineReferenceParameter(Main.class) != Main.class) {
223 throw new Error();
224 }
225
226 if (InlineAdd() != 8) {
227 throw new Error();
228 }
229
230 if (InlineFieldAccess() != 43 || InlineFieldAccess() != 44) {
231 throw new Error();
232 }
233
234 if (InlineWithControlFlow(true) != 4) {
235 throw new Error();
236 }
237
238 if (InlineWithControlFlow(false) != 2) {
239 throw new Error();
240 }
241 }
David Brazdil9a6f20e2014-12-19 11:17:21 +0000242}