Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/test/hotspot/jtreg/compiler/compilercontrol/share/scenario/State.java
41161 views
1
/*
2
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation.
8
*
9
* This code is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12
* version 2 for more details (a copy is included in the LICENSE file that
13
* accompanied this code).
14
*
15
* You should have received a copy of the GNU General Public License version
16
* 2 along with this work; if not, write to the Free Software Foundation,
17
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18
*
19
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20
* or visit www.oracle.com if you need additional information or have any
21
* questions.
22
*/
23
24
package compiler.compilercontrol.share.scenario;
25
26
import jdk.test.lib.Asserts;
27
28
import java.util.Arrays;
29
import java.util.Optional;
30
31
/**
32
* Represents method compilation state
33
*/
34
public class State {
35
// Each of the two-elements array contains a state for each compiler
36
private Optional<Boolean>[] compile =
37
(Optional<Boolean>[]) new Optional[Scenario.Compiler.values().length];
38
private Optional<Boolean>[] forceInline =
39
(Optional<Boolean>[]) new Optional[Scenario.Compiler.values().length];
40
private Optional<Boolean>[] dontInline =
41
(Optional<Boolean>[]) new Optional[Scenario.Compiler.values().length];
42
private Optional<Boolean> printAssembly = Optional.empty();
43
private Optional<Boolean> printInline = Optional.empty();
44
private Optional<Boolean> log = Optional.empty();
45
private Optional<String> controlIntrinsic = Optional.empty();
46
47
public State() {
48
Arrays.fill(compile, Optional.empty());
49
Arrays.fill(forceInline, Optional.empty());
50
Arrays.fill(dontInline, Optional.empty());
51
}
52
53
/**
54
* Creates state from the string
55
*
56
* @param strings array of strings that represent the state
57
* @return State instance
58
* @see #toString()
59
*/
60
public static State fromString(String[] strings) {
61
Asserts.assertNotNull(strings, "Non null array is required");
62
Asserts.assertNE(strings.length, 0, "Non empty array is required");
63
State st = new State();
64
for (String string : strings) {
65
int i = string.indexOf(' ');
66
String command = string.substring(0, i);
67
String values = string.substring(i + 1); // skip space symbol
68
switch (command) {
69
case "compile" :
70
parseArray(st.compile, values);
71
break;
72
case "force_inline" :
73
parseArray(st.forceInline, values);
74
break;
75
case "dont_inline" :
76
parseArray(st.dontInline, values);
77
break;
78
case "log" :
79
st.log = parseElement(values);
80
break;
81
case "print_assembly" :
82
st.printAssembly = parseElement(values);
83
break;
84
case "print_inline" :
85
st.printInline = parseElement(values);
86
break;
87
default:
88
throw new Error("TESTBUG: ");
89
}
90
}
91
return st;
92
}
93
94
private static void parseArray(Optional<Boolean>[] array, String str) {
95
Asserts.assertNotNull(str);
96
int beginBrace = 0;
97
int endBrace = str.length() - 1;
98
if (str.charAt(beginBrace) != '[' || str.charAt(endBrace) != ']') {
99
throw new Error("TESTBUG: not an array type: " + str);
100
}
101
// Get all elements divided with comma as an array
102
String[] strValues = str.substring(beginBrace + 1, endBrace)
103
.split(", ");
104
Asserts.assertEQ(strValues.length, array.length, "Different amount of "
105
+ "elements in the string");
106
for (int i = 0; i < strValues.length; i++) {
107
array[i] = parseElement(strValues[i]);
108
}
109
}
110
111
private static Optional<Boolean> parseElement(String str) {
112
Asserts.assertNotNull(str);
113
Asserts.assertTrue(str.startsWith(Optional.class.getSimpleName()),
114
"String is not of type Optional: " + str);
115
if ("Optional.empty".equals(str)) {
116
return Optional.empty();
117
}
118
int begin = str.indexOf('[');
119
Asserts.assertNE(begin, -1, "TEST BUG: Wrong Optional string");
120
int end = str.indexOf(']');
121
Asserts.assertEQ(end, str.length() - 1);
122
boolean b = Boolean.parseBoolean(str.substring(begin + 1, end));
123
return Optional.of(b);
124
}
125
126
/**
127
* Gets string representation of this state
128
*/
129
@Override
130
public String toString() {
131
return "compile " + Arrays.toString(compile)
132
+ "\nforce_inline " + Arrays.toString(forceInline)
133
+ "\ndont_inline " + Arrays.toString(dontInline)
134
+ "\nlog " + log
135
+ "\nprint_assembly " + printAssembly
136
+ "\nprint_inline " + printInline;
137
}
138
139
public Optional<Boolean> getCompilableOptional(Scenario.Compiler compiler) {
140
return compile[compiler.ordinal()];
141
}
142
143
public boolean isC1Compilable() {
144
return compile[Scenario.Compiler.C1.ordinal()].orElse(true);
145
}
146
147
public boolean isC2Compilable() {
148
return compile[Scenario.Compiler.C2.ordinal()].orElse(true);
149
}
150
151
public boolean isCompilable() {
152
return isC1Compilable() && isC2Compilable();
153
}
154
155
public void setC1Compilable(boolean value) {
156
setCompilable(Scenario.Compiler.C1.ordinal(), value);
157
}
158
159
public void setC2Compilable(boolean value) {
160
setCompilable(Scenario.Compiler.C2.ordinal(), value);
161
}
162
163
public void setCompilable(Scenario.Compiler compiler, boolean value) {
164
if (compiler == null) {
165
setC1Compilable(value);
166
setC2Compilable(value);
167
return;
168
}
169
switch (compiler) {
170
case C1:
171
setC1Compilable(value);
172
break;
173
case C2:
174
setC2Compilable(value);
175
break;
176
default:
177
throw new Error("Unknown compiler");
178
}
179
}
180
181
private void setCompilable(int level, boolean value) {
182
check(level);
183
compile[level] = Optional.of(value);
184
if (!value) {
185
setDontInline(level);
186
}
187
}
188
189
public boolean isC1Inlinable() {
190
return ! dontInline[Scenario.Compiler.C1.ordinal()].orElse(false)
191
&& isC1Compilable();
192
}
193
194
public boolean isC2Inlinable() {
195
return ! dontInline[Scenario.Compiler.C2.ordinal()].orElse(false)
196
&& isC2Compilable();
197
}
198
199
public boolean isInlinable() {
200
return isC1Inlinable() && isC2Inlinable();
201
}
202
203
private void setDontInline(int level) {
204
check(level);
205
dontInline[level] = Optional.of(true);
206
forceInline[level] = Optional.of(false);
207
}
208
209
private void setForceInline(int level) {
210
check(level);
211
dontInline[level] = Optional.of(false);
212
forceInline[level] = Optional.of(true);
213
}
214
215
public boolean isC1ForceInline() {
216
return forceInline[Scenario.Compiler.C1.ordinal()].orElse(false)
217
&& isC1Compilable();
218
}
219
220
public boolean isC2ForceInline() {
221
return forceInline[Scenario.Compiler.C2.ordinal()].orElse(false)
222
&& isC2Compilable();
223
}
224
225
public boolean isForceInline() {
226
return isC1ForceInline() && isC2ForceInline();
227
}
228
229
public void setC1Inline(boolean value) {
230
if (value && isC1Compilable()) {
231
setForceInline(Scenario.Compiler.C1.ordinal());
232
} else {
233
setDontInline(Scenario.Compiler.C1.ordinal());
234
}
235
}
236
237
public void setC2Inline(boolean value) {
238
if (value && isC2Compilable()) {
239
setForceInline(Scenario.Compiler.C2.ordinal());
240
} else {
241
setDontInline(Scenario.Compiler.C2.ordinal());
242
}
243
}
244
245
public void setInline(Scenario.Compiler compiler, boolean value) {
246
if (compiler == null) {
247
setC1Inline(value);
248
setC2Inline(value);
249
return;
250
}
251
switch (compiler) {
252
case C1:
253
setC1Inline(value);
254
break;
255
case C2:
256
setC2Inline(value);
257
break;
258
default:
259
throw new Error("Unknown compiler");
260
}
261
}
262
263
public boolean isPrintAssembly() {
264
return printAssembly.orElse(false);
265
}
266
267
public void setPrintAssembly(boolean value) {
268
printAssembly = Optional.of(value);
269
}
270
271
public boolean isPrintInline() {
272
return printInline.orElse(false);
273
}
274
275
public void setPrintInline(boolean value) {
276
printInline = Optional.of(value);
277
}
278
279
public void setControlIntrinsic(String argument) {
280
if (argument != null) {
281
controlIntrinsic = Optional.of(argument);
282
}
283
}
284
285
public boolean isLog() {
286
return log.orElse(false);
287
}
288
289
public void setLog(boolean log) {
290
this.log = Optional.of(log);
291
}
292
293
private void check(int level) {
294
if (level < 0 || level > compile.length) {
295
throw new IllegalArgumentException("TESTBUG: Wrong level " + level);
296
}
297
}
298
299
/**
300
* Applies given command to the state.
301
*
302
* @param compileCommand command to be applied
303
*/
304
public void apply(CompileCommand compileCommand) {
305
switch (compileCommand.command) {
306
case COMPILEONLY:
307
setCompilable(compileCommand.compiler, true);
308
break;
309
case EXCLUDE:
310
setCompilable(compileCommand.compiler, false);
311
break;
312
case INLINE:
313
setInline(compileCommand.compiler, true);
314
break;
315
case DONTINLINE:
316
setInline(compileCommand.compiler, false);
317
break;
318
case LOG:
319
setLog(true);
320
break;
321
case PRINT:
322
setPrintAssembly(true);
323
break;
324
case INTRINSIC:
325
setControlIntrinsic(compileCommand.argument);
326
break;
327
case QUIET:
328
case NONEXISTENT:
329
// doesn't apply the state
330
break;
331
default:
332
throw new Error("Wrong command: " + compileCommand.command);
333
}
334
}
335
336
/**
337
* Merges two given states with different priority
338
*
339
* @param low state with lower merge priority
340
* @param high state with higher merge priority
341
*/
342
public static State merge(State low, State high) {
343
if (high == null) {
344
if (low == null) {
345
return new State();
346
}
347
return low;
348
}
349
if (low == null) {
350
return high;
351
}
352
State result = new State();
353
// Compilable
354
result.compile[Scenario.Compiler.C1.ordinal()] = mergeOptional(
355
high.compile[Scenario.Compiler.C1.ordinal()],
356
low.compile[Scenario.Compiler.C1.ordinal()]);
357
result.compile[Scenario.Compiler.C2.ordinal()] = mergeOptional(
358
high.compile[Scenario.Compiler.C2.ordinal()],
359
low.compile[Scenario.Compiler.C2.ordinal()]);
360
// Force inline
361
result.forceInline[Scenario.Compiler.C1.ordinal()] = mergeOptional(
362
high.forceInline[Scenario.Compiler.C1.ordinal()],
363
low.forceInline[Scenario.Compiler.C1.ordinal()]);
364
result.forceInline[Scenario.Compiler.C2.ordinal()] = mergeOptional(
365
high.forceInline[Scenario.Compiler.C2.ordinal()],
366
low.forceInline[Scenario.Compiler.C2.ordinal()]);
367
// Don't inline
368
result.dontInline[Scenario.Compiler.C1.ordinal()] = mergeOptional(
369
high.dontInline[Scenario.Compiler.C1.ordinal()],
370
low.dontInline[Scenario.Compiler.C1.ordinal()]);
371
result.dontInline[Scenario.Compiler.C2.ordinal()] = mergeOptional(
372
high.dontInline[Scenario.Compiler.C2.ordinal()],
373
low.dontInline[Scenario.Compiler.C2.ordinal()]);
374
// set PrintAssembly
375
result.printAssembly = mergeOptional(high.printAssembly,
376
low.printAssembly);
377
// set PrintInline
378
result.printInline = mergeOptional(high.printInline, low.printInline);
379
// set LogCompilation
380
result.log = mergeOptional(high.log, low.log);
381
// set controlIntrinsic
382
result.controlIntrinsic = mergeOptional(high.controlIntrinsic, low.controlIntrinsic);
383
384
return result;
385
}
386
387
private static <T> Optional<T> mergeOptional(Optional<T> high,
388
Optional<T> low) {
389
T val = high.orElse(low.orElse(null));
390
return Optional.ofNullable(val);
391
}
392
}
393
394