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