1 /*
2 * Copyright (c) 1999, 2025, 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 "classfile/vmClasses.hpp"
26 #include "code/aotCodeCache.hpp"
27 #include "compiler/compilationMemoryStatistic.hpp"
28 #include "compiler/compilerDefinitions.inline.hpp"
29 #include "jfr/support/jfrIntrinsics.hpp"
30 #include "opto/c2compiler.hpp"
31 #include "opto/compile.hpp"
32 #include "opto/optoreg.hpp"
33 #include "opto/output.hpp"
34 #include "opto/runtime.hpp"
35 #include "runtime/globals_extension.hpp"
36 #include "runtime/handles.inline.hpp"
37 #include "runtime/stubRoutines.hpp"
38 #include "utilities/macros.hpp"
39
40
41 // register information defined by ADLC
42 extern const char register_save_policy[];
43 extern const int register_save_type[];
44
45 const char* C2Compiler::retry_no_subsuming_loads() {
46 return "retry without subsuming loads";
47 }
48 const char* C2Compiler::retry_no_escape_analysis() {
49 return "retry without escape analysis";
50 }
51 const char* C2Compiler::retry_no_locks_coarsening() {
52 return "retry without locks coarsening";
53 }
54 const char* C2Compiler::retry_no_iterative_escape_analysis() {
55 return "retry without iterative escape analysis";
56 }
57 const char* C2Compiler::retry_no_reduce_allocation_merges() {
58 return "retry without reducing allocation merges";
59 }
60 const char* C2Compiler::retry_no_superword() {
61 return "retry without SuperWord";
62 }
63
64 void compiler_stubs_init(bool in_compiler_thread);
65
66 bool C2Compiler::init_c2_runtime() {
67
68 #ifdef ASSERT
69 if (!AlignVector && VerifyAlignVector) {
70 warning("VerifyAlignVector disabled because AlignVector is not enabled.");
71 FLAG_SET_CMDLINE(VerifyAlignVector, false);
72 }
73 #endif
74
75 // Check assumptions used while running ADLC
76 Compile::adlc_verification();
77 assert(REG_COUNT <= ConcreteRegisterImpl::number_of_registers, "incompatible register counts");
78
79 for (int i = 0; i < ConcreteRegisterImpl::number_of_registers ; i++ ) {
80 OptoReg::vm2opto[i] = OptoReg::Bad;
81 }
82
83 for( OptoReg::Name i=OptoReg::Name(0); i<OptoReg::Name(REG_COUNT); i = OptoReg::add(i,1) ) {
84 VMReg r = OptoReg::as_VMReg(i);
85 if (r->is_valid()) {
86 OptoReg::vm2opto[r->value()] = i;
87 }
88 }
89
90 DEBUG_ONLY( Node::init_NodeProperty(); )
91
92 compiler_stubs_init(true /* in_compiler_thread */); // generate compiler's intrinsics stubs
93
94 // If there was an error generating the blob then UseCompiler will
95 // have been unset and we need to skip the remaining initialization
96 if (!UseCompiler) {
97 return false;
98 }
99
100 Compile::pd_compiler2_init();
101
102 CompilerThread* thread = CompilerThread::current();
103
104 HandleMark handle_mark(thread);
105 bool success = OptoRuntime::generate(thread->env());
106 if (success) {
107 AOTCodeCache::init_c2_table();
108 }
109 return success;
110 }
111
112 void C2Compiler::initialize() {
113 assert(!CompilerConfig::is_c1_or_interpreter_only_no_jvmci(), "C2 compiler is launched, it's not c1/interpreter only mode");
114 // The first compiler thread that gets here will initialize the
115 // small amount of global state (and runtime stubs) that C2 needs.
116
117 // There is a race possible once at startup and then we're fine
118
119 // Note that this is being called from a compiler thread not the
120 // main startup thread.
121 if (should_perform_init()) {
122 bool successful = C2Compiler::init_c2_runtime();
123 int new_state = (successful) ? initialized : failed;
124 set_state(new_state);
125 }
126 }
127
128 void C2Compiler::compile_method(ciEnv* env, ciMethod* target, int entry_bci, bool install_code, DirectiveSet* directive) {
129 assert(is_initialized(), "Compiler thread must be initialized");
130 CompilationMemoryStatisticMark cmsm(directive);
131 CompileTask* task = env->task();
132 if (install_code && task->is_aot_load()) {
133 bool success = AOTCodeCache::load_nmethod(env, target, entry_bci, this, CompLevel_full_optimization);
134 if (success) {
135 assert(task->is_success(), "sanity");
136 return;
137 }
138 AOTCodeCache::invalidate(task->aot_code_entry()); // mark aot_code_entry as not entrant
139 if (AOTCodeCache::is_code_load_thread_on()) {
140 // Bail out if AOT code load failed in AOT Code loading thread
141 // when UseAOTCodeLoadThread flag is on.
142 // We want this thread go quickly through AOT code load requests
143 // instead of spending time on normal compilation.
144 // TODO: pass this task to normal compilation thread.
145 env->record_failure("Failed to load AOT code");
146 return;
147 } else {
148 task->clear_aot();
149 }
150 }
151
152 bool subsume_loads = SubsumeLoads;
153 bool do_escape_analysis = DoEscapeAnalysis;
154 bool do_iterative_escape_analysis = DoEscapeAnalysis;
155 bool do_reduce_allocation_merges = ReduceAllocationMerges && EliminateAllocations;
156 bool eliminate_boxing = EliminateAutoBox;
157 bool do_locks_coarsening = EliminateLocks;
158 bool do_superword = UseSuperWord;
159 bool gen_preload = (task->compile_reason() == CompileTask::Reason_PrecompileForPreload);
160 assert(!gen_preload || (AOTCodeCache::is_dumping_code() && (ClassInitBarrierMode > 0)), "sanity");
161 while (!env->failing()) {
162 ResourceMark rm;
163 // Attempt to compile while subsuming loads into machine instructions.
164 Options options(subsume_loads,
165 do_escape_analysis,
166 do_iterative_escape_analysis,
167 do_reduce_allocation_merges,
168 eliminate_boxing,
169 do_locks_coarsening,
170 do_superword,
171 gen_preload,
172 install_code);
173 Compile C(env, target, entry_bci, options, directive);
174
175 // Check result and retry if appropriate.
176 if (C.failure_reason() != nullptr) {
177 if (C.failure_reason_is(retry_no_subsuming_loads())) {
178 assert(subsume_loads, "must make progress");
179 subsume_loads = false;
180 env->report_failure(C.failure_reason());
181 continue; // retry
182 }
183 if (C.failure_reason_is(retry_no_escape_analysis())) {
184 assert(do_escape_analysis, "must make progress");
185 do_escape_analysis = false;
186 env->report_failure(C.failure_reason());
187 continue; // retry
188 }
189 if (C.failure_reason_is(retry_no_iterative_escape_analysis())) {
190 assert(do_iterative_escape_analysis, "must make progress");
191 do_iterative_escape_analysis = false;
192 env->report_failure(C.failure_reason());
193 continue; // retry
194 }
195 if (C.failure_reason_is(retry_no_reduce_allocation_merges())) {
196 assert(do_reduce_allocation_merges, "must make progress");
197 do_reduce_allocation_merges = false;
198 env->report_failure(C.failure_reason());
199 continue; // retry
200 }
201 if (C.failure_reason_is(retry_no_locks_coarsening())) {
202 assert(do_locks_coarsening, "must make progress");
203 do_locks_coarsening = false;
204 env->report_failure(C.failure_reason());
205 continue; // retry
206 }
207 if (C.failure_reason_is(retry_no_superword())) {
208 assert(do_superword, "must make progress");
209 do_superword = false;
210 env->report_failure(C.failure_reason());
211 continue; // retry
212 }
213 if (C.has_boxed_value()) {
214 // Recompile without boxing elimination regardless failure reason.
215 assert(eliminate_boxing, "must make progress");
216 eliminate_boxing = false;
217 env->report_failure(C.failure_reason());
218 continue; // retry
219 }
220 // Pass any other failure reason up to the ciEnv.
221 // Note that serious, irreversible failures are already logged
222 // on the ciEnv via env->record_method_not_compilable().
223 env->record_failure(C.failure_reason());
224 }
225 if (StressRecompilation) {
226 if (subsume_loads) {
227 subsume_loads = false;
228 continue; // retry
229 }
230 if (do_escape_analysis) {
231 do_escape_analysis = false;
232 continue; // retry
233 }
234 if (do_locks_coarsening) {
235 do_locks_coarsening = false;
236 continue; // retry
237 }
238 }
239 // print inlining for last compilation only
240 C.dump_print_inlining();
241
242 // No retry; just break the loop.
243 break;
244 }
245 }
246
247 void C2Compiler::print_timers() {
248 Compile::print_timers();
249 }
250
251 bool C2Compiler::is_intrinsic_supported(const methodHandle& method) {
252 vmIntrinsics::ID id = method->intrinsic_id();
253 return C2Compiler::is_intrinsic_supported(id);
254 }
255
256 bool C2Compiler::is_intrinsic_supported(vmIntrinsics::ID id) {
257 assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
258
259 if (id < vmIntrinsics::FIRST_ID || id > vmIntrinsics::LAST_COMPILER_INLINE) {
260 return false;
261 }
262
263 switch (id) {
264 case vmIntrinsics::_compressStringC:
265 case vmIntrinsics::_compressStringB:
266 if (!Matcher::match_rule_supported(Op_StrCompressedCopy)) return false;
267 break;
268 case vmIntrinsics::_inflateStringC:
269 case vmIntrinsics::_inflateStringB:
270 if (!Matcher::match_rule_supported(Op_StrInflatedCopy)) return false;
271 break;
272 case vmIntrinsics::_compareToL:
273 case vmIntrinsics::_compareToU:
274 case vmIntrinsics::_compareToLU:
275 case vmIntrinsics::_compareToUL:
276 if (!Matcher::match_rule_supported(Op_StrComp)) return false;
277 break;
278 case vmIntrinsics::_equalsL:
279 if (!Matcher::match_rule_supported(Op_StrEquals)) return false;
280 break;
281 case vmIntrinsics::_vectorizedHashCode:
282 if (!Matcher::match_rule_supported(Op_VectorizedHashCode)) return false;
283 break;
284 case vmIntrinsics::_equalsB:
285 case vmIntrinsics::_equalsC:
286 if (!Matcher::match_rule_supported(Op_AryEq)) return false;
287 break;
288 case vmIntrinsics::_copyMemory:
289 if (StubRoutines::unsafe_arraycopy() == nullptr) return false;
290 break;
291 case vmIntrinsics::_setMemory:
292 if (StubRoutines::unsafe_setmemory() == nullptr) return false;
293 break;
294 case vmIntrinsics::_electronicCodeBook_encryptAESCrypt:
295 if (StubRoutines::electronicCodeBook_encryptAESCrypt() == nullptr) return false;
296 break;
297 case vmIntrinsics::_electronicCodeBook_decryptAESCrypt:
298 if (StubRoutines::electronicCodeBook_decryptAESCrypt() == nullptr) return false;
299 break;
300 case vmIntrinsics::_galoisCounterMode_AESCrypt:
301 if (StubRoutines::galoisCounterMode_AESCrypt() == nullptr) return false;
302 break;
303 case vmIntrinsics::_bigIntegerRightShiftWorker:
304 if (StubRoutines::bigIntegerRightShift() == nullptr) return false;
305 break;
306 case vmIntrinsics::_bigIntegerLeftShiftWorker:
307 if (StubRoutines::bigIntegerLeftShift() == nullptr) return false;
308 break;
309 case vmIntrinsics::_encodeAsciiArray:
310 if (!Matcher::match_rule_supported(Op_EncodeISOArray) || !Matcher::supports_encode_ascii_array) return false;
311 break;
312 case vmIntrinsics::_encodeISOArray:
313 case vmIntrinsics::_encodeByteISOArray:
314 if (!Matcher::match_rule_supported(Op_EncodeISOArray)) return false;
315 break;
316 case vmIntrinsics::_countPositives:
317 if (!Matcher::match_rule_supported(Op_CountPositives)) return false;
318 break;
319 case vmIntrinsics::_bitCount_i:
320 if (!Matcher::match_rule_supported(Op_PopCountI)) return false;
321 break;
322 case vmIntrinsics::_bitCount_l:
323 if (!Matcher::match_rule_supported(Op_PopCountL)) return false;
324 break;
325 case vmIntrinsics::_compress_i:
326 case vmIntrinsics::_compress_l:
327 if (!Matcher::match_rule_supported(Op_CompressBits)) return false;
328 break;
329 case vmIntrinsics::_expand_i:
330 case vmIntrinsics::_expand_l:
331 if (!Matcher::match_rule_supported(Op_ExpandBits)) return false;
332 break;
333 case vmIntrinsics::_numberOfLeadingZeros_i:
334 if (!Matcher::match_rule_supported(Op_CountLeadingZerosI)) return false;
335 break;
336 case vmIntrinsics::_numberOfLeadingZeros_l:
337 if (!Matcher::match_rule_supported(Op_CountLeadingZerosL)) return false;
338 break;
339 case vmIntrinsics::_numberOfTrailingZeros_i:
340 if (!Matcher::match_rule_supported(Op_CountTrailingZerosI)) return false;
341 break;
342 case vmIntrinsics::_numberOfTrailingZeros_l:
343 if (!Matcher::match_rule_supported(Op_CountTrailingZerosL)) return false;
344 break;
345 case vmIntrinsics::_reverse_i:
346 if (!Matcher::match_rule_supported(Op_ReverseI)) return false;
347 break;
348 case vmIntrinsics::_reverse_l:
349 if (!Matcher::match_rule_supported(Op_ReverseL)) return false;
350 break;
351 case vmIntrinsics::_reverseBytes_c:
352 if (!Matcher::match_rule_supported(Op_ReverseBytesUS)) return false;
353 break;
354 case vmIntrinsics::_reverseBytes_s:
355 if (!Matcher::match_rule_supported(Op_ReverseBytesS)) return false;
356 break;
357 case vmIntrinsics::_reverseBytes_i:
358 if (!Matcher::match_rule_supported(Op_ReverseBytesI)) return false;
359 break;
360 case vmIntrinsics::_reverseBytes_l:
361 if (!Matcher::match_rule_supported(Op_ReverseBytesL)) return false;
362 break;
363 case vmIntrinsics::_compareUnsigned_i:
364 if (!Matcher::match_rule_supported(Op_CmpU3)) return false;
365 break;
366 case vmIntrinsics::_compareUnsigned_l:
367 if (!Matcher::match_rule_supported(Op_CmpUL3)) return false;
368 break;
369 case vmIntrinsics::_divideUnsigned_i:
370 if (!Matcher::match_rule_supported(Op_UDivI)) return false;
371 break;
372 case vmIntrinsics::_remainderUnsigned_i:
373 if (!Matcher::match_rule_supported(Op_UModI)) return false;
374 break;
375 case vmIntrinsics::_divideUnsigned_l:
376 if (!Matcher::match_rule_supported(Op_UDivL)) return false;
377 break;
378 case vmIntrinsics::_remainderUnsigned_l:
379 if (!Matcher::match_rule_supported(Op_UModL)) return false;
380 break;
381 case vmIntrinsics::_float16ToFloat:
382 if (!Matcher::match_rule_supported(Op_ConvHF2F)) return false;
383 break;
384 case vmIntrinsics::_floatToFloat16:
385 if (!Matcher::match_rule_supported(Op_ConvF2HF)) return false;
386 break;
387 case vmIntrinsics::_sqrt_float16:
388 if (!Matcher::match_rule_supported(Op_SqrtHF)) return false;
389 break;
390 case vmIntrinsics::_fma_float16:
391 if (!Matcher::match_rule_supported(Op_FmaHF)) return false;
392 break;
393
394 /* CompareAndSet, Object: */
395 case vmIntrinsics::_compareAndSetReference:
396 #ifdef _LP64
397 if ( UseCompressedOops && !Matcher::match_rule_supported(Op_CompareAndSwapN)) return false;
398 if (!UseCompressedOops && !Matcher::match_rule_supported(Op_CompareAndSwapP)) return false;
399 #else
400 if (!Matcher::match_rule_supported(Op_CompareAndSwapP)) return false;
401 #endif
402 break;
403 case vmIntrinsics::_weakCompareAndSetReferencePlain:
404 case vmIntrinsics::_weakCompareAndSetReferenceAcquire:
405 case vmIntrinsics::_weakCompareAndSetReferenceRelease:
406 case vmIntrinsics::_weakCompareAndSetReference:
407 #ifdef _LP64
408 if ( UseCompressedOops && !Matcher::match_rule_supported(Op_WeakCompareAndSwapN)) return false;
409 if (!UseCompressedOops && !Matcher::match_rule_supported(Op_WeakCompareAndSwapP)) return false;
410 #else
411 if (!Matcher::match_rule_supported(Op_WeakCompareAndSwapP)) return false;
412 #endif
413 break;
414 /* CompareAndSet, Long: */
415 case vmIntrinsics::_compareAndSetLong:
416 if (!Matcher::match_rule_supported(Op_CompareAndSwapL)) return false;
417 break;
418 case vmIntrinsics::_weakCompareAndSetLongPlain:
419 case vmIntrinsics::_weakCompareAndSetLongAcquire:
420 case vmIntrinsics::_weakCompareAndSetLongRelease:
421 case vmIntrinsics::_weakCompareAndSetLong:
422 if (!Matcher::match_rule_supported(Op_WeakCompareAndSwapL)) return false;
423 break;
424
425 /* CompareAndSet, Int: */
426 case vmIntrinsics::_compareAndSetInt:
427 if (!Matcher::match_rule_supported(Op_CompareAndSwapI)) return false;
428 break;
429 case vmIntrinsics::_weakCompareAndSetIntPlain:
430 case vmIntrinsics::_weakCompareAndSetIntAcquire:
431 case vmIntrinsics::_weakCompareAndSetIntRelease:
432 case vmIntrinsics::_weakCompareAndSetInt:
433 if (!Matcher::match_rule_supported(Op_WeakCompareAndSwapI)) return false;
434 break;
435
436 /* CompareAndSet, Byte: */
437 case vmIntrinsics::_compareAndSetByte:
438 if (!Matcher::match_rule_supported(Op_CompareAndSwapB)) return false;
439 break;
440 case vmIntrinsics::_weakCompareAndSetBytePlain:
441 case vmIntrinsics::_weakCompareAndSetByteAcquire:
442 case vmIntrinsics::_weakCompareAndSetByteRelease:
443 case vmIntrinsics::_weakCompareAndSetByte:
444 if (!Matcher::match_rule_supported(Op_WeakCompareAndSwapB)) return false;
445 break;
446
447 /* CompareAndSet, Short: */
448 case vmIntrinsics::_compareAndSetShort:
449 if (!Matcher::match_rule_supported(Op_CompareAndSwapS)) return false;
450 break;
451 case vmIntrinsics::_weakCompareAndSetShortPlain:
452 case vmIntrinsics::_weakCompareAndSetShortAcquire:
453 case vmIntrinsics::_weakCompareAndSetShortRelease:
454 case vmIntrinsics::_weakCompareAndSetShort:
455 if (!Matcher::match_rule_supported(Op_WeakCompareAndSwapS)) return false;
456 break;
457
458 /* CompareAndExchange, Object: */
459 case vmIntrinsics::_compareAndExchangeReference:
460 case vmIntrinsics::_compareAndExchangeReferenceAcquire:
461 case vmIntrinsics::_compareAndExchangeReferenceRelease:
462 #ifdef _LP64
463 if ( UseCompressedOops && !Matcher::match_rule_supported(Op_CompareAndExchangeN)) return false;
464 if (!UseCompressedOops && !Matcher::match_rule_supported(Op_CompareAndExchangeP)) return false;
465 #else
466 if (!Matcher::match_rule_supported(Op_CompareAndExchangeP)) return false;
467 #endif
468 break;
469
470 /* CompareAndExchange, Long: */
471 case vmIntrinsics::_compareAndExchangeLong:
472 case vmIntrinsics::_compareAndExchangeLongAcquire:
473 case vmIntrinsics::_compareAndExchangeLongRelease:
474 if (!Matcher::match_rule_supported(Op_CompareAndExchangeL)) return false;
475 break;
476
477 /* CompareAndExchange, Int: */
478 case vmIntrinsics::_compareAndExchangeInt:
479 case vmIntrinsics::_compareAndExchangeIntAcquire:
480 case vmIntrinsics::_compareAndExchangeIntRelease:
481 if (!Matcher::match_rule_supported(Op_CompareAndExchangeI)) return false;
482 break;
483
484 /* CompareAndExchange, Byte: */
485 case vmIntrinsics::_compareAndExchangeByte:
486 case vmIntrinsics::_compareAndExchangeByteAcquire:
487 case vmIntrinsics::_compareAndExchangeByteRelease:
488 if (!Matcher::match_rule_supported(Op_CompareAndExchangeB)) return false;
489 break;
490
491 /* CompareAndExchange, Short: */
492 case vmIntrinsics::_compareAndExchangeShort:
493 case vmIntrinsics::_compareAndExchangeShortAcquire:
494 case vmIntrinsics::_compareAndExchangeShortRelease:
495 if (!Matcher::match_rule_supported(Op_CompareAndExchangeS)) return false;
496 break;
497
498 case vmIntrinsics::_getAndAddByte:
499 if (!Matcher::match_rule_supported(Op_GetAndAddB)) return false;
500 break;
501 case vmIntrinsics::_getAndAddShort:
502 if (!Matcher::match_rule_supported(Op_GetAndAddS)) return false;
503 break;
504 case vmIntrinsics::_getAndAddInt:
505 if (!Matcher::match_rule_supported(Op_GetAndAddI)) return false;
506 break;
507 case vmIntrinsics::_getAndAddLong:
508 if (!Matcher::match_rule_supported(Op_GetAndAddL)) return false;
509 break;
510
511 case vmIntrinsics::_getAndSetByte:
512 if (!Matcher::match_rule_supported(Op_GetAndSetB)) return false;
513 break;
514 case vmIntrinsics::_getAndSetShort:
515 if (!Matcher::match_rule_supported(Op_GetAndSetS)) return false;
516 break;
517 case vmIntrinsics::_getAndSetInt:
518 if (!Matcher::match_rule_supported(Op_GetAndSetI)) return false;
519 break;
520 case vmIntrinsics::_getAndSetLong:
521 if (!Matcher::match_rule_supported(Op_GetAndSetL)) return false;
522 break;
523 case vmIntrinsics::_getAndSetReference:
524 #ifdef _LP64
525 if (!UseCompressedOops && !Matcher::match_rule_supported(Op_GetAndSetP)) return false;
526 if (UseCompressedOops && !Matcher::match_rule_supported(Op_GetAndSetN)) return false;
527 break;
528 #else
529 if (!Matcher::match_rule_supported(Op_GetAndSetP)) return false;
530 break;
531 #endif
532 case vmIntrinsics::_incrementExactI:
533 case vmIntrinsics::_addExactI:
534 if (!Matcher::match_rule_supported(Op_OverflowAddI)) return false;
535 break;
536 case vmIntrinsics::_incrementExactL:
537 case vmIntrinsics::_addExactL:
538 if (!Matcher::match_rule_supported(Op_OverflowAddL)) return false;
539 break;
540 case vmIntrinsics::_decrementExactI:
541 case vmIntrinsics::_subtractExactI:
542 if (!Matcher::match_rule_supported(Op_OverflowSubI)) return false;
543 break;
544 case vmIntrinsics::_decrementExactL:
545 case vmIntrinsics::_subtractExactL:
546 if (!Matcher::match_rule_supported(Op_OverflowSubL)) return false;
547 break;
548 case vmIntrinsics::_negateExactI:
549 if (!Matcher::match_rule_supported(Op_OverflowSubI)) return false;
550 break;
551 case vmIntrinsics::_negateExactL:
552 if (!Matcher::match_rule_supported(Op_OverflowSubL)) return false;
553 break;
554 case vmIntrinsics::_multiplyExactI:
555 if (!Matcher::match_rule_supported(Op_OverflowMulI)) return false;
556 break;
557 case vmIntrinsics::_multiplyExactL:
558 if (!Matcher::match_rule_supported(Op_OverflowMulL)) return false;
559 break;
560 case vmIntrinsics::_multiplyHigh:
561 if (!Matcher::match_rule_supported(Op_MulHiL)) return false;
562 break;
563 case vmIntrinsics::_unsignedMultiplyHigh:
564 if (!Matcher::match_rule_supported(Op_UMulHiL)) return false;
565 break;
566 case vmIntrinsics::_getCallerClass:
567 if (vmClasses::reflect_CallerSensitive_klass() == nullptr) return false;
568 break;
569 case vmIntrinsics::_onSpinWait:
570 if (!Matcher::match_rule_supported(Op_OnSpinWait)) return false;
571 break;
572 case vmIntrinsics::_fmaD:
573 if (!Matcher::match_rule_supported(Op_FmaD)) return false;
574 break;
575 case vmIntrinsics::_fmaF:
576 if (!Matcher::match_rule_supported(Op_FmaF)) return false;
577 break;
578 case vmIntrinsics::_isDigit:
579 if (!Matcher::match_rule_supported(Op_Digit)) return false;
580 break;
581 case vmIntrinsics::_isLowerCase:
582 if (!Matcher::match_rule_supported(Op_LowerCase)) return false;
583 break;
584 case vmIntrinsics::_isUpperCase:
585 if (!Matcher::match_rule_supported(Op_UpperCase)) return false;
586 break;
587 case vmIntrinsics::_isWhitespace:
588 if (!Matcher::match_rule_supported(Op_Whitespace)) return false;
589 break;
590 case vmIntrinsics::_maxF:
591 case vmIntrinsics::_maxF_strict:
592 if (!Matcher::match_rule_supported(Op_MaxF)) return false;
593 break;
594 case vmIntrinsics::_minF:
595 case vmIntrinsics::_minF_strict:
596 if (!Matcher::match_rule_supported(Op_MinF)) return false;
597 break;
598 case vmIntrinsics::_maxD:
599 case vmIntrinsics::_maxD_strict:
600 if (!Matcher::match_rule_supported(Op_MaxD)) return false;
601 break;
602 case vmIntrinsics::_minD:
603 case vmIntrinsics::_minD_strict:
604 if (!Matcher::match_rule_supported(Op_MinD)) return false;
605 break;
606 case vmIntrinsics::_writeback0:
607 if (!Matcher::match_rule_supported(Op_CacheWB)) return false;
608 break;
609 case vmIntrinsics::_writebackPreSync0:
610 if (!Matcher::match_rule_supported(Op_CacheWBPreSync)) return false;
611 break;
612 case vmIntrinsics::_writebackPostSync0:
613 if (!Matcher::match_rule_supported(Op_CacheWBPostSync)) return false;
614 break;
615 case vmIntrinsics::_rint:
616 case vmIntrinsics::_ceil:
617 case vmIntrinsics::_floor:
618 if (!Matcher::match_rule_supported(Op_RoundDoubleMode)) return false;
619 break;
620 case vmIntrinsics::_dcopySign:
621 if (!Matcher::match_rule_supported(Op_CopySignD)) return false;
622 break;
623 case vmIntrinsics::_fcopySign:
624 if (!Matcher::match_rule_supported(Op_CopySignF)) return false;
625 break;
626 case vmIntrinsics::_dsignum:
627 if (!Matcher::match_rule_supported(Op_SignumD)) return false;
628 break;
629 case vmIntrinsics::_fsignum:
630 if (!Matcher::match_rule_supported(Op_SignumF)) return false;
631 break;
632 case vmIntrinsics::_floatIsInfinite:
633 if (!Matcher::match_rule_supported(Op_IsInfiniteF)) return false;
634 break;
635 case vmIntrinsics::_floatIsFinite:
636 if (!Matcher::match_rule_supported(Op_IsFiniteF)) return false;
637 break;
638 case vmIntrinsics::_doubleIsInfinite:
639 if (!Matcher::match_rule_supported(Op_IsInfiniteD)) return false;
640 break;
641 case vmIntrinsics::_doubleIsFinite:
642 if (!Matcher::match_rule_supported(Op_IsFiniteD)) return false;
643 break;
644 case vmIntrinsics::_hashCode:
645 case vmIntrinsics::_identityHashCode:
646 case vmIntrinsics::_getClass:
647 case vmIntrinsics::_dsin:
648 case vmIntrinsics::_dcos:
649 case vmIntrinsics::_dtan:
650 case vmIntrinsics::_dsinh:
651 case vmIntrinsics::_dtanh:
652 case vmIntrinsics::_dcbrt:
653 case vmIntrinsics::_dabs:
654 case vmIntrinsics::_fabs:
655 case vmIntrinsics::_iabs:
656 case vmIntrinsics::_labs:
657 case vmIntrinsics::_datan2:
658 case vmIntrinsics::_dsqrt:
659 case vmIntrinsics::_dsqrt_strict:
660 case vmIntrinsics::_dexp:
661 case vmIntrinsics::_dlog:
662 case vmIntrinsics::_dlog10:
663 case vmIntrinsics::_dpow:
664 case vmIntrinsics::_roundD:
665 case vmIntrinsics::_roundF:
666 case vmIntrinsics::_min:
667 case vmIntrinsics::_max:
668 case vmIntrinsics::_min_strict:
669 case vmIntrinsics::_max_strict:
670 case vmIntrinsics::_maxL:
671 case vmIntrinsics::_minL:
672 case vmIntrinsics::_arraycopy:
673 case vmIntrinsics::_arraySort:
674 case vmIntrinsics::_arrayPartition:
675 case vmIntrinsics::_indexOfL:
676 case vmIntrinsics::_indexOfU:
677 case vmIntrinsics::_indexOfUL:
678 case vmIntrinsics::_indexOfIL:
679 case vmIntrinsics::_indexOfIU:
680 case vmIntrinsics::_indexOfIUL:
681 case vmIntrinsics::_indexOfU_char:
682 case vmIntrinsics::_indexOfL_char:
683 case vmIntrinsics::_toBytesStringU:
684 case vmIntrinsics::_getCharsStringU:
685 case vmIntrinsics::_getCharStringU:
686 case vmIntrinsics::_putCharStringU:
687 case vmIntrinsics::_getReference:
688 case vmIntrinsics::_getBoolean:
689 case vmIntrinsics::_getByte:
690 case vmIntrinsics::_getShort:
691 case vmIntrinsics::_getChar:
692 case vmIntrinsics::_getInt:
693 case vmIntrinsics::_getLong:
694 case vmIntrinsics::_getFloat:
695 case vmIntrinsics::_getDouble:
696 case vmIntrinsics::_putReference:
697 case vmIntrinsics::_putBoolean:
698 case vmIntrinsics::_putByte:
699 case vmIntrinsics::_putShort:
700 case vmIntrinsics::_putChar:
701 case vmIntrinsics::_putInt:
702 case vmIntrinsics::_putLong:
703 case vmIntrinsics::_putFloat:
704 case vmIntrinsics::_putDouble:
705 case vmIntrinsics::_getReferenceVolatile:
706 case vmIntrinsics::_getBooleanVolatile:
707 case vmIntrinsics::_getByteVolatile:
708 case vmIntrinsics::_getShortVolatile:
709 case vmIntrinsics::_getCharVolatile:
710 case vmIntrinsics::_getIntVolatile:
711 case vmIntrinsics::_getLongVolatile:
712 case vmIntrinsics::_getFloatVolatile:
713 case vmIntrinsics::_getDoubleVolatile:
714 case vmIntrinsics::_putReferenceVolatile:
715 case vmIntrinsics::_putBooleanVolatile:
716 case vmIntrinsics::_putByteVolatile:
717 case vmIntrinsics::_putShortVolatile:
718 case vmIntrinsics::_putCharVolatile:
719 case vmIntrinsics::_putIntVolatile:
720 case vmIntrinsics::_putLongVolatile:
721 case vmIntrinsics::_putFloatVolatile:
722 case vmIntrinsics::_putDoubleVolatile:
723 case vmIntrinsics::_getReferenceAcquire:
724 case vmIntrinsics::_getBooleanAcquire:
725 case vmIntrinsics::_getByteAcquire:
726 case vmIntrinsics::_getShortAcquire:
727 case vmIntrinsics::_getCharAcquire:
728 case vmIntrinsics::_getIntAcquire:
729 case vmIntrinsics::_getLongAcquire:
730 case vmIntrinsics::_getFloatAcquire:
731 case vmIntrinsics::_getDoubleAcquire:
732 case vmIntrinsics::_putReferenceRelease:
733 case vmIntrinsics::_putBooleanRelease:
734 case vmIntrinsics::_putByteRelease:
735 case vmIntrinsics::_putShortRelease:
736 case vmIntrinsics::_putCharRelease:
737 case vmIntrinsics::_putIntRelease:
738 case vmIntrinsics::_putLongRelease:
739 case vmIntrinsics::_putFloatRelease:
740 case vmIntrinsics::_putDoubleRelease:
741 case vmIntrinsics::_getReferenceOpaque:
742 case vmIntrinsics::_getBooleanOpaque:
743 case vmIntrinsics::_getByteOpaque:
744 case vmIntrinsics::_getShortOpaque:
745 case vmIntrinsics::_getCharOpaque:
746 case vmIntrinsics::_getIntOpaque:
747 case vmIntrinsics::_getLongOpaque:
748 case vmIntrinsics::_getFloatOpaque:
749 case vmIntrinsics::_getDoubleOpaque:
750 case vmIntrinsics::_putReferenceOpaque:
751 case vmIntrinsics::_putBooleanOpaque:
752 case vmIntrinsics::_putByteOpaque:
753 case vmIntrinsics::_putShortOpaque:
754 case vmIntrinsics::_putCharOpaque:
755 case vmIntrinsics::_putIntOpaque:
756 case vmIntrinsics::_putLongOpaque:
757 case vmIntrinsics::_putFloatOpaque:
758 case vmIntrinsics::_putDoubleOpaque:
759 case vmIntrinsics::_getShortUnaligned:
760 case vmIntrinsics::_getCharUnaligned:
761 case vmIntrinsics::_getIntUnaligned:
762 case vmIntrinsics::_getLongUnaligned:
763 case vmIntrinsics::_putShortUnaligned:
764 case vmIntrinsics::_putCharUnaligned:
765 case vmIntrinsics::_putIntUnaligned:
766 case vmIntrinsics::_putLongUnaligned:
767 case vmIntrinsics::_loadFence:
768 case vmIntrinsics::_storeFence:
769 case vmIntrinsics::_storeStoreFence:
770 case vmIntrinsics::_fullFence:
771 case vmIntrinsics::_currentCarrierThread:
772 case vmIntrinsics::_currentThread:
773 case vmIntrinsics::_setCurrentThread:
774 case vmIntrinsics::_scopedValueCache:
775 case vmIntrinsics::_setScopedValueCache:
776 case vmIntrinsics::_Continuation_pin:
777 case vmIntrinsics::_Continuation_unpin:
778 #ifdef JFR_HAVE_INTRINSICS
779 case vmIntrinsics::_counterTime:
780 case vmIntrinsics::_getEventWriter:
781 case vmIntrinsics::_jvm_commit:
782 #endif
783 case vmIntrinsics::_currentTimeMillis:
784 case vmIntrinsics::_nanoTime:
785 case vmIntrinsics::_allocateInstance:
786 case vmIntrinsics::_allocateUninitializedArray:
787 case vmIntrinsics::_newArray:
788 case vmIntrinsics::_getLength:
789 case vmIntrinsics::_copyOf:
790 case vmIntrinsics::_copyOfRange:
791 case vmIntrinsics::_clone:
792 case vmIntrinsics::_isAssignableFrom:
793 case vmIntrinsics::_isInstance:
794 case vmIntrinsics::_isHidden:
795 case vmIntrinsics::_getSuperclass:
796 case vmIntrinsics::_floatToRawIntBits:
797 case vmIntrinsics::_floatToIntBits:
798 case vmIntrinsics::_intBitsToFloat:
799 case vmIntrinsics::_doubleToRawLongBits:
800 case vmIntrinsics::_doubleToLongBits:
801 case vmIntrinsics::_longBitsToDouble:
802 case vmIntrinsics::_Reference_get0:
803 case vmIntrinsics::_Reference_refersTo0:
804 case vmIntrinsics::_PhantomReference_refersTo0:
805 case vmIntrinsics::_Reference_clear0:
806 case vmIntrinsics::_PhantomReference_clear0:
807 case vmIntrinsics::_Class_cast:
808 case vmIntrinsics::_aescrypt_encryptBlock:
809 case vmIntrinsics::_aescrypt_decryptBlock:
810 case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt:
811 case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt:
812 case vmIntrinsics::_counterMode_AESCrypt:
813 case vmIntrinsics::_md5_implCompress:
814 case vmIntrinsics::_sha_implCompress:
815 case vmIntrinsics::_sha2_implCompress:
816 case vmIntrinsics::_sha5_implCompress:
817 case vmIntrinsics::_sha3_implCompress:
818 case vmIntrinsics::_double_keccak:
819 case vmIntrinsics::_digestBase_implCompressMB:
820 case vmIntrinsics::_multiplyToLen:
821 case vmIntrinsics::_squareToLen:
822 case vmIntrinsics::_mulAdd:
823 case vmIntrinsics::_montgomeryMultiply:
824 case vmIntrinsics::_montgomerySquare:
825 case vmIntrinsics::_vectorizedMismatch:
826 case vmIntrinsics::_ghash_processBlocks:
827 case vmIntrinsics::_chacha20Block:
828 case vmIntrinsics::_kyberNtt:
829 case vmIntrinsics::_kyberInverseNtt:
830 case vmIntrinsics::_kyberNttMult:
831 case vmIntrinsics::_kyberAddPoly_2:
832 case vmIntrinsics::_kyberAddPoly_3:
833 case vmIntrinsics::_kyber12To16:
834 case vmIntrinsics::_kyberBarrettReduce:
835 case vmIntrinsics::_dilithiumAlmostNtt:
836 case vmIntrinsics::_dilithiumAlmostInverseNtt:
837 case vmIntrinsics::_dilithiumNttMult:
838 case vmIntrinsics::_dilithiumMontMulByConstant:
839 case vmIntrinsics::_dilithiumDecomposePoly:
840 case vmIntrinsics::_base64_encodeBlock:
841 case vmIntrinsics::_base64_decodeBlock:
842 case vmIntrinsics::_poly1305_processBlocks:
843 case vmIntrinsics::_intpoly_montgomeryMult_P256:
844 case vmIntrinsics::_intpoly_assign:
845 case vmIntrinsics::_updateCRC32:
846 case vmIntrinsics::_updateBytesCRC32:
847 case vmIntrinsics::_updateByteBufferCRC32:
848 case vmIntrinsics::_updateBytesCRC32C:
849 case vmIntrinsics::_updateDirectByteBufferCRC32C:
850 case vmIntrinsics::_updateBytesAdler32:
851 case vmIntrinsics::_updateByteBufferAdler32:
852 case vmIntrinsics::_profileBoolean:
853 case vmIntrinsics::_isCompileConstant:
854 case vmIntrinsics::_Preconditions_checkIndex:
855 case vmIntrinsics::_Preconditions_checkLongIndex:
856 case vmIntrinsics::_getObjectSize:
857 break;
858 case vmIntrinsics::_VectorCompressExpand:
859 case vmIntrinsics::_VectorUnaryOp:
860 case vmIntrinsics::_VectorBinaryOp:
861 case vmIntrinsics::_VectorTernaryOp:
862 case vmIntrinsics::_VectorFromBitsCoerced:
863 case vmIntrinsics::_VectorLoadOp:
864 case vmIntrinsics::_VectorLoadMaskedOp:
865 case vmIntrinsics::_VectorStoreOp:
866 case vmIntrinsics::_VectorStoreMaskedOp:
867 case vmIntrinsics::_VectorSelectFromTwoVectorOp:
868 case vmIntrinsics::_VectorGatherOp:
869 case vmIntrinsics::_VectorScatterOp:
870 case vmIntrinsics::_VectorReductionCoerced:
871 case vmIntrinsics::_VectorTest:
872 case vmIntrinsics::_VectorBlend:
873 case vmIntrinsics::_VectorRearrange:
874 case vmIntrinsics::_VectorSelectFrom:
875 case vmIntrinsics::_VectorCompare:
876 case vmIntrinsics::_VectorBroadcastInt:
877 case vmIntrinsics::_VectorConvert:
878 case vmIntrinsics::_VectorInsert:
879 case vmIntrinsics::_VectorExtract:
880 case vmIntrinsics::_VectorMaskOp:
881 case vmIntrinsics::_IndexVector:
882 case vmIntrinsics::_IndexPartiallyInUpperRange:
883 return EnableVectorSupport;
884 case vmIntrinsics::_VectorUnaryLibOp:
885 case vmIntrinsics::_VectorBinaryLibOp:
886 return EnableVectorSupport && Matcher::supports_vector_calling_convention();
887 case vmIntrinsics::_blackhole:
888 #if INCLUDE_JVMTI
889 case vmIntrinsics::_notifyJvmtiVThreadStart:
890 case vmIntrinsics::_notifyJvmtiVThreadEnd:
891 case vmIntrinsics::_notifyJvmtiVThreadMount:
892 case vmIntrinsics::_notifyJvmtiVThreadUnmount:
893 case vmIntrinsics::_notifyJvmtiVThreadDisableSuspend:
894 #endif
895 break;
896
897 default:
898 return false;
899 }
900 return true;
901 }
902
903 int C2Compiler::initial_code_buffer_size(int const_size) {
904 // See Compile::init_scratch_buffer_blob
905 int locs_size = sizeof(relocInfo) * PhaseOutput::MAX_locs_size;
906 int slop = 2 * CodeSection::end_slop(); // space between sections
907 return PhaseOutput::max_inst_size() + PhaseOutput::MAX_stubs_size + const_size + slop + locs_size;
908 }