Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/compiler/il/J9MethodSymbol.cpp
6000 views
1
/*******************************************************************************
2
* Copyright (c) 2000, 2021 IBM Corp. and others
3
*
4
* This program and the accompanying materials are made available under
5
* the terms of the Eclipse Public License 2.0 which accompanies this
6
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
7
* or the Apache License, Version 2.0 which accompanies this distribution and
8
* is available at https://www.apache.org/licenses/LICENSE-2.0.
9
*
10
* This Source Code may also be made available under the following
11
* Secondary Licenses when the conditions for such availability set
12
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
13
* General Public License, version 2 with the GNU Classpath
14
* Exception [1] and GNU General Public License, version 2 with the
15
* OpenJDK Assembly Exception [2].
16
*
17
* [1] https://www.gnu.org/software/classpath/license.html
18
* [2] http://openjdk.java.net/legal/assembly-exception.html
19
*
20
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception
21
*******************************************************************************/
22
23
#include "compile/Compilation.hpp"
24
#include "env/TRMemory.hpp"
25
#include "il/DataTypes.hpp"
26
#include "il/MethodSymbol.hpp"
27
#include "infra/Assert.hpp"
28
#include "runtime/J9Runtime.hpp"
29
30
/**
31
* Return true if this method is pure ie no side-effects.
32
*
33
* Currently only runtime helpers and recognized methods can be true.
34
*/
35
bool
36
J9::MethodSymbol::isPureFunction()
37
{
38
switch(self()->getRecognizedMethod())
39
{
40
case TR::java_lang_Math_abs_I:
41
case TR::java_lang_Math_abs_L:
42
case TR::java_lang_Math_abs_F:
43
case TR::java_lang_Math_abs_D:
44
case TR::java_lang_Math_acos:
45
case TR::java_lang_Math_asin:
46
case TR::java_lang_Math_atan:
47
case TR::java_lang_Math_atan2:
48
case TR::java_lang_Math_cbrt:
49
case TR::java_lang_Math_ceil:
50
case TR::java_lang_Math_copySign_F:
51
case TR::java_lang_Math_copySign_D:
52
case TR::java_lang_Math_cos:
53
case TR::java_lang_Math_cosh:
54
case TR::java_lang_Math_exp:
55
case TR::java_lang_Math_expm1:
56
case TR::java_lang_Math_floor:
57
case TR::java_lang_Math_hypot:
58
case TR::java_lang_Math_IEEEremainder:
59
case TR::java_lang_Math_log:
60
case TR::java_lang_Math_log10:
61
case TR::java_lang_Math_log1p:
62
case TR::java_lang_Math_max_I:
63
case TR::java_lang_Math_max_L:
64
case TR::java_lang_Math_max_F:
65
case TR::java_lang_Math_max_D:
66
case TR::java_lang_Math_min_I:
67
case TR::java_lang_Math_min_L:
68
case TR::java_lang_Math_min_F:
69
case TR::java_lang_Math_min_D:
70
case TR::java_lang_Math_nextAfter_F:
71
case TR::java_lang_Math_nextAfter_D:
72
case TR::java_lang_Math_pow:
73
case TR::java_lang_Math_rint:
74
case TR::java_lang_Math_round_F:
75
case TR::java_lang_Math_round_D:
76
case TR::java_lang_Math_scalb_F:
77
case TR::java_lang_Math_scalb_D:
78
case TR::java_lang_Math_sin:
79
case TR::java_lang_Math_sinh:
80
case TR::java_lang_Math_sqrt:
81
case TR::java_lang_Math_tan:
82
case TR::java_lang_Math_tanh:
83
case TR::java_lang_ref_Reference_reachabilityFence:
84
case TR::java_lang_StrictMath_acos:
85
case TR::java_lang_StrictMath_asin:
86
case TR::java_lang_StrictMath_atan:
87
case TR::java_lang_StrictMath_atan2:
88
case TR::java_lang_StrictMath_cbrt:
89
case TR::java_lang_StrictMath_ceil:
90
case TR::java_lang_StrictMath_copySign_F:
91
case TR::java_lang_StrictMath_copySign_D:
92
case TR::java_lang_StrictMath_cos:
93
case TR::java_lang_StrictMath_cosh:
94
case TR::java_lang_StrictMath_exp:
95
case TR::java_lang_StrictMath_expm1:
96
case TR::java_lang_StrictMath_floor:
97
case TR::java_lang_StrictMath_hypot:
98
case TR::java_lang_StrictMath_IEEEremainder:
99
case TR::java_lang_StrictMath_log:
100
case TR::java_lang_StrictMath_log10:
101
case TR::java_lang_StrictMath_log1p:
102
case TR::java_lang_StrictMath_nextAfter_F:
103
case TR::java_lang_StrictMath_nextAfter_D:
104
case TR::java_lang_StrictMath_pow:
105
case TR::java_lang_StrictMath_random:
106
case TR::java_lang_StrictMath_round_F:
107
case TR::java_lang_StrictMath_round_D:
108
case TR::java_lang_StrictMath_scalb_F:
109
case TR::java_lang_StrictMath_scalb_D:
110
case TR::java_lang_StrictMath_rint:
111
case TR::java_lang_StrictMath_sin:
112
case TR::java_lang_StrictMath_sinh:
113
case TR::java_lang_StrictMath_sqrt:
114
case TR::java_lang_StrictMath_tan:
115
case TR::java_lang_StrictMath_tanh:
116
case TR::java_nio_Bits_keepAlive:
117
/*
118
case TR::java_math_BigDecimal_valueOf:
119
case TR::java_math_BigDecimal_add:
120
case TR::java_math_BigDecimal_subtract:
121
case TR::java_math_BigDecimal_multiply:
122
case TR::java_math_BigInteger_add:
123
case TR::java_math_BigInteger_subtract:
124
case TR::java_math_BigInteger_multiply:
125
*/
126
return true;
127
default:
128
return false;
129
}
130
return false;
131
}
132
133
/**
134
* Returns true if the function call will not yield to OSR point.
135
*
136
* An example of kind of function which can go in the list would be recognized calls with
137
* NOP calls or the one that are guaranteed to be inlined by codegenerator.
138
*/
139
bool
140
J9::MethodSymbol::functionCallDoesNotYieldOSR()
141
{
142
switch(self()->getRecognizedMethod())
143
{
144
case TR::java_lang_ref_Reference_reachabilityFence:
145
case TR::java_nio_Bits_keepAlive:
146
return true;
147
default:
148
return OMR::MethodSymbolConnector::functionCallDoesNotYieldOSR();
149
}
150
return false;
151
}
152
153
// Which recognized methods are known to have no valid null checks
154
//
155
static TR::RecognizedMethod canSkipNullChecks[] =
156
{
157
// NOTE!! add methods whose checks can be skipped by sov library to the beginning of the list (see stopMethod below)
158
TR::java_lang_invoke_FilterArgumentsHandle_invokeExact,
159
TR::java_lang_invoke_MethodHandle_undoCustomizationLogic,
160
TR::java_lang_invoke_CollectHandle_invokeExact,
161
TR::java_util_ArrayList_add,
162
TR::java_util_ArrayList_ensureCapacity,
163
TR::java_util_ArrayList_get,
164
#if JAVA_SPEC_VERSION < 17
165
TR::java_lang_String_trim,
166
TR::java_lang_String_replace,
167
TR::java_lang_String_charAt,
168
TR::java_lang_String_charAtInternal_I,
169
TR::java_lang_String_charAtInternal_IB,
170
TR::java_lang_String_hashCodeImplCompressed,
171
TR::java_lang_String_hashCodeImplDecompressed,
172
TR::java_lang_String_length,
173
TR::java_lang_String_lengthInternal,
174
//TR::java_lang_String_toLowerCase,
175
//TR::java_lang_String_toUpperCase,
176
//TR::java_lang_String_toLowerCaseCore,
177
//TR::java_lang_String_toUpperCaseCore,
178
TR::java_lang_String_equalsIgnoreCase,
179
TR::java_lang_String_indexOf_fast,
180
TR::java_lang_String_isCompressed,
181
TR::java_lang_String_coder,
182
TR::java_lang_String_isLatin1,
183
TR::java_lang_String_init_int_String_int_String_String,
184
TR::java_lang_String_init_int_int_char_boolean,
185
TR::java_lang_String_split_str_int,
186
#endif
187
TR::java_lang_StringBuffer_capacityInternal,
188
TR::java_lang_StringBuffer_lengthInternalUnsynchronized,
189
TR::java_lang_StringBuilder_capacityInternal,
190
TR::java_lang_StringBuilder_lengthInternal,
191
TR::java_lang_StringUTF16_charAt,
192
TR::java_lang_StringUTF16_checkIndex,
193
TR::java_lang_StringUTF16_length,
194
TR::java_util_Hashtable_clone,
195
TR::java_util_Hashtable_contains,
196
TR::java_util_HashtableHashEnumerator_hasMoreElements,
197
TR::java_util_HashtableHashEnumerator_nextElement,
198
TR::java_util_HashMap_resize,
199
TR::java_util_HashMapHashIterator_nextNode,
200
//TR::java_util_Vector_addElement,
201
TR::java_math_BigDecimal_longString1C,
202
TR::java_math_BigDecimal_longString2,
203
TR::java_util_EnumMap__nec_,
204
TR::java_util_TreeMapUnboundedValueIterator_next,
205
TR::java_util_TreeMapSubMap_setFirstKey,
206
TR::java_util_TreeMapSubMap_setLastKey,
207
TR::java_nio_Bits_getCharB,
208
TR::java_nio_Bits_getCharL,
209
TR::java_nio_Bits_getShortB,
210
TR::java_nio_Bits_getShortL,
211
TR::java_nio_Bits_getIntB,
212
TR::java_nio_Bits_getIntL,
213
TR::java_nio_Bits_getLongB,
214
TR::java_nio_Bits_getLongL,
215
TR::java_nio_HeapByteBuffer__get,
216
TR::java_nio_HeapByteBuffer_put,
217
TR::unknownMethod
218
};
219
220
bool
221
J9::MethodSymbol::safeToSkipNullChecks()
222
{
223
TR::RecognizedMethod methodId = self()->getRecognizedMethod();
224
if (methodId == TR::unknownMethod)
225
return false;
226
227
for (int i = 0; canSkipNullChecks[i] != TR::unknownMethod; ++i)
228
if (canSkipNullChecks[i] == methodId)
229
return true;
230
231
return false;
232
}
233
234
235
// Which recognized methods are known to have no valid bound checks
236
//
237
static TR::RecognizedMethod canSkipBoundChecks[] =
238
{
239
// NOTE!! add methods whose checks can be skipped by sov library to the beginning of the list (see stopMethod below)
240
//TR::java_util_ArrayList_add,
241
//TR::java_util_ArrayList_remove,
242
//TR::java_util_ArrayList_ensureCapacity,
243
//TR::java_util_ArrayList_get,
244
TR::java_lang_Character_toLowerCase,
245
TR::java_lang_invoke_FilterArgumentsHandle_invokeExact,
246
TR::java_lang_invoke_CollectHandle_invokeExact,
247
TR::java_lang_String_trim,
248
TR::java_lang_String_charAt,
249
TR::java_lang_String_charAtInternal_I,
250
TR::java_lang_String_charAtInternal_IB,
251
TR::java_lang_String_indexOf_String,
252
TR::java_lang_String_indexOf_String_int,
253
TR::java_lang_String_indexOf_native,
254
TR::java_lang_String_indexOf_fast,
255
TR::java_lang_String_replace,
256
TR::java_lang_String_compareTo,
257
TR::java_lang_String_lastIndexOf,
258
TR::java_lang_String_toLowerCase,
259
TR::java_lang_String_toUpperCase,
260
TR::java_lang_String_toLowerCaseCore,
261
TR::java_lang_String_toUpperCaseCore,
262
TR::java_lang_String_regionMatches,
263
TR::java_lang_String_regionMatches_bool,
264
TR::java_lang_String_regionMatchesInternal,
265
TR::java_lang_String_equalsIgnoreCase,
266
TR::java_lang_String_compareToIgnoreCase,
267
TR::java_lang_String_hashCodeImplCompressed,
268
TR::java_lang_String_hashCodeImplDecompressed,
269
TR::java_lang_String_unsafeCharAt,
270
TR::java_lang_String_split_str_int,
271
TR::java_lang_String_startsWith,
272
TR::java_lang_StringUTF16_compareCodePointCI,
273
TR::java_lang_StringUTF16_compareToCIImpl,
274
TR::java_lang_StringUTF16_compareValues,
275
TR::java_util_Hashtable_get,
276
TR::java_util_Hashtable_put,
277
TR::java_util_Hashtable_clone,
278
TR::java_util_Hashtable_rehash,
279
TR::java_util_Hashtable_remove,
280
TR::java_util_Hashtable_contains,
281
TR::java_util_Hashtable_getEntry,
282
TR::java_util_HashtableHashEnumerator_hasMoreElements,
283
TR::java_util_HashtableHashEnumerator_nextElement,
284
TR::java_util_HashMap_getNode,
285
TR::java_util_HashMap_resize,
286
//TR::java_util_HashMapHashIterator_nextNode, /* Unsafe if the Iterator is being incorrectly used (concurrent execution) */
287
TR::java_util_HashMapHashIterator_init, /* Safe because the object is only visible by one thread when init() is executing */
288
TR::java_util_EnumMap_put,
289
TR::java_util_EnumMap_typeCheck,
290
TR::java_util_EnumMap__init_,
291
TR::java_util_EnumMap__nec_,
292
TR::java_util_TreeMap_all,
293
TR::java_util_TreeMap_rbInsert,
294
TR::java_math_BigDecimal_longString1C,
295
TR::java_math_BigDecimal_longString2,
296
TR::java_util_TreeMapUnboundedValueIterator_next,
297
TR::java_util_TreeMapSubMap_setFirstKey,
298
TR::java_util_TreeMapSubMap_setLastKey,
299
TR::java_util_HashMap_get,
300
TR::java_util_HashMap_findNonNullKeyEntry,
301
TR::java_util_HashMap_putImpl,
302
TR::java_lang_String_init_int_String_int_String_String,
303
TR::java_lang_String_init_int_int_char_boolean,
304
TR::java_nio_Bits_getCharB,
305
TR::java_nio_Bits_getCharL,
306
TR::java_nio_Bits_getShortB,
307
TR::java_nio_Bits_getShortL,
308
TR::java_nio_Bits_getIntB,
309
TR::java_nio_Bits_getIntL,
310
TR::java_nio_Bits_getLongB,
311
TR::java_nio_Bits_getLongL,
312
TR::java_nio_HeapByteBuffer__get,
313
TR::java_nio_HeapByteBuffer_put,
314
TR::unknownMethod
315
};
316
317
bool
318
J9::MethodSymbol::safeToSkipBoundChecks()
319
{
320
TR::RecognizedMethod methodId = self()->getRecognizedMethod();
321
if (methodId == TR::unknownMethod)
322
return false;
323
324
for (int i = 0; canSkipBoundChecks[i] != TR::unknownMethod; ++i)
325
if (canSkipBoundChecks[i] == methodId)
326
return true;
327
328
return false;
329
}
330
331
// Which recognized methods are known to have no valid div checks
332
//
333
static TR::RecognizedMethod canSkipDivChecks[] =
334
{
335
TR::java_util_Hashtable_get,
336
TR::java_util_Hashtable_put,
337
TR::java_util_Hashtable_rehash,
338
TR::java_util_Hashtable_remove,
339
TR::java_util_Hashtable_getEntry,
340
TR::unknownMethod
341
};
342
343
bool
344
J9::MethodSymbol::safeToSkipDivChecks()
345
{
346
TR::RecognizedMethod methodId = self()->getRecognizedMethod();
347
if (methodId == TR::unknownMethod)
348
return false;
349
350
for (int i = 0; canSkipDivChecks[i] != TR::unknownMethod; ++i)
351
if (canSkipDivChecks[i] == methodId)
352
return true;
353
354
return false;
355
}
356
357
358
// Which recognized methods are known to have no valid checkcasts
359
//
360
static TR::RecognizedMethod canSkipCheckCasts[] =
361
{
362
TR::java_util_ArrayList_ensureCapacity,
363
TR::java_util_HashMap_resize,
364
TR::java_util_HashMapHashIterator_nextNode,
365
TR::java_util_Hashtable_clone,
366
TR::java_util_Hashtable_putAll,
367
TR::unknownMethod
368
};
369
370
bool
371
J9::MethodSymbol::safeToSkipCheckCasts()
372
{
373
TR::RecognizedMethod methodId = self()->getRecognizedMethod();
374
if (methodId == TR::unknownMethod)
375
return false;
376
377
for (int i = 0; canSkipCheckCasts[i] != TR::unknownMethod; ++i)
378
if (canSkipCheckCasts[i] == methodId)
379
return true;
380
381
return false;
382
}
383
384
385
// Which recognized methods are known to have no valid array store checks
386
//
387
static TR::RecognizedMethod canSkipArrayStoreChecks[] =
388
{
389
TR::java_lang_invoke_CollectHandle_invokeExact,
390
TR::java_util_ArrayList_add,
391
TR::java_util_ArrayList_ensureCapacity,
392
TR::java_util_ArrayList_get,
393
TR::java_util_ArrayList_remove,
394
TR::java_util_ArrayList_set,
395
TR::java_util_Hashtable_get,
396
TR::java_util_Hashtable_put,
397
TR::java_util_Hashtable_clone,
398
TR::java_util_Hashtable_putAll,
399
TR::java_util_Hashtable_rehash,
400
TR::java_util_Hashtable_remove,
401
TR::java_util_Hashtable_contains,
402
TR::java_util_Hashtable_getEntry,
403
TR::java_util_Hashtable_getEnumeration,
404
TR::java_util_Hashtable_elements,
405
TR::java_util_HashtableHashEnumerator_hasMoreElements,
406
TR::java_util_HashtableHashEnumerator_nextElement,
407
TR::java_util_HashMap_rehash,
408
TR::java_util_HashMap_analyzeMap,
409
TR::java_util_HashMap_calculateCapacity,
410
TR::java_util_HashMap_findNullKeyEntry,
411
TR::java_util_HashMap_get,
412
TR::java_util_HashMap_findNonNullKeyEntry,
413
TR::java_util_HashMap_putImpl,
414
TR::java_util_HashMap_resize,
415
TR::java_util_HashMapHashIterator_nextNode,
416
TR::java_util_Vector_addElement,
417
TR::java_util_Vector_contains,
418
TR::java_util_Vector_subList,
419
TR::java_util_TreeMap_rbInsert,
420
TR::java_util_TreeMapUnboundedValueIterator_next,
421
TR::java_util_TreeMapSubMap_setLastKey,
422
TR::java_util_TreeMapSubMap_setFirstKey,
423
TR::java_util_concurrent_ConcurrentHashMap_addCount,
424
TR::java_util_concurrent_ConcurrentHashMap_tryPresize,
425
TR::java_util_concurrent_ConcurrentHashMap_transfer,
426
TR::java_util_concurrent_ConcurrentHashMap_fullAddCount,
427
TR::java_util_concurrent_ConcurrentHashMap_helpTransfer,
428
TR::java_util_concurrent_ConcurrentHashMap_initTable,
429
TR::java_util_concurrent_ConcurrentHashMap_tabAt,
430
TR::java_util_concurrent_ConcurrentHashMap_casTabAt,
431
TR::java_util_concurrent_ConcurrentHashMap_setTabAt,
432
TR::java_util_concurrent_ConcurrentHashMap_TreeBin_lockRoot,
433
TR::java_util_concurrent_ConcurrentHashMap_TreeBin_contendedLock,
434
TR::java_util_concurrent_ConcurrentHashMap_TreeBin_find,
435
TR::java_util_TreeMap_all,
436
TR::java_util_EnumMap_put,
437
TR::java_util_EnumMap_typeCheck,
438
TR::java_util_EnumMap__init_,
439
TR::java_util_EnumMap__nec_,
440
TR::java_util_HashMap_all,
441
TR::java_util_ArrayList_all,
442
TR::java_util_Hashtable_all,
443
TR::java_util_concurrent_ConcurrentHashMap_all,
444
TR::java_util_Vector_all,
445
TR::unknownMethod
446
};
447
448
bool
449
J9::MethodSymbol::safeToSkipArrayStoreChecks()
450
{
451
TR::RecognizedMethod methodId = self()->getRecognizedMethod();
452
if (methodId == TR::unknownMethod)
453
return false;
454
455
for (int i = 0; canSkipArrayStoreChecks[i] != TR::unknownMethod; ++i)
456
if (canSkipArrayStoreChecks[i] == methodId)
457
return true;
458
459
return false;
460
}
461
462
463
// Which recognized methods are known to require no checking when lowering to TR::arraycopy
464
//
465
static TR::RecognizedMethod canSkipChecksOnArrayCopies[] =
466
{
467
// NOTE!! add methods whose checks can be skipped by sov library to the beginning of the list (see stopMethod below)
468
//TR::java_util_ArrayList_ensureCapacity,
469
//TR::java_util_ArrayList_remove, /* ArrayList is NOT synchronized and therefore it's unsafe to remove checks! */
470
TR::java_lang_Character_toLowerCase,
471
TR::java_lang_String_concat,
472
TR::java_lang_String_replace,
473
TR::java_lang_String_toLowerCase,
474
TR::java_lang_String_toUpperCase,
475
TR::java_lang_String_toLowerCaseCore,
476
TR::java_lang_String_toUpperCaseCore,
477
TR::java_lang_String_toCharArray,
478
TR::java_lang_StringBuffer_append,
479
TR::java_lang_StringBuffer_ensureCapacityImpl,
480
TR::java_lang_String_init_int_String_int_String_String,
481
TR::java_lang_String_init_int_int_char_boolean,
482
TR::java_util_HashMap_resize,
483
TR::java_util_HashMapHashIterator_nextNode,
484
TR::unknownMethod
485
};
486
487
// These are logically the same as the above (canSkipChecksOnArrayCopies).
488
// I've broken them out so that we can selectively disable this group
489
// with the TR_DisableExtraCopyOfOpts env var. If/when these prove to be safe
490
// they can be migrated into the main group.
491
static TR::RecognizedMethod extraCanSkipChecksOnArrayCopies[] =
492
{
493
TR::java_util_Arrays_copyOf_byte,
494
TR::java_util_Arrays_copyOf_short,
495
TR::java_util_Arrays_copyOf_char,
496
TR::java_util_Arrays_copyOf_boolean,
497
TR::java_util_Arrays_copyOf_int,
498
TR::java_util_Arrays_copyOf_long,
499
TR::java_util_Arrays_copyOf_float,
500
TR::java_util_Arrays_copyOf_double,
501
TR::java_util_Arrays_copyOf_Object1,
502
TR::unknownMethod
503
};
504
505
bool
506
J9::MethodSymbol::safeToSkipChecksOnArrayCopies()
507
{
508
TR::RecognizedMethod methodId = self()->getRecognizedMethod();
509
if (methodId == TR::unknownMethod)
510
return false;
511
512
for (int i = 0; canSkipChecksOnArrayCopies[i] != TR::unknownMethod; ++i)
513
if (canSkipChecksOnArrayCopies[i] == methodId)
514
return true;
515
516
static char *disableExtraCopyOfOpts=feGetEnv("TR_DisableExtraCopyOfOpts");
517
if (!disableExtraCopyOfOpts)
518
for (int i = 0; extraCanSkipChecksOnArrayCopies[i] != TR::unknownMethod; ++i)
519
if (extraCanSkipChecksOnArrayCopies[i] == methodId)
520
return true;
521
522
return false;
523
}
524
525
// Which recognized methods are known to not require zero initialization of arrays
526
//
527
static TR::RecognizedMethod canSkipZeroInitializationOnNewarrays[] =
528
{
529
TR::java_lang_Character_toLowerCase,
530
TR::java_lang_String_init,
531
TR::java_lang_String_init_int_int_char_boolean,
532
TR::java_lang_String_concat,
533
TR::java_lang_String_replace,
534
TR::java_lang_String_toCharArray,
535
TR::java_lang_String_toLowerCase,
536
//TR::java_lang_String_toUpperCase,
537
TR::java_lang_String_toLowerCaseCore,
538
//TR::java_lang_String_toUpperCaseCore,
539
TR::java_lang_String_split_str_int,
540
TR::java_math_BigDecimal_toString,
541
TR::java_lang_StringCoding_encode,
542
TR::java_lang_StringCoding_decode,
543
TR::java_lang_StringCoding_StringEncoder_encode,
544
TR::java_lang_StringCoding_StringDecoder_decode,
545
//TR::java_lang_StringBuilder_ensureCapacityImpl,
546
//TR::java_lang_StringBuffer_ensureCapacityImpl,
547
//TR::java_util_Arrays_copyOf,
548
TR::java_io_Writer_write_lStringII,
549
TR::java_io_Writer_write_I,
550
TR::java_util_regex_Matcher_init,
551
TR::java_util_regex_Matcher_usePattern,
552
TR::unknownMethod
553
};
554
555
556
bool
557
J9::MethodSymbol::safeToSkipZeroInitializationOnNewarrays()
558
{
559
TR::RecognizedMethod methodId = self()->getRecognizedMethod();
560
if (methodId == TR::unknownMethod)
561
return false;
562
563
for (int i = 0; canSkipZeroInitializationOnNewarrays[i] != TR::unknownMethod; ++i)
564
if (canSkipZeroInitializationOnNewarrays[i] == methodId)
565
return true;
566
567
return false;
568
}
569
570