blob: ce7409c958481309f7dcb4ce267b29cf39e2404c [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 Brazdil9a6f20e2014-12-19 11:17:21 +000017public class Inliner {
18
19 // CHECK-START: void Inliner.InlineVoid() inliner (before)
20 // CHECK-DAG: [[Const42:i[0-9]+]] IntConstant 42
21 // CHECK-DAG: InvokeStaticOrDirect
22 // CHECK-DAG: InvokeStaticOrDirect [ [[Const42]] ]
23
24 // CHECK-START: void Inliner.InlineVoid() inliner (after)
25 // CHECK-NOT: InvokeStaticOrDirect
26
27 public static void InlineVoid() {
28 returnVoid();
29 returnVoidWithOneParameter(42);
30 }
31
32 // CHECK-START: int Inliner.InlineParameter(int) inliner (before)
33 // CHECK-DAG: [[Param:i[0-9]+]] ParameterValue
34 // CHECK-DAG: [[Result:i[0-9]+]] InvokeStaticOrDirect [ [[Param]] ]
35 // CHECK-DAG: Return [ [[Result]] ]
36
37 // CHECK-START: int Inliner.InlineParameter(int) inliner (after)
38 // CHECK-DAG: [[Param:i[0-9]+]] ParameterValue
39 // CHECK-DAG: Return [ [[Param]] ]
40
41 public static int InlineParameter(int a) {
42 return returnParameter(a);
43 }
44
45 // CHECK-START: long Inliner.InlineWideParameter(long) inliner (before)
46 // CHECK-DAG: [[Param:j[0-9]+]] ParameterValue
47 // CHECK-DAG: [[Result:j[0-9]+]] InvokeStaticOrDirect [ [[Param]] ]
48 // CHECK-DAG: Return [ [[Result]] ]
49
50 // CHECK-START: long Inliner.InlineWideParameter(long) inliner (after)
51 // CHECK-DAG: [[Param:j[0-9]+]] ParameterValue
52 // CHECK-DAG: Return [ [[Param]] ]
53
54 public static long InlineWideParameter(long a) {
55 return returnWideParameter(a);
56 }
57
58 // CHECK-START: java.lang.Object Inliner.InlineReferenceParameter(java.lang.Object) inliner (before)
59 // CHECK-DAG: [[Param:l[0-9]+]] ParameterValue
60 // CHECK-DAG: [[Result:l[0-9]+]] InvokeStaticOrDirect [ [[Param]] ]
61 // CHECK-DAG: Return [ [[Result]] ]
62
63 // CHECK-START: java.lang.Object Inliner.InlineReferenceParameter(java.lang.Object) inliner (after)
64 // CHECK-DAG: [[Param:l[0-9]+]] ParameterValue
65 // CHECK-DAG: Return [ [[Param]] ]
66
67 public static Object InlineReferenceParameter(Object o) {
68 return returnReferenceParameter(o);
69 }
70
71 // CHECK-START: int Inliner.InlineInt() inliner (before)
72 // CHECK-DAG: [[Result:i[0-9]+]] InvokeStaticOrDirect
73 // CHECK-DAG: Return [ [[Result]] ]
74
75 // CHECK-START: int Inliner.InlineInt() inliner (after)
76 // CHECK-DAG: [[Const4:i[0-9]+]] IntConstant 4
77 // CHECK-DAG: Return [ [[Const4]] ]
78
79 public static int InlineInt() {
80 return returnInt();
81 }
82
83 // CHECK-START: long Inliner.InlineWide() inliner (before)
84 // CHECK-DAG: [[Result:j[0-9]+]] InvokeStaticOrDirect
85 // CHECK-DAG: Return [ [[Result]] ]
86
87 // CHECK-START: long Inliner.InlineWide() inliner (after)
88 // CHECK-DAG: [[Const8:j[0-9]+]] LongConstant 8
89 // CHECK-DAG: Return [ [[Const8]] ]
90
91 public static long InlineWide() {
92 return returnWide();
93 }
94
95 // CHECK-START: int Inliner.InlineAdd() inliner (before)
96 // CHECK-DAG: [[Const3:i[0-9]+]] IntConstant 3
97 // CHECK-DAG: [[Const5:i[0-9]+]] IntConstant 5
98 // CHECK-DAG: [[Result:i[0-9]+]] InvokeStaticOrDirect
99 // CHECK-DAG: Return [ [[Result]] ]
100
101 // CHECK-START: int Inliner.InlineAdd() inliner (after)
102 // CHECK-DAG: [[Const3:i[0-9]+]] IntConstant 3
103 // CHECK-DAG: [[Const5:i[0-9]+]] IntConstant 5
104 // CHECK-DAG: [[Add:i[0-9]+]] Add [ [[Const3]] [[Const5]] ]
105 // CHECK-DAG: Return [ [[Add]] ]
106
107 public static int InlineAdd() {
108 return returnAdd(3, 5);
109 }
110
111 // CHECK-START: int Inliner.InlineFieldAccess() inliner (before)
112 // CHECK-DAG: [[After:i[0-9]+]] InvokeStaticOrDirect
113 // CHECK-DAG: Return [ [[After]] ]
114
115 // CHECK-START: int Inliner.InlineFieldAccess() inliner (after)
116 // CHECK-DAG: [[Const1:i[0-9]+]] IntConstant 1
117 // CHECK-DAG: [[Before:i[0-9]+]] StaticFieldGet
118 // CHECK-DAG: [[After:i[0-9]+]] Add [ [[Before]] [[Const1]] ]
119 // CHECK-DAG: StaticFieldSet [ {{l[0-9]+}} [[After]] ]
120 // CHECK-DAG: Return [ [[After]] ]
121
122 // CHECK-START: int Inliner.InlineFieldAccess() inliner (after)
123 // CHECK-NOT: InvokeStaticOrDirect
124
125 public static int InlineFieldAccess() {
126 return incCounter();
127 }
128
129 // CHECK-START: int Inliner.InlineWithControlFlow(boolean) inliner (before)
130 // CHECK-DAG: [[Const1:i[0-9]+]] IntConstant 1
131 // CHECK-DAG: [[Const3:i[0-9]+]] IntConstant 3
132 // CHECK-DAG: [[Const5:i[0-9]+]] IntConstant 5
133 // CHECK-DAG: [[Add:i[0-9]+]] InvokeStaticOrDirect [ [[Const1]] [[Const3]] ]
134 // CHECK-DAG: [[Sub:i[0-9]+]] InvokeStaticOrDirect [ [[Const5]] [[Const3]] ]
135 // CHECK-DAG: [[Phi:i[0-9]+]] Phi [ [[Add]] [[Sub]] ]
136 // CHECK-DAG: Return [ [[Phi]] ]
137
138 // CHECK-START: int Inliner.InlineWithControlFlow(boolean) inliner (after)
139 // CHECK-DAG: [[Const1:i[0-9]+]] IntConstant 1
140 // CHECK-DAG: [[Const3:i[0-9]+]] IntConstant 3
141 // CHECK-DAG: [[Const5:i[0-9]+]] IntConstant 5
142 // CHECK-DAG: [[Add:i[0-9]+]] Add [ [[Const1]] [[Const3]] ]
143 // CHECK-DAG: [[Sub:i[0-9]+]] Sub [ [[Const5]] [[Const3]] ]
144 // CHECK-DAG: [[Phi:i[0-9]+]] Phi [ [[Add]] [[Sub]] ]
145 // CHECK-DAG: Return [ [[Phi]] ]
146
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 }
202}