@@ -164,7 +164,7 @@ void gc_sweep_sysimg(void);
164
164
165
165
166
166
// pools are 16376 bytes large (GC_POOL_SZ - GC_PAGE_OFFSET)
167
- static const int jl_gc_sizeclasses[JL_GC_N_POOLS ] = {
167
+ static const int jl_gc_sizeclasses[] = {
168
168
#ifdef _P64
169
169
8 ,
170
170
#elif defined(_CPU_ARM_) || defined(_CPU_PPC_)
@@ -197,6 +197,7 @@ static const int jl_gc_sizeclasses[JL_GC_N_POOLS] = {
197
197
// 15, 14, 13, 12, 11, 10, 9, 8, /pool
198
198
// 64, 32, 160, 64, 16, 64, 112, 128, bytes lost
199
199
};
200
+ static_assert (sizeof (jl_gc_sizeclasses) / sizeof(jl_gc_sizeclasses[0 ]) == JL_GC_N_POOLS, "");
200
201
201
202
STATIC_INLINE int jl_gc_alignment (size_t sz)
202
203
{
@@ -220,35 +221,31 @@ STATIC_INLINE int jl_gc_alignment(size_t sz)
220
221
}
221
222
JL_DLLEXPORT int jl_alignment (size_t sz);
222
223
223
- STATIC_INLINE int JL_CONST_FUNC jl_gc_szclass (size_t sz)
224
+ // the following table is computed from jl_gc_sizeclasses via the formula:
225
+ // [searchsortedfirst(TABLE, i) for i = 0:16:table[end]]
226
+ static const uint8_t szclass_table[] = {0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 , 16 , 17 , 18 , 19 , 20 , 20 , 21 , 21 , 22 , 22 , 23 , 23 , 23 , 24 , 24 , 24 , 25 , 25 , 25 , 26 , 26 , 27 , 27 , 27 , 28 , 28 , 28 , 29 , 29 , 29 , 29 , 30 , 30 , 30 , 30 , 30 , 31 , 31 , 31 , 31 , 31 , 32 , 32 , 32 , 32 , 32 , 32 , 32 , 33 , 33 , 33 , 33 , 33 , 34 , 34 , 34 , 34 , 34 , 35 , 35 , 35 , 35 , 35 , 36 , 36 , 36 , 36 , 36 , 36 , 36 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 37 , 38 , 38 , 38 , 38 , 38 , 38 , 38 , 38 , 38 , 39 , 39 , 39 , 39 , 39 , 39 , 39 , 39 , 39 , 39 , 39 , 40 , 40 , 40 , 40 , 40 , 40 , 40 , 40 , 40 , 40 , 40 , 40 , 40 , 40 };
227
+ static_assert (sizeof (szclass_table) == 128, "");
228
+
229
+ STATIC_INLINE uint8_t JL_CONST_FUNC jl_gc_szclass (unsigned sz)
224
230
{
231
+ assert (sz <= 2032 );
232
+ uint8_t klass = szclass_table[(sz + 15 ) / 16 ];
225
233
#ifdef _P64
226
- if (sz <= 8 )
234
+ if (sz <= 8 )
227
235
return 0 ;
228
236
const int N = 0 ;
229
237
#elif defined(_CPU_ARM_) || defined(_CPU_PPC_)
230
- if (sz <= 8 )
231
- return (sz + 3 ) / 4 - 1 ;
238
+ if (sz <= 8 )
239
+ return (sz >= 4 ? 1 : 0 ) ;
232
240
const int N = 1 ;
233
241
#else
234
- if (sz <= 12 )
235
- return (sz + 3 ) / 4 - 1 ;
242
+ if (sz <= 12 )
243
+ return (sz >= 8 ? 2 : (sz >= 4 ? 1 : 0 )) ;
236
244
const int N = 2 ;
237
245
#endif
238
- if (sz <= 256 )
239
- return (sz + 15 ) / 16 + N;
240
- if (sz <= 496 )
241
- return 16 - 16376 / 4 / LLT_ALIGN (sz, 16 * 4 ) + 16 + N;
242
- if (sz <= 1008 )
243
- return 16 - 16376 / 2 / LLT_ALIGN (sz, 16 * 2 ) + 24 + N;
244
- return 16 - 16376 / 1 / LLT_ALIGN (sz, 16 * 1 ) + 32 + N;
246
+ return klass + N;
245
247
}
246
248
247
- #ifdef __GNUC__
248
- # define jl_is_constexpr (e ) __builtin_constant_p(e)
249
- #else
250
- # define jl_is_constexpr (e ) (0 )
251
- #endif
252
249
#define JL_SMALL_BYTE_ALIGNMENT 16
253
250
#define JL_CACHE_BYTE_ALIGNMENT 64
254
251
// JL_HEAP_ALIGNMENT is the maximum alignment that the GC can provide
@@ -257,23 +254,17 @@ STATIC_INLINE int JL_CONST_FUNC jl_gc_szclass(size_t sz)
257
254
258
255
STATIC_INLINE jl_value_t *jl_gc_alloc_ (jl_ptls_t ptls, size_t sz, void *ty)
259
256
{
260
- const size_t allocsz = sz + sizeof (jl_taggedvalue_t );
261
- if (allocsz < sz) // overflow in adding offs, size was "negative"
262
- jl_throw (jl_memory_exception);
263
257
jl_value_t *v;
264
- if (allocsz <= GC_MAX_SZCLASS + sizeof (jl_taggedvalue_t )) {
258
+ const size_t allocsz = sz + sizeof (jl_taggedvalue_t );
259
+ if (sz <= GC_MAX_SZCLASS) {
265
260
int pool_id = jl_gc_szclass (allocsz);
266
261
jl_gc_pool_t *p = &ptls->heap .norm_pools [pool_id];
267
- int osize;
268
- if (jl_is_constexpr (allocsz)) {
269
- osize = jl_gc_sizeclasses[pool_id];
270
- }
271
- else {
272
- osize = p->osize ;
273
- }
262
+ int osize = jl_gc_sizeclasses[pool_id];
274
263
v = jl_gc_pool_alloc (ptls, (char *)p - (char *)ptls, osize);
275
264
}
276
265
else {
266
+ if (allocsz < sz) // overflow in adding offs, size was "negative"
267
+ jl_throw (jl_memory_exception);
277
268
v = jl_gc_big_alloc (ptls, allocsz);
278
269
}
279
270
jl_set_typeof (v, ty);
@@ -282,8 +273,9 @@ STATIC_INLINE jl_value_t *jl_gc_alloc_(jl_ptls_t ptls, size_t sz, void *ty)
282
273
JL_DLLEXPORT jl_value_t *jl_gc_alloc (jl_ptls_t ptls, size_t sz, void *ty);
283
274
// On GCC, only inline when sz is constant
284
275
#ifdef __GNUC__
285
- # define jl_gc_alloc (ptls, sz, ty ) \
286
- (__builtin_constant_p(sz) ? jl_gc_alloc_(ptls, sz, ty) : \
276
+ # define jl_gc_alloc (ptls, sz, ty ) \
277
+ (__builtin_constant_p(sz) ? \
278
+ jl_gc_alloc_ (ptls, sz, ty) : \
287
279
(jl_gc_alloc)(ptls, sz, ty))
288
280
#else
289
281
# define jl_gc_alloc (ptls, sz, ty ) jl_gc_alloc_(ptls, sz, ty)
0 commit comments