Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/hotspot/share/runtime/flags/jvmFlagConstraintsCompiler.cpp
40957 views
1
/*
2
* Copyright (c) 2015, 2021, 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
25
#include "precompiled.hpp"
26
#include "code/relocInfo.hpp"
27
#include "compiler/compilerDefinitions.hpp"
28
#include "compiler/compilerDirectives.hpp"
29
#include "oops/metadata.hpp"
30
#include "runtime/os.hpp"
31
#include "interpreter/invocationCounter.hpp"
32
#include "runtime/arguments.hpp"
33
#include "runtime/flags/jvmFlag.hpp"
34
#include "runtime/flags/jvmFlagConstraintsCompiler.hpp"
35
#include "runtime/globals.hpp"
36
#include "runtime/globals_extension.hpp"
37
#include "utilities/powerOfTwo.hpp"
38
39
JVMFlag::Error AliasLevelConstraintFunc(intx value, bool verbose) {
40
if ((value <= 1) && (Arguments::mode() == Arguments::_comp || Arguments::mode() == Arguments::_mixed)) {
41
JVMFlag::printError(verbose,
42
"AliasLevel (" INTX_FORMAT ") is not "
43
"compatible with -Xcomp or -Xmixed\n",
44
value);
45
return JVMFlag::VIOLATES_CONSTRAINT;
46
} else {
47
return JVMFlag::SUCCESS;
48
}
49
}
50
51
/**
52
* Validate the minimum number of compiler threads needed to run the JVM.
53
*/
54
JVMFlag::Error CICompilerCountConstraintFunc(intx value, bool verbose) {
55
int min_number_of_compiler_threads = 0;
56
#if COMPILER1_OR_COMPILER2
57
if (CompilerConfig::is_tiered()) {
58
min_number_of_compiler_threads = 2;
59
} else if (!CompilerConfig::is_interpreter_only()) {
60
min_number_of_compiler_threads = 1;
61
}
62
#else
63
if (value > 0) {
64
JVMFlag::printError(verbose,
65
"CICompilerCount (" INTX_FORMAT ") cannot be "
66
"greater than 0 because there are no compilers\n", value);
67
return JVMFlag::VIOLATES_CONSTRAINT;
68
}
69
#endif
70
71
if (value < (intx)min_number_of_compiler_threads) {
72
JVMFlag::printError(verbose,
73
"CICompilerCount (" INTX_FORMAT ") must be "
74
"at least %d \n",
75
value, min_number_of_compiler_threads);
76
return JVMFlag::VIOLATES_CONSTRAINT;
77
} else {
78
return JVMFlag::SUCCESS;
79
}
80
}
81
82
JVMFlag::Error AllocatePrefetchDistanceConstraintFunc(intx value, bool verbose) {
83
if (value < 0 || value > 512) {
84
JVMFlag::printError(verbose,
85
"AllocatePrefetchDistance (" INTX_FORMAT ") must be "
86
"between 0 and %d\n",
87
AllocatePrefetchDistance, 512);
88
return JVMFlag::VIOLATES_CONSTRAINT;
89
}
90
91
return JVMFlag::SUCCESS;
92
}
93
94
JVMFlag::Error AllocatePrefetchStepSizeConstraintFunc(intx value, bool verbose) {
95
if (AllocatePrefetchStyle == 3) {
96
if (value % wordSize != 0) {
97
JVMFlag::printError(verbose,
98
"AllocatePrefetchStepSize (" INTX_FORMAT ") must be multiple of %d\n",
99
value, wordSize);
100
return JVMFlag::VIOLATES_CONSTRAINT;
101
}
102
}
103
return JVMFlag::SUCCESS;
104
}
105
106
JVMFlag::Error AllocatePrefetchInstrConstraintFunc(intx value, bool verbose) {
107
intx max_value = max_intx;
108
#if defined(X86)
109
max_value = 3;
110
#endif
111
if (value < 0 || value > max_value) {
112
JVMFlag::printError(verbose,
113
"AllocatePrefetchInstr (" INTX_FORMAT ") must be "
114
"between 0 and " INTX_FORMAT "\n", value, max_value);
115
return JVMFlag::VIOLATES_CONSTRAINT;
116
}
117
118
return JVMFlag::SUCCESS;
119
}
120
121
JVMFlag::Error CompileThresholdConstraintFunc(intx value, bool verbose) {
122
if (value < 0 || value > INT_MAX >> InvocationCounter::count_shift) {
123
JVMFlag::printError(verbose,
124
"CompileThreshold (" INTX_FORMAT ") "
125
"must be between 0 and %d\n",
126
value,
127
INT_MAX >> InvocationCounter::count_shift);
128
return JVMFlag::VIOLATES_CONSTRAINT;
129
}
130
131
return JVMFlag::SUCCESS;
132
}
133
134
JVMFlag::Error OnStackReplacePercentageConstraintFunc(intx value, bool verbose) {
135
// We depend on CompileThreshold being valid, verify it first.
136
if (CompileThresholdConstraintFunc(CompileThreshold, false) == JVMFlag::VIOLATES_CONSTRAINT) {
137
JVMFlag::printError(verbose, "OnStackReplacePercentage cannot be validated because CompileThreshold value is invalid\n");
138
return JVMFlag::VIOLATES_CONSTRAINT;
139
}
140
141
int64_t max_percentage_limit = INT_MAX;
142
if (!ProfileInterpreter) {
143
max_percentage_limit = (max_percentage_limit>>InvocationCounter::count_shift);
144
}
145
max_percentage_limit = CompileThreshold == 0 ? max_percentage_limit*100 : max_percentage_limit*100/CompileThreshold;
146
147
if (ProfileInterpreter) {
148
if (value < InterpreterProfilePercentage) {
149
JVMFlag::printError(verbose,
150
"OnStackReplacePercentage (" INTX_FORMAT ") must be "
151
"larger than InterpreterProfilePercentage (" INTX_FORMAT ")\n",
152
value, InterpreterProfilePercentage);
153
return JVMFlag::VIOLATES_CONSTRAINT;
154
}
155
156
max_percentage_limit += InterpreterProfilePercentage;
157
if (value > max_percentage_limit) {
158
JVMFlag::printError(verbose,
159
"OnStackReplacePercentage (" INTX_FORMAT ") must be between 0 and " INT64_FORMAT "\n",
160
value,
161
max_percentage_limit);
162
return JVMFlag::VIOLATES_CONSTRAINT;
163
}
164
} else {
165
if (value < 0) {
166
JVMFlag::printError(verbose,
167
"OnStackReplacePercentage (" INTX_FORMAT ") must be "
168
"non-negative\n", value);
169
return JVMFlag::VIOLATES_CONSTRAINT;
170
}
171
172
if (value > max_percentage_limit) {
173
JVMFlag::printError(verbose,
174
"OnStackReplacePercentage (" INTX_FORMAT ") must be between 0 and " INT64_FORMAT "\n",
175
value,
176
max_percentage_limit);
177
return JVMFlag::VIOLATES_CONSTRAINT;
178
}
179
}
180
return JVMFlag::SUCCESS;
181
}
182
183
JVMFlag::Error CodeCacheSegmentSizeConstraintFunc(uintx value, bool verbose) {
184
if (CodeCacheSegmentSize < (uintx)CodeEntryAlignment) {
185
JVMFlag::printError(verbose,
186
"CodeCacheSegmentSize (" UINTX_FORMAT ") must be "
187
"larger than or equal to CodeEntryAlignment (" INTX_FORMAT ") "
188
"to align entry points\n",
189
CodeCacheSegmentSize, CodeEntryAlignment);
190
return JVMFlag::VIOLATES_CONSTRAINT;
191
}
192
193
if (CodeCacheSegmentSize < sizeof(jdouble)) {
194
JVMFlag::printError(verbose,
195
"CodeCacheSegmentSize (" UINTX_FORMAT ") must be "
196
"at least " SIZE_FORMAT " to align constants\n",
197
CodeCacheSegmentSize, sizeof(jdouble));
198
return JVMFlag::VIOLATES_CONSTRAINT;
199
}
200
201
#ifdef COMPILER2
202
if (CodeCacheSegmentSize < (uintx)OptoLoopAlignment) {
203
JVMFlag::printError(verbose,
204
"CodeCacheSegmentSize (" UINTX_FORMAT ") must be "
205
"larger than or equal to OptoLoopAlignment (" INTX_FORMAT ") "
206
"to align inner loops\n",
207
CodeCacheSegmentSize, OptoLoopAlignment);
208
return JVMFlag::VIOLATES_CONSTRAINT;
209
}
210
#endif
211
212
return JVMFlag::SUCCESS;
213
}
214
215
JVMFlag::Error CodeEntryAlignmentConstraintFunc(intx value, bool verbose) {
216
if (!is_power_of_2(value)) {
217
JVMFlag::printError(verbose,
218
"CodeEntryAlignment (" INTX_FORMAT ") must be "
219
"a power of two\n", CodeEntryAlignment);
220
return JVMFlag::VIOLATES_CONSTRAINT;
221
}
222
223
if (CodeEntryAlignment < 16) {
224
JVMFlag::printError(verbose,
225
"CodeEntryAlignment (" INTX_FORMAT ") must be "
226
"greater than or equal to %d\n",
227
CodeEntryAlignment, 16);
228
return JVMFlag::VIOLATES_CONSTRAINT;
229
}
230
231
return JVMFlag::SUCCESS;
232
}
233
234
JVMFlag::Error OptoLoopAlignmentConstraintFunc(intx value, bool verbose) {
235
if (!is_power_of_2(value)) {
236
JVMFlag::printError(verbose,
237
"OptoLoopAlignment (" INTX_FORMAT ") "
238
"must be a power of two\n",
239
value);
240
return JVMFlag::VIOLATES_CONSTRAINT;
241
}
242
243
// Relevant on ppc, s390. Will be optimized where
244
// addr_unit() == 1.
245
if (OptoLoopAlignment % relocInfo::addr_unit() != 0) {
246
JVMFlag::printError(verbose,
247
"OptoLoopAlignment (" INTX_FORMAT ") must be "
248
"multiple of NOP size (%d)\n",
249
value, relocInfo::addr_unit());
250
return JVMFlag::VIOLATES_CONSTRAINT;
251
}
252
253
return JVMFlag::SUCCESS;
254
}
255
256
JVMFlag::Error ArraycopyDstPrefetchDistanceConstraintFunc(uintx value, bool verbose) {
257
if (value >= 4032) {
258
JVMFlag::printError(verbose,
259
"ArraycopyDstPrefetchDistance (" UINTX_FORMAT ") must be"
260
"between 0 and 4031\n", value);
261
return JVMFlag::VIOLATES_CONSTRAINT;
262
}
263
264
return JVMFlag::SUCCESS;
265
}
266
267
JVMFlag::Error AVX3ThresholdConstraintFunc(int value, bool verbose) {
268
if (value != 0 && !is_power_of_2(value)) {
269
JVMFlag::printError(verbose,
270
"AVX3Threshold ( %d ) must be 0 or "
271
"a power of two value between 0 and MAX_INT\n", value);
272
return JVMFlag::VIOLATES_CONSTRAINT;
273
}
274
275
return JVMFlag::SUCCESS;
276
}
277
278
JVMFlag::Error ArraycopySrcPrefetchDistanceConstraintFunc(uintx value, bool verbose) {
279
if (value >= 4032) {
280
JVMFlag::printError(verbose,
281
"ArraycopySrcPrefetchDistance (" UINTX_FORMAT ") must be"
282
"between 0 and 4031\n", value);
283
return JVMFlag::VIOLATES_CONSTRAINT;
284
}
285
286
return JVMFlag::SUCCESS;
287
}
288
289
JVMFlag::Error TypeProfileLevelConstraintFunc(uintx value, bool verbose) {
290
for (int i = 0; i < 3; i++) {
291
if (value % 10 > 2) {
292
JVMFlag::printError(verbose,
293
"Invalid value (" UINTX_FORMAT ") "
294
"in TypeProfileLevel at position %d\n", value, i);
295
return JVMFlag::VIOLATES_CONSTRAINT;
296
}
297
value = value / 10;
298
}
299
300
return JVMFlag::SUCCESS;
301
}
302
303
JVMFlag::Error InitArrayShortSizeConstraintFunc(intx value, bool verbose) {
304
if (value % BytesPerLong != 0) {
305
JVMFlag::printError(verbose,
306
"InitArrayShortSize (" INTX_FORMAT ") must be "
307
"a multiple of %d\n", value, BytesPerLong);
308
return JVMFlag::VIOLATES_CONSTRAINT;
309
} else {
310
return JVMFlag::SUCCESS;
311
}
312
}
313
314
#ifdef COMPILER2
315
JVMFlag::Error InteriorEntryAlignmentConstraintFunc(intx value, bool verbose) {
316
if (InteriorEntryAlignment > CodeEntryAlignment) {
317
JVMFlag::printError(verbose,
318
"InteriorEntryAlignment (" INTX_FORMAT ") must be "
319
"less than or equal to CodeEntryAlignment (" INTX_FORMAT ")\n",
320
InteriorEntryAlignment, CodeEntryAlignment);
321
return JVMFlag::VIOLATES_CONSTRAINT;
322
}
323
324
if (!is_power_of_2(value)) {
325
JVMFlag::printError(verbose,
326
"InteriorEntryAlignment (" INTX_FORMAT ") must be "
327
"a power of two\n", InteriorEntryAlignment);
328
return JVMFlag::VIOLATES_CONSTRAINT;
329
}
330
331
int minimum_alignment = 16;
332
#if defined(X86) && !defined(AMD64)
333
minimum_alignment = 4;
334
#elif defined(S390)
335
minimum_alignment = 2;
336
#endif
337
338
if (InteriorEntryAlignment < minimum_alignment) {
339
JVMFlag::printError(verbose,
340
"InteriorEntryAlignment (" INTX_FORMAT ") must be "
341
"greater than or equal to %d\n",
342
InteriorEntryAlignment, minimum_alignment);
343
return JVMFlag::VIOLATES_CONSTRAINT;
344
}
345
346
return JVMFlag::SUCCESS;
347
}
348
349
JVMFlag::Error NodeLimitFudgeFactorConstraintFunc(intx value, bool verbose) {
350
if (value < MaxNodeLimit * 2 / 100 || value > MaxNodeLimit * 40 / 100) {
351
JVMFlag::printError(verbose,
352
"NodeLimitFudgeFactor must be between 2%% and 40%% "
353
"of MaxNodeLimit (" INTX_FORMAT ")\n",
354
MaxNodeLimit);
355
return JVMFlag::VIOLATES_CONSTRAINT;
356
}
357
358
return JVMFlag::SUCCESS;
359
}
360
#endif // COMPILER2
361
362
JVMFlag::Error RTMTotalCountIncrRateConstraintFunc(int value, bool verbose) {
363
#if INCLUDE_RTM_OPT
364
if (UseRTMLocking && !is_power_of_2(RTMTotalCountIncrRate)) {
365
JVMFlag::printError(verbose,
366
"RTMTotalCountIncrRate (%d) must be "
367
"a power of 2, resetting it to 64\n",
368
RTMTotalCountIncrRate);
369
FLAG_SET_DEFAULT(RTMTotalCountIncrRate, 64);
370
}
371
#endif
372
373
return JVMFlag::SUCCESS;
374
}
375
376
#ifdef COMPILER2
377
JVMFlag::Error LoopStripMiningIterConstraintFunc(uintx value, bool verbose) {
378
if (UseCountedLoopSafepoints && LoopStripMiningIter == 0) {
379
if (!FLAG_IS_DEFAULT(UseCountedLoopSafepoints) || !FLAG_IS_DEFAULT(LoopStripMiningIter)) {
380
JVMFlag::printError(verbose,
381
"When counted loop safepoints are enabled, "
382
"LoopStripMiningIter must be at least 1 "
383
"(a safepoint every 1 iteration): setting it to 1\n");
384
}
385
LoopStripMiningIter = 1;
386
} else if (!UseCountedLoopSafepoints && LoopStripMiningIter > 0) {
387
if (!FLAG_IS_DEFAULT(UseCountedLoopSafepoints) || !FLAG_IS_DEFAULT(LoopStripMiningIter)) {
388
JVMFlag::printError(verbose,
389
"Disabling counted safepoints implies no loop strip mining: "
390
"setting LoopStripMiningIter to 0\n");
391
}
392
LoopStripMiningIter = 0;
393
}
394
395
return JVMFlag::SUCCESS;
396
}
397
#endif // COMPILER2
398
399
JVMFlag::Error DisableIntrinsicConstraintFunc(ccstrlist value, bool verbose) {
400
ControlIntrinsicValidator validator(value, true/*disabled_all*/);
401
if (!validator.is_valid()) {
402
JVMFlag::printError(verbose,
403
"Unrecognized intrinsic detected in DisableIntrinsic: %s\n",
404
validator.what());
405
return JVMFlag::VIOLATES_CONSTRAINT;
406
}
407
408
return JVMFlag::SUCCESS;
409
}
410
411
JVMFlag::Error ControlIntrinsicConstraintFunc(ccstrlist value, bool verbose) {
412
ControlIntrinsicValidator validator(value, false/*disabled_all*/);
413
if (!validator.is_valid()) {
414
JVMFlag::printError(verbose,
415
"Unrecognized intrinsic detected in ControlIntrinsic: %s\n",
416
validator.what());
417
return JVMFlag::VIOLATES_CONSTRAINT;
418
}
419
420
return JVMFlag::SUCCESS;
421
}
422
423
424