1 /*
2  * Copyright (c) 1999, 2020, 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 "runtime/handles.inline.hpp"
27 #include "jfr/support/jfrIntrinsics.hpp"
28 #include "opto/c2compiler.hpp"
29 #include "opto/compile.hpp"
30 #include "opto/optoreg.hpp"
31 #include "opto/output.hpp"
32 #include "opto/runtime.hpp"
33 #include "utilities/macros.hpp"
34 
35 
36 // register information defined by ADLC
37 extern const char register_save_policy[];
38 extern const int  register_save_type[];
39 
retry_no_subsuming_loads()40 const char* C2Compiler::retry_no_subsuming_loads() {
41   return "retry without subsuming loads";
42 }
retry_no_escape_analysis()43 const char* C2Compiler::retry_no_escape_analysis() {
44   return "retry without escape analysis";
45 }
retry_class_loading_during_parsing()46 const char* C2Compiler::retry_class_loading_during_parsing() {
47   return "retry class loading during parsing";
48 }
init_c2_runtime()49 bool C2Compiler::init_c2_runtime() {
50 
51   // Check assumptions used while running ADLC
52   Compile::adlc_verification();
53   assert(REG_COUNT <= ConcreteRegisterImpl::number_of_registers, "incompatible register counts");
54 
55   for (int i = 0; i < ConcreteRegisterImpl::number_of_registers ; i++ ) {
56       OptoReg::vm2opto[i] = OptoReg::Bad;
57   }
58 
59   for( OptoReg::Name i=OptoReg::Name(0); i<OptoReg::Name(REG_COUNT); i = OptoReg::add(i,1) ) {
60     VMReg r = OptoReg::as_VMReg(i);
61     if (r->is_valid()) {
62       OptoReg::vm2opto[r->value()] = i;
63     }
64   }
65 
66   DEBUG_ONLY( Node::init_NodeProperty(); )
67 
68   Compile::pd_compiler2_init();
69 
70   CompilerThread* thread = CompilerThread::current();
71 
72   HandleMark handle_mark(thread);
73   return OptoRuntime::generate(thread->env());
74 }
75 
initialize()76 void C2Compiler::initialize() {
77   assert(!is_c1_or_interpreter_only(), "C2 compiler is launched, it's not c1/interpreter only mode");
78   // The first compiler thread that gets here will initialize the
79   // small amount of global state (and runtime stubs) that C2 needs.
80 
81   // There is a race possible once at startup and then we're fine
82 
83   // Note that this is being called from a compiler thread not the
84   // main startup thread.
85   if (should_perform_init()) {
86     bool successful = C2Compiler::init_c2_runtime();
87     int new_state = (successful) ? initialized : failed;
88     set_state(new_state);
89   }
90 }
91 
compile_method(ciEnv * env,ciMethod * target,int entry_bci,bool install_code,DirectiveSet * directive)92 void C2Compiler::compile_method(ciEnv* env, ciMethod* target, int entry_bci, bool install_code, DirectiveSet* directive) {
93   assert(is_initialized(), "Compiler thread must be initialized");
94 
95   bool subsume_loads = SubsumeLoads;
96   bool do_escape_analysis = DoEscapeAnalysis;
97   bool eliminate_boxing = EliminateAutoBox;
98 
99   while (!env->failing()) {
100     // Attempt to compile while subsuming loads into machine instructions.
101     Compile C(env, target, entry_bci, subsume_loads, do_escape_analysis, eliminate_boxing, install_code, directive);
102 
103     // Check result and retry if appropriate.
104     if (C.failure_reason() != NULL) {
105       if (C.failure_reason_is(retry_class_loading_during_parsing())) {
106         env->report_failure(C.failure_reason());
107         continue;  // retry
108       }
109       if (C.failure_reason_is(retry_no_subsuming_loads())) {
110         assert(subsume_loads, "must make progress");
111         subsume_loads = false;
112         env->report_failure(C.failure_reason());
113         continue;  // retry
114       }
115       if (C.failure_reason_is(retry_no_escape_analysis())) {
116         assert(do_escape_analysis, "must make progress");
117         do_escape_analysis = false;
118         env->report_failure(C.failure_reason());
119         continue;  // retry
120       }
121       if (C.has_boxed_value()) {
122         // Recompile without boxing elimination regardless failure reason.
123         assert(eliminate_boxing, "must make progress");
124         eliminate_boxing = false;
125         env->report_failure(C.failure_reason());
126         continue;  // retry
127       }
128       // Pass any other failure reason up to the ciEnv.
129       // Note that serious, irreversible failures are already logged
130       // on the ciEnv via env->record_method_not_compilable().
131       env->record_failure(C.failure_reason());
132     }
133     if (StressRecompilation) {
134       if (subsume_loads) {
135         subsume_loads = false;
136         continue;  // retry
137       }
138       if (do_escape_analysis) {
139         do_escape_analysis = false;
140         continue;  // retry
141       }
142     }
143     // print inlining for last compilation only
144     C.dump_print_inlining();
145 
146     // No retry; just break the loop.
147     break;
148   }
149 }
150 
print_timers()151 void C2Compiler::print_timers() {
152   Compile::print_timers();
153 }
154 
is_intrinsic_supported(const methodHandle & method,bool is_virtual)155 bool C2Compiler::is_intrinsic_supported(const methodHandle& method, bool is_virtual) {
156   vmIntrinsics::ID id = method->intrinsic_id();
157   assert(id != vmIntrinsics::_none, "must be a VM intrinsic");
158 
159   if (id < vmIntrinsics::FIRST_ID || id > vmIntrinsics::LAST_COMPILER_INLINE) {
160     return false;
161   }
162 
163   // Only Object.hashCode and Object.clone intrinsics implement also a virtual
164   // dispatch because calling both methods is expensive but both methods are
165   // frequently overridden. All other intrinsics implement only a non-virtual
166   // dispatch.
167   if (is_virtual) {
168     switch (id) {
169     case vmIntrinsics::_hashCode:
170     case vmIntrinsics::_clone:
171       break;
172     default:
173       return false;
174     }
175   }
176 
177   switch (id) {
178   case vmIntrinsics::_compressStringC:
179   case vmIntrinsics::_compressStringB:
180     if (!Matcher::has_match_rule(Op_StrCompressedCopy)) return false;
181     break;
182   case vmIntrinsics::_inflateStringC:
183   case vmIntrinsics::_inflateStringB:
184     if (!Matcher::has_match_rule(Op_StrInflatedCopy)) return false;
185     break;
186   case vmIntrinsics::_compareToL:
187   case vmIntrinsics::_compareToU:
188   case vmIntrinsics::_compareToLU:
189   case vmIntrinsics::_compareToUL:
190     if (!Matcher::match_rule_supported(Op_StrComp)) return false;
191     break;
192   case vmIntrinsics::_equalsL:
193   case vmIntrinsics::_equalsU:
194     if (!Matcher::match_rule_supported(Op_StrEquals)) return false;
195     break;
196   case vmIntrinsics::_equalsB:
197   case vmIntrinsics::_equalsC:
198     if (!Matcher::match_rule_supported(Op_AryEq)) return false;
199     break;
200   case vmIntrinsics::_copyMemory:
201     if (StubRoutines::unsafe_arraycopy() == NULL) return false;
202     break;
203   case vmIntrinsics::_encodeISOArray:
204   case vmIntrinsics::_encodeByteISOArray:
205     if (!Matcher::match_rule_supported(Op_EncodeISOArray)) return false;
206     break;
207   case vmIntrinsics::_hasNegatives:
208     if (!Matcher::match_rule_supported(Op_HasNegatives))  return false;
209     break;
210   case vmIntrinsics::_bitCount_i:
211     if (!Matcher::match_rule_supported(Op_PopCountI)) return false;
212     break;
213   case vmIntrinsics::_bitCount_l:
214     if (!Matcher::match_rule_supported(Op_PopCountL)) return false;
215     break;
216   case vmIntrinsics::_numberOfLeadingZeros_i:
217     if (!Matcher::match_rule_supported(Op_CountLeadingZerosI)) return false;
218     break;
219   case vmIntrinsics::_numberOfLeadingZeros_l:
220     if (!Matcher::match_rule_supported(Op_CountLeadingZerosL)) return false;
221     break;
222   case vmIntrinsics::_numberOfTrailingZeros_i:
223     if (!Matcher::match_rule_supported(Op_CountTrailingZerosI)) return false;
224     break;
225   case vmIntrinsics::_numberOfTrailingZeros_l:
226     if (!Matcher::match_rule_supported(Op_CountTrailingZerosL)) return false;
227     break;
228   case vmIntrinsics::_reverseBytes_c:
229     if (!Matcher::match_rule_supported(Op_ReverseBytesUS)) return false;
230     break;
231   case vmIntrinsics::_reverseBytes_s:
232     if (!Matcher::match_rule_supported(Op_ReverseBytesS)) return false;
233     break;
234   case vmIntrinsics::_reverseBytes_i:
235     if (!Matcher::match_rule_supported(Op_ReverseBytesI)) return false;
236     break;
237   case vmIntrinsics::_reverseBytes_l:
238     if (!Matcher::match_rule_supported(Op_ReverseBytesL)) return false;
239     break;
240 
241   /* CompareAndSet, Object: */
242   case vmIntrinsics::_compareAndSetReference:
243 #ifdef _LP64
244     if ( UseCompressedOops && !Matcher::match_rule_supported(Op_CompareAndSwapN)) return false;
245     if (!UseCompressedOops && !Matcher::match_rule_supported(Op_CompareAndSwapP)) return false;
246 #else
247     if (!Matcher::match_rule_supported(Op_CompareAndSwapP)) return false;
248 #endif
249     break;
250   case vmIntrinsics::_weakCompareAndSetReferencePlain:
251   case vmIntrinsics::_weakCompareAndSetReferenceAcquire:
252   case vmIntrinsics::_weakCompareAndSetReferenceRelease:
253   case vmIntrinsics::_weakCompareAndSetReference:
254 #ifdef _LP64
255     if ( UseCompressedOops && !Matcher::match_rule_supported(Op_WeakCompareAndSwapN)) return false;
256     if (!UseCompressedOops && !Matcher::match_rule_supported(Op_WeakCompareAndSwapP)) return false;
257 #else
258     if (!Matcher::match_rule_supported(Op_WeakCompareAndSwapP)) return false;
259 #endif
260     break;
261   /* CompareAndSet, Long: */
262   case vmIntrinsics::_compareAndSetLong:
263     if (!Matcher::match_rule_supported(Op_CompareAndSwapL)) return false;
264     break;
265   case vmIntrinsics::_weakCompareAndSetLongPlain:
266   case vmIntrinsics::_weakCompareAndSetLongAcquire:
267   case vmIntrinsics::_weakCompareAndSetLongRelease:
268   case vmIntrinsics::_weakCompareAndSetLong:
269     if (!Matcher::match_rule_supported(Op_WeakCompareAndSwapL)) return false;
270     break;
271 
272   /* CompareAndSet, Int: */
273   case vmIntrinsics::_compareAndSetInt:
274     if (!Matcher::match_rule_supported(Op_CompareAndSwapI)) return false;
275     break;
276   case vmIntrinsics::_weakCompareAndSetIntPlain:
277   case vmIntrinsics::_weakCompareAndSetIntAcquire:
278   case vmIntrinsics::_weakCompareAndSetIntRelease:
279   case vmIntrinsics::_weakCompareAndSetInt:
280     if (!Matcher::match_rule_supported(Op_WeakCompareAndSwapI)) return false;
281     break;
282 
283   /* CompareAndSet, Byte: */
284   case vmIntrinsics::_compareAndSetByte:
285     if (!Matcher::match_rule_supported(Op_CompareAndSwapB)) return false;
286     break;
287   case vmIntrinsics::_weakCompareAndSetBytePlain:
288   case vmIntrinsics::_weakCompareAndSetByteAcquire:
289   case vmIntrinsics::_weakCompareAndSetByteRelease:
290   case vmIntrinsics::_weakCompareAndSetByte:
291     if (!Matcher::match_rule_supported(Op_WeakCompareAndSwapB)) return false;
292     break;
293 
294   /* CompareAndSet, Short: */
295   case vmIntrinsics::_compareAndSetShort:
296     if (!Matcher::match_rule_supported(Op_CompareAndSwapS)) return false;
297     break;
298   case vmIntrinsics::_weakCompareAndSetShortPlain:
299   case vmIntrinsics::_weakCompareAndSetShortAcquire:
300   case vmIntrinsics::_weakCompareAndSetShortRelease:
301   case vmIntrinsics::_weakCompareAndSetShort:
302     if (!Matcher::match_rule_supported(Op_WeakCompareAndSwapS)) return false;
303     break;
304 
305   /* CompareAndExchange, Object: */
306   case vmIntrinsics::_compareAndExchangeReference:
307   case vmIntrinsics::_compareAndExchangeReferenceAcquire:
308   case vmIntrinsics::_compareAndExchangeReferenceRelease:
309 #ifdef _LP64
310     if ( UseCompressedOops && !Matcher::match_rule_supported(Op_CompareAndExchangeN)) return false;
311     if (!UseCompressedOops && !Matcher::match_rule_supported(Op_CompareAndExchangeP)) return false;
312 #else
313     if (!Matcher::match_rule_supported(Op_CompareAndExchangeP)) return false;
314 #endif
315     break;
316 
317   /* CompareAndExchange, Long: */
318   case vmIntrinsics::_compareAndExchangeLong:
319   case vmIntrinsics::_compareAndExchangeLongAcquire:
320   case vmIntrinsics::_compareAndExchangeLongRelease:
321     if (!Matcher::match_rule_supported(Op_CompareAndExchangeL)) return false;
322     break;
323 
324   /* CompareAndExchange, Int: */
325   case vmIntrinsics::_compareAndExchangeInt:
326   case vmIntrinsics::_compareAndExchangeIntAcquire:
327   case vmIntrinsics::_compareAndExchangeIntRelease:
328     if (!Matcher::match_rule_supported(Op_CompareAndExchangeI)) return false;
329     break;
330 
331   /* CompareAndExchange, Byte: */
332   case vmIntrinsics::_compareAndExchangeByte:
333   case vmIntrinsics::_compareAndExchangeByteAcquire:
334   case vmIntrinsics::_compareAndExchangeByteRelease:
335     if (!Matcher::match_rule_supported(Op_CompareAndExchangeB)) return false;
336     break;
337 
338   /* CompareAndExchange, Short: */
339   case vmIntrinsics::_compareAndExchangeShort:
340   case vmIntrinsics::_compareAndExchangeShortAcquire:
341   case vmIntrinsics::_compareAndExchangeShortRelease:
342     if (!Matcher::match_rule_supported(Op_CompareAndExchangeS)) return false;
343     break;
344 
345   case vmIntrinsics::_getAndAddByte:
346     if (!Matcher::match_rule_supported(Op_GetAndAddB)) return false;
347     break;
348   case vmIntrinsics::_getAndAddShort:
349     if (!Matcher::match_rule_supported(Op_GetAndAddS)) return false;
350     break;
351   case vmIntrinsics::_getAndAddInt:
352     if (!Matcher::match_rule_supported(Op_GetAndAddI)) return false;
353     break;
354   case vmIntrinsics::_getAndAddLong:
355     if (!Matcher::match_rule_supported(Op_GetAndAddL)) return false;
356     break;
357 
358   case vmIntrinsics::_getAndSetByte:
359     if (!Matcher::match_rule_supported(Op_GetAndSetB)) return false;
360     break;
361   case vmIntrinsics::_getAndSetShort:
362     if (!Matcher::match_rule_supported(Op_GetAndSetS)) return false;
363     break;
364   case vmIntrinsics::_getAndSetInt:
365     if (!Matcher::match_rule_supported(Op_GetAndSetI)) return false;
366     break;
367   case vmIntrinsics::_getAndSetLong:
368     if (!Matcher::match_rule_supported(Op_GetAndSetL)) return false;
369     break;
370   case vmIntrinsics::_getAndSetReference:
371 #ifdef _LP64
372     if (!UseCompressedOops && !Matcher::match_rule_supported(Op_GetAndSetP)) return false;
373     if (UseCompressedOops && !Matcher::match_rule_supported(Op_GetAndSetN)) return false;
374     break;
375 #else
376     if (!Matcher::match_rule_supported(Op_GetAndSetP)) return false;
377     break;
378 #endif
379   case vmIntrinsics::_incrementExactI:
380   case vmIntrinsics::_addExactI:
381     if (!Matcher::match_rule_supported(Op_OverflowAddI)) return false;
382     break;
383   case vmIntrinsics::_incrementExactL:
384   case vmIntrinsics::_addExactL:
385     if (!Matcher::match_rule_supported(Op_OverflowAddL)) return false;
386     break;
387   case vmIntrinsics::_decrementExactI:
388   case vmIntrinsics::_subtractExactI:
389     if (!Matcher::match_rule_supported(Op_OverflowSubI)) return false;
390     break;
391   case vmIntrinsics::_decrementExactL:
392   case vmIntrinsics::_subtractExactL:
393     if (!Matcher::match_rule_supported(Op_OverflowSubL)) return false;
394     break;
395   case vmIntrinsics::_negateExactI:
396     if (!Matcher::match_rule_supported(Op_OverflowSubI)) return false;
397     break;
398   case vmIntrinsics::_negateExactL:
399     if (!Matcher::match_rule_supported(Op_OverflowSubL)) return false;
400     break;
401   case vmIntrinsics::_multiplyExactI:
402     if (!Matcher::match_rule_supported(Op_OverflowMulI)) return false;
403     break;
404   case vmIntrinsics::_multiplyExactL:
405     if (!Matcher::match_rule_supported(Op_OverflowMulL)) return false;
406     break;
407   case vmIntrinsics::_multiplyHigh:
408     if (!Matcher::match_rule_supported(Op_MulHiL)) return false;
409     break;
410   case vmIntrinsics::_getCallerClass:
411     if (SystemDictionary::reflect_CallerSensitive_klass() == NULL) return false;
412     break;
413   case vmIntrinsics::_onSpinWait:
414     if (!Matcher::match_rule_supported(Op_OnSpinWait)) return false;
415     break;
416   case vmIntrinsics::_fmaD:
417     if (!UseFMA || !Matcher::match_rule_supported(Op_FmaD)) return false;
418     break;
419   case vmIntrinsics::_fmaF:
420     if (!UseFMA || !Matcher::match_rule_supported(Op_FmaF)) return false;
421     break;
422   case vmIntrinsics::_isDigit:
423     if (!Matcher::match_rule_supported(Op_Digit)) return false;
424     break;
425   case vmIntrinsics::_isLowerCase:
426     if (!Matcher::match_rule_supported(Op_LowerCase)) return false;
427     break;
428   case vmIntrinsics::_isUpperCase:
429     if (!Matcher::match_rule_supported(Op_UpperCase)) return false;
430     break;
431   case vmIntrinsics::_isWhitespace:
432     if (!Matcher::match_rule_supported(Op_Whitespace)) return false;
433     break;
434   case vmIntrinsics::_maxF:
435     if (!Matcher::match_rule_supported(Op_MaxF)) return false;
436     break;
437   case vmIntrinsics::_minF:
438     if (!Matcher::match_rule_supported(Op_MinF)) return false;
439     break;
440   case vmIntrinsics::_maxD:
441     if (!Matcher::match_rule_supported(Op_MaxD)) return false;
442     break;
443   case vmIntrinsics::_minD:
444     if (!Matcher::match_rule_supported(Op_MinD)) return false;
445     break;
446   case vmIntrinsics::_writeback0:
447     if (!Matcher::match_rule_supported(Op_CacheWB)) return false;
448     break;
449   case vmIntrinsics::_writebackPreSync0:
450     if (!Matcher::match_rule_supported(Op_CacheWBPreSync)) return false;
451     break;
452   case vmIntrinsics::_writebackPostSync0:
453     if (!Matcher::match_rule_supported(Op_CacheWBPostSync)) return false;
454     break;
455   case vmIntrinsics::_rint:
456   case vmIntrinsics::_ceil:
457   case vmIntrinsics::_floor:
458     if (!Matcher::match_rule_supported(Op_RoundDoubleMode)) return false;
459     break;
460   case vmIntrinsics::_dcopySign:
461     if (!Matcher::match_rule_supported(Op_CopySignD)) return false;
462     break;
463   case vmIntrinsics::_fcopySign:
464     if (!Matcher::match_rule_supported(Op_CopySignF)) return false;
465     break;
466   case vmIntrinsics::_dsignum:
467     if (!Matcher::match_rule_supported(Op_SignumD)) return false;
468     break;
469   case vmIntrinsics::_fsignum:
470     if (!Matcher::match_rule_supported(Op_SignumF)) return false;
471     break;
472   case vmIntrinsics::_hashCode:
473   case vmIntrinsics::_identityHashCode:
474   case vmIntrinsics::_getClass:
475   case vmIntrinsics::_dsin:
476   case vmIntrinsics::_dcos:
477   case vmIntrinsics::_dtan:
478   case vmIntrinsics::_dabs:
479   case vmIntrinsics::_fabs:
480   case vmIntrinsics::_iabs:
481   case vmIntrinsics::_labs:
482   case vmIntrinsics::_datan2:
483   case vmIntrinsics::_dsqrt:
484   case vmIntrinsics::_dexp:
485   case vmIntrinsics::_dlog:
486   case vmIntrinsics::_dlog10:
487   case vmIntrinsics::_dpow:
488   case vmIntrinsics::_min:
489   case vmIntrinsics::_max:
490   case vmIntrinsics::_arraycopy:
491   case vmIntrinsics::_indexOfL:
492   case vmIntrinsics::_indexOfU:
493   case vmIntrinsics::_indexOfUL:
494   case vmIntrinsics::_indexOfIL:
495   case vmIntrinsics::_indexOfIU:
496   case vmIntrinsics::_indexOfIUL:
497   case vmIntrinsics::_indexOfU_char:
498   case vmIntrinsics::_indexOfL_char:
499   case vmIntrinsics::_toBytesStringU:
500   case vmIntrinsics::_getCharsStringU:
501   case vmIntrinsics::_getCharStringU:
502   case vmIntrinsics::_putCharStringU:
503   case vmIntrinsics::_getReference:
504   case vmIntrinsics::_getBoolean:
505   case vmIntrinsics::_getByte:
506   case vmIntrinsics::_getShort:
507   case vmIntrinsics::_getChar:
508   case vmIntrinsics::_getInt:
509   case vmIntrinsics::_getLong:
510   case vmIntrinsics::_getFloat:
511   case vmIntrinsics::_getDouble:
512   case vmIntrinsics::_putReference:
513   case vmIntrinsics::_putBoolean:
514   case vmIntrinsics::_putByte:
515   case vmIntrinsics::_putShort:
516   case vmIntrinsics::_putChar:
517   case vmIntrinsics::_putInt:
518   case vmIntrinsics::_putLong:
519   case vmIntrinsics::_putFloat:
520   case vmIntrinsics::_putDouble:
521   case vmIntrinsics::_getReferenceVolatile:
522   case vmIntrinsics::_getBooleanVolatile:
523   case vmIntrinsics::_getByteVolatile:
524   case vmIntrinsics::_getShortVolatile:
525   case vmIntrinsics::_getCharVolatile:
526   case vmIntrinsics::_getIntVolatile:
527   case vmIntrinsics::_getLongVolatile:
528   case vmIntrinsics::_getFloatVolatile:
529   case vmIntrinsics::_getDoubleVolatile:
530   case vmIntrinsics::_putReferenceVolatile:
531   case vmIntrinsics::_putBooleanVolatile:
532   case vmIntrinsics::_putByteVolatile:
533   case vmIntrinsics::_putShortVolatile:
534   case vmIntrinsics::_putCharVolatile:
535   case vmIntrinsics::_putIntVolatile:
536   case vmIntrinsics::_putLongVolatile:
537   case vmIntrinsics::_putFloatVolatile:
538   case vmIntrinsics::_putDoubleVolatile:
539   case vmIntrinsics::_getReferenceAcquire:
540   case vmIntrinsics::_getBooleanAcquire:
541   case vmIntrinsics::_getByteAcquire:
542   case vmIntrinsics::_getShortAcquire:
543   case vmIntrinsics::_getCharAcquire:
544   case vmIntrinsics::_getIntAcquire:
545   case vmIntrinsics::_getLongAcquire:
546   case vmIntrinsics::_getFloatAcquire:
547   case vmIntrinsics::_getDoubleAcquire:
548   case vmIntrinsics::_putReferenceRelease:
549   case vmIntrinsics::_putBooleanRelease:
550   case vmIntrinsics::_putByteRelease:
551   case vmIntrinsics::_putShortRelease:
552   case vmIntrinsics::_putCharRelease:
553   case vmIntrinsics::_putIntRelease:
554   case vmIntrinsics::_putLongRelease:
555   case vmIntrinsics::_putFloatRelease:
556   case vmIntrinsics::_putDoubleRelease:
557   case vmIntrinsics::_getReferenceOpaque:
558   case vmIntrinsics::_getBooleanOpaque:
559   case vmIntrinsics::_getByteOpaque:
560   case vmIntrinsics::_getShortOpaque:
561   case vmIntrinsics::_getCharOpaque:
562   case vmIntrinsics::_getIntOpaque:
563   case vmIntrinsics::_getLongOpaque:
564   case vmIntrinsics::_getFloatOpaque:
565   case vmIntrinsics::_getDoubleOpaque:
566   case vmIntrinsics::_putReferenceOpaque:
567   case vmIntrinsics::_putBooleanOpaque:
568   case vmIntrinsics::_putByteOpaque:
569   case vmIntrinsics::_putShortOpaque:
570   case vmIntrinsics::_putCharOpaque:
571   case vmIntrinsics::_putIntOpaque:
572   case vmIntrinsics::_putLongOpaque:
573   case vmIntrinsics::_putFloatOpaque:
574   case vmIntrinsics::_putDoubleOpaque:
575   case vmIntrinsics::_getShortUnaligned:
576   case vmIntrinsics::_getCharUnaligned:
577   case vmIntrinsics::_getIntUnaligned:
578   case vmIntrinsics::_getLongUnaligned:
579   case vmIntrinsics::_putShortUnaligned:
580   case vmIntrinsics::_putCharUnaligned:
581   case vmIntrinsics::_putIntUnaligned:
582   case vmIntrinsics::_putLongUnaligned:
583   case vmIntrinsics::_loadFence:
584   case vmIntrinsics::_storeFence:
585   case vmIntrinsics::_fullFence:
586   case vmIntrinsics::_currentThread:
587 #ifdef JFR_HAVE_INTRINSICS
588   case vmIntrinsics::_counterTime:
589   case vmIntrinsics::_getClassId:
590   case vmIntrinsics::_getEventWriter:
591 #endif
592   case vmIntrinsics::_currentTimeMillis:
593   case vmIntrinsics::_nanoTime:
594   case vmIntrinsics::_allocateInstance:
595   case vmIntrinsics::_allocateUninitializedArray:
596   case vmIntrinsics::_newArray:
597   case vmIntrinsics::_getLength:
598   case vmIntrinsics::_copyOf:
599   case vmIntrinsics::_copyOfRange:
600   case vmIntrinsics::_clone:
601   case vmIntrinsics::_isAssignableFrom:
602   case vmIntrinsics::_isInstance:
603   case vmIntrinsics::_getModifiers:
604   case vmIntrinsics::_isInterface:
605   case vmIntrinsics::_isArray:
606   case vmIntrinsics::_isPrimitive:
607   case vmIntrinsics::_isHidden:
608   case vmIntrinsics::_getSuperclass:
609   case vmIntrinsics::_getClassAccessFlags:
610   case vmIntrinsics::_floatToRawIntBits:
611   case vmIntrinsics::_floatToIntBits:
612   case vmIntrinsics::_intBitsToFloat:
613   case vmIntrinsics::_doubleToRawLongBits:
614   case vmIntrinsics::_doubleToLongBits:
615   case vmIntrinsics::_longBitsToDouble:
616   case vmIntrinsics::_Reference_get:
617   case vmIntrinsics::_Reference_refersTo0:
618   case vmIntrinsics::_PhantomReference_refersTo0:
619   case vmIntrinsics::_Class_cast:
620   case vmIntrinsics::_aescrypt_encryptBlock:
621   case vmIntrinsics::_aescrypt_decryptBlock:
622   case vmIntrinsics::_cipherBlockChaining_encryptAESCrypt:
623   case vmIntrinsics::_cipherBlockChaining_decryptAESCrypt:
624   case vmIntrinsics::_electronicCodeBook_encryptAESCrypt:
625   case vmIntrinsics::_electronicCodeBook_decryptAESCrypt:
626   case vmIntrinsics::_counterMode_AESCrypt:
627   case vmIntrinsics::_md5_implCompress:
628   case vmIntrinsics::_sha_implCompress:
629   case vmIntrinsics::_sha2_implCompress:
630   case vmIntrinsics::_sha5_implCompress:
631   case vmIntrinsics::_sha3_implCompress:
632   case vmIntrinsics::_digestBase_implCompressMB:
633   case vmIntrinsics::_multiplyToLen:
634   case vmIntrinsics::_squareToLen:
635   case vmIntrinsics::_mulAdd:
636   case vmIntrinsics::_montgomeryMultiply:
637   case vmIntrinsics::_montgomerySquare:
638   case vmIntrinsics::_bigIntegerRightShiftWorker:
639   case vmIntrinsics::_bigIntegerLeftShiftWorker:
640   case vmIntrinsics::_vectorizedMismatch:
641   case vmIntrinsics::_ghash_processBlocks:
642   case vmIntrinsics::_base64_encodeBlock:
643   case vmIntrinsics::_base64_decodeBlock:
644   case vmIntrinsics::_updateCRC32:
645   case vmIntrinsics::_updateBytesCRC32:
646   case vmIntrinsics::_updateByteBufferCRC32:
647   case vmIntrinsics::_updateBytesCRC32C:
648   case vmIntrinsics::_updateDirectByteBufferCRC32C:
649   case vmIntrinsics::_updateBytesAdler32:
650   case vmIntrinsics::_updateByteBufferAdler32:
651   case vmIntrinsics::_profileBoolean:
652   case vmIntrinsics::_isCompileConstant:
653   case vmIntrinsics::_Preconditions_checkIndex:
654   case vmIntrinsics::_Preconditions_checkLongIndex:
655   case vmIntrinsics::_getObjectSize:
656     break;
657 
658   case vmIntrinsics::_VectorUnaryOp:
659   case vmIntrinsics::_VectorBinaryOp:
660   case vmIntrinsics::_VectorTernaryOp:
661   case vmIntrinsics::_VectorBroadcastCoerced:
662   case vmIntrinsics::_VectorShuffleIota:
663   case vmIntrinsics::_VectorShuffleToVector:
664   case vmIntrinsics::_VectorLoadOp:
665   case vmIntrinsics::_VectorStoreOp:
666   case vmIntrinsics::_VectorGatherOp:
667   case vmIntrinsics::_VectorScatterOp:
668   case vmIntrinsics::_VectorReductionCoerced:
669   case vmIntrinsics::_VectorTest:
670   case vmIntrinsics::_VectorBlend:
671   case vmIntrinsics::_VectorRearrange:
672   case vmIntrinsics::_VectorCompare:
673   case vmIntrinsics::_VectorBroadcastInt:
674   case vmIntrinsics::_VectorConvert:
675   case vmIntrinsics::_VectorInsert:
676   case vmIntrinsics::_VectorExtract:
677     return EnableVectorSupport;
678 
679   default:
680     return false;
681   }
682   return true;
683 }
684 
initial_code_buffer_size(int const_size)685 int C2Compiler::initial_code_buffer_size(int const_size) {
686   // See Compile::init_scratch_buffer_blob
687   int locs_size = sizeof(relocInfo) * PhaseOutput::MAX_locs_size;
688   int slop = 2 * CodeSection::end_slop(); // space between sections
689   return PhaseOutput::MAX_inst_size + PhaseOutput::MAX_stubs_size + const_size + slop + locs_size;
690 }
691